记一次MongoDB灾难恢复

TL;DR 参考官方文档:Reconfigure a Replica Set with Unavailable Members

在今天查看报告的时候,发现数据库的数据有异常,一开始还未是客户端的磁盘满了,登录客户端发现磁盘还有空间,但是日志说因为网络问题连不上MongoDB ReplicaSet。日志类似:

1
No replica set members match selector "Primary()", Timeout: 30s

网络超时就很奇怪,因为目前架构下Tailscale组的网不应该出现网络问题。于是登上一个MongoDB服务器,尝试使用MongoSh登录发现也提示超时。看日志如下:

1
"msg":"Not starting an election, since we are not electable","attr":{"reason":"Not standing for election because I cannot see a majority (mask 0x1)"}

目前ReplicaSet里面有4个节点,其中1个节点忘了续费,1个节点的提供商跑路了。这下难崩了😅,看来是主节点突然掉了,剩下活着的两个节点因为数量没超过集群节点数的一半,于是不知道咋办了。这时候还是可以MongoSh登录的,但是不能加replicaSet参数,否则连上的节点会尝试去找Primary,进而网络超时。

解决方案就是在活着的服务器上MongoSh登录集群管理员账户,但是不加replicaSet参数。登录后强制重新配置MongoDB ReplicaSet,删除失效节点即可。

Licensed under CC BY-SA 4.0