面试题答案
一键面试1. 评估现状
- 确定故障节点:通过MongoDB的日志、监控工具或管理命令(如
rs.status()
)明确仲裁节点和数据成员故障情况。 - 检查数据完整性:对于存活的数据成员,使用
db.repairDatabase()
等命令检查数据一致性和完整性。若数据成员故障前有未同步的oplog,需考虑数据恢复策略。
2. 恢复故障数据成员
- 数据恢复:如果故障数据成员的存储设备未损坏,尝试重启该节点。启动时,MongoDB会尝试从本地数据文件恢复,并通过oplog与其他成员同步数据。
- 重新加入副本集:若重启后无法自动加入副本集,使用
rs.add()
命令将其重新添加到副本集中。例如:rs.add("hostname:port")
,确保该节点网络可连通且配置正确。
3. 处理仲裁节点失效
- 选择新仲裁节点:选择一个新的服务器作为仲裁节点,该节点硬件资源应满足基本要求且网络稳定。
- 添加仲裁节点:在副本集的主节点上执行
rs.addArb("newArbiterHostname:port")
命令,将新仲裁节点添加到副本集。
4. 应对可能的网络分区
- 监控网络:使用网络监控工具实时监测网络状态,确保副本集成员之间网络畅通。
- 配置网络分区感知:在MongoDB 3.6及以上版本,可以通过配置
settings.networkInterface.restorable
选项来增强对网络分区的恢复能力。若出现网络分区,MongoDB会在网络恢复后自动尝试重新同步数据和恢复副本集状态。
5. 验证副本集状态
- 使用rs.status():执行
rs.status()
命令,确保所有成员状态正常,主节点已正确选举产生,数据同步正常进行。 - 测试读写操作:在应用层面进行简单的读写测试,确保副本集能正常提供服务,数据读写一致性得到保障。