原数据库:
192.168.1.101:27017 (主)
192.168.1.102:27017 (从)
192.168.1.103:27017 (仲裁)
新数据库:
192.168.2.101:27017
192.168.2.102:27017
192.168.2.103:27017(仲裁)
1.清空新数据库,加入原数据库集群作为隐藏从节点
在192.168.1.101执行:
rs.add("192.168.2.101:27017")
cfg= rs.conf()
cfg.members[3].priority = 0
cfg.members[3].hidden = true
rs.reconfig(cfg)
rs.add("192.168.2.102:27017")
cfg= rs.conf()
cfg.members[4].priority = 0
cfg.members[4].hidden = true
rs.reconfig(cfg)
- 数据同步完,从原环境集群中取消隐藏节点,移出集群
在192.168.1.101执行:
cfg= rs.conf()
cfg.members[3].priority = 1
cfg.members[3].hidden = false
rs.reconfig(cfg)
cfg= rs.conf()
cfg.members[4].priority = 1
cfg.members[4].hidden = false
rs.reconfig(cfg)
rs.remove("192.168.2.101:27017")
rs.remove("192.168.2.102:27017")"
- 新环境各节点,重新组建集群
在服务器192.168.2.101执行:
cfg= rs.conf()
cfg.members[0].host = "192.168.2.101:27017"
cfg.members[1].host = "192.168.2.102:27017"
cfg.members[2].host = "192.168.2.103:27017"
rs.reconfig(cfg,{"force":true})
为什么 cfg.members[2].host = "192.168.2.103:27017" 加进来就成为了仲裁节点?
因为 members[2] 就是 原数据库的仲裁节点的id,只是将其ip port 强制修改为了新数据库 ip port,属性不会变!
当然,你也可以显示指定节点角色为仲裁:
cfg= rs.conf()
cfg.members[0].host = "192.168.2.101:27017"
cfg.members[1].host = "192.168.2.102:27017"
cfg.members[2].host = "192.168.2.103:27017"
cfg.members[2].arbiterOnly = true
rs.reconfig(cfg,{"force":true})
一般地,不指定 member id 的方式添加仲裁节点的2种方式:
rs.addArb("host:port")
rs.add("host:port", "arbiterOnly": true)