问题:测试机上有一台全部运行在本地的mongodb集群。由于网络变化。现在本机的ip发生改变。因此 原来配置的绝对ip地址全部不可用。需要迁移。
简单版
- 每个sharding如果是replica set那么需要重新设置replica set的配置信息到新的ip地址。
- 停止rs的所有副本。
- 以standalone模式启动其中一个副本,修改rs.conf
- 重复以上操作到其他所有副本
- 重新以rs模式启动所有副本。查看rs的状态确认正确。
- 修改config server的meta信息为正确的ip地址。
- 连接到config server 修改 config数据库下 shards集合里的关于sharding的地址为正确的地址。
- 重启 mongos 和 config server。
详细版
原有配置
- mongos实例 x1:运行在192.168.6.81:20202
- config server实例 x3:运行在192.168.6.81:36000, 192.168.6.81:36001, 192.168.6.81:36002
- 三副本replica set实例 x2: 分别运行在 sh0/192.168.6.81:23000,192.168.6.81:23001,192.168.6.81:23002 和 sh1/192.168.6.81:24000,192.168.6.81:24001,192.168.6.81:24002
- replica set sh0和sh1已经添加为mongos的两个分片
现在由于路由器配置改变,192.168.6.81这台测试机所在的子网不再可达,因此需要配置此机器的静态IP到新的网段,192.168.1.81。于是原来的mongodb的集群变得不再可用,需要进行迁移。
注意,mongodb要求在配置replica set和sharding时不能使用localhost或127.0.0.1这样的本地环回地址。因此之前虽然所有集群实例都运行在同一台机器上,但是不能用本地环回IP,导致本机IP改变后需要迁移。
0. 停止所有mongodb集群的实例
1. 修改本机IP
打开配置文件修改IP和网关
2. 修改replica set的配置
- 以standalone模式运行sh0的其中一个副本
mongod --dbpath sh0-rs0 --port 33333 - 用mongodb客户端mongo 连接到这个实例
mongo --port 33333 - 修改replica set的配置信息, replica set的信息都保存在local数据库的system.replset集合中。
123456use localcfg = db.system.replset.findOne({_id: 'sh0'})cfg.member[0].host = "192.168.1.81:23000"cfg.member[1].host = "192.168.1.81:23001"cfg.member[2].host = "192.168.1.81:23002"db.system.replset.update({_id: 'sh0'}, cfg)
- 停止该mongod实例。
- 对sh0的另外两个副本重复2.1到2.4的操作。
- 对sh1的三个副本重复2.1到2.4的操作,注意replica set的名字为sh1,端口对应为24000,24001,24002。
1234567mongod --dbpath sh1-rs0 --port 33333mongo --port 33333use localcfg = db.system.replset.findOne({_id: 'sh1'})cfg.member[0].host = "192.168.1.81:24000"cfg.member[1].host = "192.168.1.81:24001"cfg.member[2].host = "192.168.1.81:24002"db.system.replset.update({_id: 'sh1'}, cfg)
3. 重新以replica set模式启动两个副本集sh0 和sh1
此时两个副本集应该已经正常运作,用mongo cli连接后使用命令rs.status()可以查看到状态如下:
4. 修改config server的meta信息使得mongos能正确找到后端的mongod实例。
- 停止之前已经修正并启动的replica set实例。
- 正常启动第一个config server, 配置如下
- 用cli连接上这台config server实例
mongo --port 36000 - 修改分片的meta信息
1234567use configcfg = db.shards.findOne({_id: 'sh0'})cfg.host = "sh0/1921.168.1.81:23000,192.168.1.81:23001,192.168.1.81:23002"db.shards.update({_id: 'sh0'}, cfg)cfg = db.shards.findOne({_id: 'sh1'})cfg.host = "sh1/1921.168.1.81:24000,192.168.1.81:24001,192.168.1.81:24002"db.shards.update({_id: 'sh1'}, cfg)
- 重启config server
- 用上述config server的数据文件到替换另外两个config server的原来的数据文件。
1234rm -r config1rm -r config2cp -r config0 config1cp -r config0 config2
- 启动两个分片副本集sh0, sh1
- 启动剩下两个config server, config1, config2。
5. 修改mongos的启动配置文件,设置正确的config server地址。
6. 启动mongos,此时集群应该已经能正确工作了。
如果出现提示config server无法确认的问题。尝试再次重启config server和mongos。
参考资料
- 改变replica set主机地址:https://docs.mongodb.com/v2.6/tutorial/change-hostnames-in-a-replica-set/
- 迁移config server:https://docs.mongodb.com/v2.6/tutorial/migrate-config-servers-with-different-hostnames/
(转载本站文章请注明作者和出处 程序员的自我修养 – SelfUp.cn ,请勿用于任何商业用途)
what do i tell doctor to get viagra. edhelprie.mdhelpserv.com - how long we can take viagra,