面试题答案
一键面试- 快速定位问题:
- 查看分片状态:
该命令会显示整个分片集群的状态,包括各个分片的信息、chunk的分布等。如果某个分片节点故障,这里会显示该分片处于异常状态,例如可能会有类似“not reachable”等提示,从而定位出故障的分片节点。sh.status()
- 查看节点日志:虽然是通过MongoDB Shell,但可以通过登录到故障分片节点所在的服务器,查看MongoDB的日志文件(通常位于
/var/log/mongodb/mongod.log
等路径,具体路径取决于安装配置),日志中会记录节点故障相关的详细信息,如网络错误、磁盘问题等。
- 查看分片状态:
- 恢复数据读写操作:
- 等待自动故障转移(如果启用了副本集):如果故障的分片节点是副本集的一部分,MongoDB的副本集机制会自动进行故障检测和故障转移。主节点故障后,副本集会选举新的主节点。在此期间,应用程序可能会有短暂的读写中断,但选举完成后,数据读写应该可以恢复正常。可以通过再次执行
sh.status()
命令,查看故障分片的状态是否恢复正常。 - 手动干预(极端情况):如果自动故障转移没有成功,且确定故障节点无法恢复,在确认数据备份等情况后,可以考虑从副本集中移除故障节点,然后重新添加新的节点。
- 移除故障节点(假设故障节点是副本集成员,且副本集名为
rs0
):rs0.remove("<故障节点的主机名:端口>")
- 添加新节点:
rs0.add("<新节点的主机名:端口>")
- 移除故障节点(假设故障节点是副本集成员,且副本集名为
- 等待自动故障转移(如果启用了副本集):如果故障的分片节点是副本集的一部分,MongoDB的副本集机制会自动进行故障检测和故障转移。主节点故障后,副本集会选举新的主节点。在此期间,应用程序可能会有短暂的读写中断,但选举完成后,数据读写应该可以恢复正常。可以通过再次执行
- 验证数据完整性:
- 使用
db.checkIntegrity()
:对于每个数据库中的每个集合,可以执行db.<集合名>.checkIntegrity()
命令。例如,对于数据库test
中的集合users
:
该命令会检查集合的结构和数据的一致性,如果有错误会返回详细的错误信息。use test db.users.checkIntegrity()
- 数据计数一致性:在故障前记录每个集合的数据条数,故障恢复后再次统计。例如:
use test // 故障前 var preCount = db.users.countDocuments() // 故障恢复后 var postCount = db.users.countDocuments() if (preCount === postCount) { print("数据条数一致") } else { print("数据条数不一致") }
- 使用
- 验证集群健康状态:
- 再次执行
sh.status()
:确保所有分片节点状态正常,chunk分布合理。如果某个分片节点仍处于异常状态,需要进一步排查原因。 - 检查副本集状态:对于每个分片副本集,执行
rs.status()
命令,查看副本集成员状态,确保所有成员正常运行,且主从节点角色正确。例如,对于名为rs0
的副本集:rs0.status()
- 检查集群的读写性能:可以通过执行一些简单的读写操作,观察响应时间等指标。例如,插入一条测试数据并查询:
use test db.test.insertOne({test: "data"}) var result = db.test.findOne({test: "data"}) if (result) { print("读写测试成功") } else { print("读写测试失败") }
- 再次执行