面试题答案
一键面试快速定位问题
- 查看集群状态:使用
rs.status()
命令查看副本集状态(如果分片节点是副本集的一部分),该命令会显示每个成员的状态,包括是否是主节点、从节点或处于故障状态。 - 查看分片状态:执行
sh.status()
命令,这个命令能展示整个分片集群的状态,包括每个分片的状态,能快速发现哪个分片节点出现故障。 - 检查日志:在MongoDB Shell中,虽然不能直接查看日志,但可以通过服务器上的日志文件路径找到相应分片节点的日志文件(通常在配置文件指定的日志目录下),查看日志文件以获取详细的故障信息,如错误代码、异常堆栈等。
保证数据可用性和一致性的措施
- 自动故障转移(针对副本集分片节点):如果分片节点是副本集的一部分,MongoDB会自动进行故障转移,从节点会选举出新的主节点。在应用层面,只要连接字符串配置为副本集的形式(例如
mongodb://node1:port,node2:port,node3:port/?replicaSet=rsName
),应用程序无需额外操作,就能自动连接到新的主节点进行读写操作。 - 手动干预(非副本集情况或自动故障转移失败):如果不是副本集结构或者自动故障转移未成功,可能需要手动处理。可以尝试重启故障节点,如果是硬件问题则需要更换硬件。在等待节点恢复期间,为保证读操作的可用性,可以将读操作临时重定向到其他分片节点(如果数据分布允许),但这可能需要在应用层修改读取逻辑。对于写操作,可能需要暂停写操作直到故障节点恢复或新的节点替代它,以保证数据一致性。
故障恢复后验证数据完整性和集群正常运行状态
- 验证数据完整性:
- 使用
db.collection.validate()
:对每个集合执行db.collection.validate()
命令,它会检查集合的元数据和数据文件的一致性,验证索引是否正确等。例如db.users.validate()
。 - 对比数据量:在故障前后记录每个集合的数据量,恢复后再次统计数据量进行对比。可以使用
db.collection.countDocuments()
命令获取集合中的文档数量。例如,故障前记录db.products.countDocuments()
的结果,恢复后再次执行并对比。 - 检查复制状态:如果是副本集分片节点,使用
rs.status()
查看复制状态是否正常,确保主从节点的数据同步正常。
- 使用
- 验证集群正常运行状态:
- 再次查看集群状态:重新执行
sh.status()
命令,确认所有分片节点都处于正常状态,数据分布和分片配置正确。 - 进行读写测试:在集群上进行简单的读写操作,例如插入新文档、读取文档、更新文档等,确保操作都能正常完成,没有出现异常错误。
- 性能测试:进行一些性能测试,比如使用
db.collection.find().explain("executionStats")
查看查询性能,确保集群在故障恢复后性能没有明显下降。
- 再次查看集群状态:重新执行