数据库
首页 > 数据库> > 【MongoDB】从复制集迁移到分片集群

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

作者:互联网

迁移的过程

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