环境
mongodb 二进制部署3节点分片集群,有一个节点系统盘损坏了无法修复,需要移除离线节点并重新添加新节点。
步骤
检查当前集群状态
连接到mongos
mongo --host 1.2.3.4 --port 30001
// 检查分片状态
sh.status()
// 检查配置服务器状态
use config
db.shards.find()
db.databases.find()
// 检查状态
db.adminCommand({listShards: 1})




移除mongod故障节点
连接到mongod的PRIMARY节点。
mongo --host 1.2.3.4 --port 30002
// 确认状态
rs.status()
// 强制移除故障节点
rs.remove("1.2.3.1:30002")
// 如果上述命令失败,使用reconfig强制移除
cfg = rs.conf()
cfg.members = cfg.members.filter(function(member) {
return member.host != "1.2.3.1:30002"
})
rs.reconfig(cfg, {force: true})





准备新节点
在新节点上创建目录,根据实际部署情况拷贝配置文件:
mkdir -p /home/mongodb/data/config/{data,log,pid}
mkdir -p /home/mongodb/data/mongos/{data,log,pid}
mkdir -p /home/mongodb/data/share_rs/{share1,share2,share3}/{data,log,pid}
cd /home/mongodb/data/config
scp mongod.yaml 1.2.3.5:/home/mongodb/data/config
cd /home/mongodb/data/mongos
scp mongos.yaml 1.2.3.5:/home/mongodb/data/mongos
cd /home/mongodb/data/share_rs/share1
scp shard.yaml 1.2.3.5:/home/mongodb/data/share_rs/share1
cd /home/mongodb/data/share_rs/share2
scp shard.yaml 1.2.3.5:/home/mongodb/data/share_rs/share1
cd /home/mongodb/data/share_rs/share3
scp shard.yaml 1.2.3.5:/home/mongodb/data/share_rs/share1
cd /home/mongodb
scp testKeyFile.file 1.2.3.5:/home/mongodb
修改mongod.yaml中的ip地址为1.2.3.5:

修改mongos.yaml中的ip地址为1.2.3.5:

修改3个shard.yaml中的ip地址为1.2.3.5:

启动新mongodb
添加环境变量:
export PATH=/home/mongodb/mongodb-4.4.15/bin:$PATH
echo "PATH=/home/mongodb/mongodb-4.4.15/bin:$PATH" >> /etc/profile
source /etc/profile

启动shard:
mongod -f /home/mongodb/data/share_rs/share1/shard.yaml
mongod -f /home/mongodb/data/share_rs/share2/shard.yaml
mongod -f /home/mongodb/data/share_rs/share3/shard.yaml

启动mongos:
mongos -f /home/mongodb/data/mongos/mongos.yaml

启动mongod:
mongod -f /home/mongodb/data/config/mongod.yaml


添加mongod新节点
mongo --host 1.2.3.4 --port 30002
// 添加新节点到配置服务器副本集
rs.add("1.2.3.5:30002")
// 等待数据同步完成
rs.status()
// 确认新节点状态
db.isMaster()



移除shard离线节点
连接分片PRIMARY节点:
mongo --host 1.2.3.4 --port 30011
// 检查分片状态
rs.status()
// 移除故障的节点(根据实际分片端口)
rs.remove("1.2.3.1:30011")
rs.remove("1.2.3.1:40011")
rs.remove("1.2.3.1:50011")
// 添加新节点到分片集群
rs.add("1.2.3.5:30011")
rs.add("1.2.3.5:40011")
rs.add("1.2.3.5:50011")
// 等待数据同步
rs.status()



等待状态变为SECONDARY


另外两个shard也需要做同样的操作。如果执行remove卡住,需要执行下面的命令删除节点。
cfg = rs.conf()
cfg.members = cfg.members.filter(m => !m.host.includes("1.2.3.1"))
rs.reconfig(cfg, {force: true})
重启其他节点mongos
修改mongos配置中集群ip为新节点ip,重启服务。
vim /home/mongodb/data/mongos/mongos.yaml
pkill -f mongos
ps aux |grep mongo
mongos -f /home/mongodb/data/mongos/mongos.yaml

检查集群状态
mongo --host 1.2.3.4 --port 30001
sh.status()

集群恢复正常,数据正常读取写入。