故障案例,mongo副本集主节频繁切换

本文分析了一起MongoDB副本集主节点频繁切换的故障案例,错误日志显示因pthread_create失败导致连接关闭。经过排查,发现是由于CentOS系统中非root用户进程数量限制为1024,而MongoDB配置的连接数远超此值。调整系统配置,增加非root用户的最大进程数后,问题得到解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接到个case,mongod版本为2.4,三个节点组成高可用,发现经常频繁地切换,错误信息如下

Mon Mar  7 14:29:15.379 [initandlisten] pthread_create failed: errno:11 Resource temporarily unavailable
Mon Mar  7 14:29:15.379 [initandlisten] can't create new thread, closing connection
Mon Mar  7 14:29:15.381 [initandlisten] connection accepted from 10.10.14.71:41282 #1801013 (973 connections now open)
Mon Mar  7 14:29:15.381 [initandlisten] pthread_create failed: errno:11 Resource temporarily unavailable
Mon Mar  7 14:29:15.381 [initandlisten] can't create new thread, closing connection
Mon Mar  7 14:29:15.383 [initandlisten] connection accepted from 10.10.14.71:41270 #1801014 (973 connections now open)
Mon Mar  7 14:29:15.383 [initandlisten] pthread_create failed: errno:11 Resource temporarily unavailable
Mon Mar  7 14:29:15.383 [initandlisten] can't create new thread, closing connection
Mon Mar  7 14:29:15.385 [initandlisten] connection accepted

### MongoDB 副本故障切换时的选规则 MongoDB副本的设计目标之一是在发生故障时能够快速恢复服务并维持系统的高可用性。当点(Primary)不可用时,剩余的副点(Secondary)会通过选举机制选出一个新的点[^4]。 #### 1. **选举触发条件** 选举通常发生在当前点变得不可达的情况下。具体来说,如果某个 Secondary 点检测到 Primary 已经超过预设的心跳超时时间未响应,则该 Secondary 将发起一次新的选举请求[^3]。 #### 2. **候选资格** 并非所有 Secondary 都能成为新点的候选人。只有满足以下条件的 Secondary 才有资格参与选举: - 它们必须是最新的(up-to-date),即它们已经成功同步了来自原点的日志记录。 - 如果某些 Secondary 的日志滞后较多,则这些点可能被排除在外[^4]。 #### 3. **优先级设置** 管理员可以在配置文件中为每个点定义 `priority` 参数,用于影响其在选举中的竞争力。具有更高 priority 值的点更有可能当选为点。需要注意的是,即使某点拥有较高的优先级,但如果它的数据状态不够最新,仍然不会被选作点[^4]。 #### 4. **投票流程** 一旦进入选举阶段,各符合条件的 Secondary 开始互相发送心跳包以收其他成员的状态信息,并基于此决定谁应该成为下一个 leader 。整个过程中涉及到多个回合的协商直到达成共识为止[^4]。 #### 5. **最终裁定** 假设存在平局情况下的特殊处理方式——比如两个或更多具备同等条件的竞争者之间如何打破僵局?此时系统可能会依据内部算法随机挑选其中之一作为胜出方;另外还有一种情形就是引入仲裁者(Arbiter),虽然它本身并不保存任何实际的数据副本但却可以参与到关键性的表决环当中去帮助确定最后的结果。 ```python # 示例代码展示如何查看当前副本中各个成员的角色及其属性 from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') config = client.admin.command({"replSetGetStatus": 1}) for member in config['members']: print(f"Member ID:{member['_id']}, State:{member['stateStr']}, Priority:{member.get('priority', 'N/A')}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值