ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【MongoDB】从复制集迁移到分片集群

2022-06-05 14:33:27  阅读:194  来源: 互联网

标签:mongod 副本 admin MongoDB db 集群 MongoS 分片 节点


迁移的过程

1.为Confiugure Server初始化最少包含三个节点的副本集(另一个成员可以作为隐藏节点用于备份中)。

2.现有副本集执行必要的操作系统、硬件和磁盘级别的调优。

3.在mongod配置文件中为Config服务器设置适当的 clusterRole。

4.为查询路由器(MongoS)创建至少两个节点。

5.在mongos配置文件中设置适当的configDB参数。

6.从上面重复步骤2对现有副本集进行调优。

7.在Config server和MongoS的所有新配置的节点上配置适当的SELinux策略。

8.以滚动方式将clusterRole参数添加到现有副本集节点中。

9.将所有用户从副本集中复制到任何MongoS。

10.连接到任何MongoS并将现有的副本集添加为Shard。

注意:

在完成shard key之前,不要在任何数据库上启用shding。如果最终确定后,我们就可以启用分片。

 

详细的迁移计划

现在假设副本集有三个节点(一主两从)。

1.为Config Server初始化创建三个节点的副本集

2.在Config Server的配置文件中,添加参数clusterRole:confgsvr和port:27019

3.如果开启了selinux,需要为dbPath、keyFile、日志文件等配置selinux策略

sudo semanage fcontext -a -t mongod_var_lib_t '/dbPath/mongod.*'

sudo chcon -Rv -u system_u -t mongod_var_lib_t '/dbPath/mongod'

sudo restorecon -R -v '/dbPath/mongod'

sudo semanage fcontext -a -t mongod_log_t '/logPath/log.*'

sudo chcon -Rv -u system_u -t mongod_log_t '/logPath/log'

sudo restorecon -R -v '/logPath/log'

sudo semanage port -a -t mongod_port_t -p tcp 27019

  

 

启动所有的Config Server mongodb实例,连接到其中任何一个节点。创建临时用户并初始化副本集。

> use admin

> rs.initiate()

> db.createUser( { user: "tempUser", pwd: "<password>", roles:[{role: "root" , db:"admin"}]})

  

创建一个角色anyResource,action是anyAction,并将其授权给tempUser:

>db.getSiblingDB("admin").createRole({ "role": "pbmAnyAction",
 
      "privileges": [
 
         { "resource": { "anyResource": true },
 
           "actions": [ "anyAction" ]
 
         }
 
      ],
 
      "roles": []
 
   });
 
> 
 
>db.grantRolesToUser( "tempUser", [{role: "pbmAnyAction", db: "admin"}]  )
 
> rs.add("config_host[2-3]:27019")

  

至此,Config Server副本集创建完成。接下来就是部署查询路由了(MongoS):

1.为MongoS创建两个实例,并调优。

2.在mongos的配置文件中,调整configDB参数,只包含非隐藏的Config Server节点。

3.应用selinux策略

4.在副本集节点的mongod.conf文件中添加以下参数。确保服务是以滚动的方式启动的。比如,即从辅助节点开始,然后降级现有的主节点并使用端口27018重新启动它。

clusterRole: shardsvr

  

登录到任意一个MongoS,使用tempUser验证身份,将已经存在的副本集添加成分片

> sh.addShard( "replicaSetName/<URI of the replica set>") //Provide URI of the replica set

确认:

> sh.status() or db.getSiblingDB("config")['shards'].find()

  

连接到副本集的主节点,备份所有用户和角色,

> var mongos = new Mongo("mongodb://put MongoS URI string here/admin?authSource=admin") //Provide the URI of the MongoS with tempUser for authentication/authorization.
 
>db.getSiblingDB("admin").system.roles.find().forEach(function(d) {
 
mongos.getDB('admin').getCollection('system.roles').insert(d)});
 
>db.getSiblingDB("admin").system.users.find().forEach(function(d) { mongos.getDB('admin').getCollection('system.users').insert(d)});

 

1.连接到所有MongoS,并验证已经拷贝了所有用户

2.如果数据的shardkey已经完成,就对数据库分片

对数据库分片:

>sh.enableSharding("<db>")

  

使用基于hash的分片键对集合做分片:

>sh.shardCollection("<db>.<coll1>", { <shard key field> : "hashed" } )

  

使用基于范围的分片键对集合做分片:

>sh.shardCollection("<db>.<coll1>", { <shard key field> : 1, ... } )

  

 

标签:mongod,副本,admin,MongoDB,db,集群,MongoS,分片,节点
来源: https://www.cnblogs.com/abclife/p/16341087.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有