写在前面

公司在云端环境自建了MongoDB分片集群,配置的时候没考虑网络流量等原因,配置中写的都是服务器公网地址,导致所有数据都从公网走,速度不如内网快,所以想将所有服务器地址都换成内网,并且公网可以通过MongS访问集群。

 这套方法可能不适用所有环境,替换过程中可能会出现无法连接数据库的情况,可以根据实际情况行更改,本文可做参考,需要提前配置好一台用于加入集群都服务器,并安装好和旧服务同样版本的MongoDB。

修改Config

首先找到Config的Master节点,然后登陆服务器将Config配置文件和key文件复制到新服务器,或者之前没有创建Config节点到服务器,然后启动新的Config节点

#在新节点创建配置文件、数据、日志存放的文件夹
mkdir -p /data/mongodb/{conf,log,data}
#在新节点创建数据存放目录
mkdir -p /data/mongodb/data/config
#从旧节点复制文件到新节点
scp config.conf root@newconfig:/data/mongodb/conf/
scp keyfile root@newconfig:/data/mongodb/conf
#启动新节点
mongod -f /data/mongodb/conf/config.conf
#配置文件内容
dbpath=/data/mongodb/data/config
logpath=/data/mongodb/log/config.log
port=27018
logappend=true
fork=true
#复制集名称
replSet=configs
#置参数为true
configsvr=true
#允许任意机器连接
bind_ip=0.0.0.0
auth=true
oplogSize=100
keyFile=/data/mongodb/conf/keyfile

接下来在config的Master节点登陆数据库,更改master为新节点

#在Master节点登陆
mongo --port 27018 -u root -p password --authenticationDatabase admin
#先将新节点加入到config中
rs.add("192.168.0.186:27018")
#然后查看config状态,当新节点变为SECONDARY状态以后,就可以进行切换了
rs.status()
#更改新节点变为PRIMARY,先查看当前PRIMARY的priority值
rs.config()
#然后修改新节点的priority值,要比当前PRIMARY的值高,假设当前PRIMARY的priority值为2
config=rs.config()
#修改为3比Master大就可以
config.members[3].priority=3 
#加载新配置
rs.reconfig(config)
#数组中的索引为新节点在数组中的位置,假如原来有3个config节点,那么新加入的节点就是第四个,那么
#他的数组下标(索引)就是3(从0开始计算),新节点priority值为3,比当前PRIMARY大,会被选为PRI#MARY
#查看新节点是否变为了PRIMARY
rs.status()
#状态说明/解释
STARTUP:刚加入到复制集中,配置还未加载
STARTUP2:配置已加载完,初始化状态
RECOVERING:正在恢复,不适用读
ARBITER: 仲裁者
DOWN:节点不可到达
UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构
REMOVED:移除复制集
ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态
FATAL:出错。查看日志grep “replSet FATAL”找出错原因,重新做同步
PRIMARY:主节点
SECONDARY:备份节点

如果新节点已经变为Master,那么就可以登陆新节点进行配置了

#首先在新节点登陆
mongo --port 27018 -u root -p password --authenticationDatabase admin
#查看当前各个节点信息
rs.status()
#接着移除所有配置为公网地址的节点
rs.remove("oldconfigIP:27018")
#所有节点都移除完成后,当前config信息中只有新节点一个,再将所有旧节点改为内网地址再加进来
rs.add("旧节点内网IP:27018")
#所有节点加入完成以后,当所有节点状态变为SECONDARY,那么地址替换完成,如果不需要有4个config节#点可以按照之前到方法更换Master以后,将新节点移除

修改副本集

Config修改完成以后,接下来就要修改副本集信息了,方法和修改Config访问一致,如果有多个副本集那么都要修改一遍,这里只展示修改其中一个副本集

还是先登陆副本集的Master,然后复制文件到新节点

#创建数据存储目录
mkdir -p /data/mongodb/data/shard
#复制配置文件
scp shard.conf root@newshard:/data/mongodb/conf/
#因为key文件我们之前已经复制完了,这里不再需要复制key文件,到新节点启动副本集即可
mongod -f /data/mongodb/conf/shard.conf
#配置文件内容
dbpath=/data/mongodb/data/shard 
logpath=/data/mongodb/log/shard.log 
port=27001 
logappend=true
fork=true
shardsvr=true
replSet=shard 
bind_ip=0.0.0.0
auth=true
oplogSize=100
keyFile=/data/mongodb/conf/keyfile

在shard的副本集Master节点登陆数据库,并修改配置信息

#登陆数据库
mongo --port 27001 -u root -p password --authenticationDatabase admin
#将新节点加入副本集
rs.add("192.168.0.186:27001")
#然后查看副本集状态,当新节点变为SECONDARY状态,就可以进行Master的切换了,查看当前Mater的pri#ority值,假设这里为2
config=rs.config()
#修改新节点priority值为3,索引(下标)值根据实际情况填写
config.members[3].priority=3
#加载新配置
rs.reconfig(config)
#查看副本集状态,新节点是否变为PRIMARY
rs.status()
#当新节点变为PRIMARY后登陆新节点并修改副本集配置

登陆新节点,然后修改信息

#登陆
mongo --port 27001 -u root -p password --authenticationDatabase admin
#移除所有地址是公网地址的旧副本集
rs.remove("oldshardIP:27001")
#所有旧即节点都移除后,就可以将旧节点地址替换为内网地址再加入副本集了
rs.add("newIP:27001")
#如果之前有仲裁者,也可以添加回来
rs.addArb("newArbIP:27001")
#所有信息更改完成以后查看附近状态,如果节点变为SECONDARY或ARBITER后,副本集信息就已经修改完成
#如果不需要副本集有4个节点,可以更改Master以后将新节点移除

这样Congfig和副本集都已经将信息替换完成了接下来新建一个Mongs(路由)节点即可

配置新Mongos

可以从旧Mongs复制文件过来,也可以自己写一个新的配置文件

#配置文件内容
logpath=/data/mongodb/log/mongos.log
logappend = true
port = 28017
fork = true
#所有config节点地址
configdb = configs/192.168.0.186:27018,192.168.0.135:27018,192.168.0.61:27018
maxConns=20000
bind_ip=0.0.0.0
keyFile=/data/mongodb/conf/keyfile

接着启动Mongs

#启动mongs
mongs -f /data/mongodb/conf/mongos.conf

然后配置副本集信息

#登陆mongs
mongo --port 28017 -u root -p password --authenticationDatabase admin
#添加副本集信息
sh.addShard("shard1/192.168.0.13:27001,192.168.0.186:27001,192.168.0.147:27001")
#开启数据库分片
sh.enableSharding("testdb")
#对副本集下对集合进行分片,user集合中的_id字段执行hash分片策略
sh.shardCollection("test.user",{"_id":"hashed"})

到次为止从config、副本集到mongs到信息都已经修改完成,用户只需要连接新节点都IP:28017就可以登陆数据了

mongodb://root:password@mongsIP:28017/?authSource=admin

更换过程中之前的连接可能会失效,一定要慎重,不要在生产环境轻易尝试,如果要修改的话那么在修改之前做好准备工作,最后再修改mongs,因为旧mongs里的信息还是可用的,一般不会影响,所有信息都修改完成以后,更改新mongs之后修改程序内连接地址为新地址就可以