面试题答案
一键面试从 sh.status()
输出信息预判故障点
- 分片状态:
- 分片节点失联:若在
shards
部分,某个分片的状态显示为MISSING
或者长时间处于DOWN
状态,这意味着该分片节点可能出现故障,比如网络问题、节点硬件故障等。例如,若shard1
的状态为MISSING
,说明与该分片的连接中断,可能是网络不通或者分片服务器进程崩溃。 - 分片不均衡:查看
data
字段下每个分片的数据量和块(chunk)数量。如果某一个分片的数据量或块数量远多于其他分片,可能导致该分片负载过高,未来可能出现性能问题甚至因资源耗尽而故障。例如,shard1
有 1000 个块,而shard2
和shard3
分别只有 100 个块,shard1
就存在负载过高风险。
- 分片节点失联:若在
- 复制集状态:
- 复制集成员异常:在
shards
下每个分片如果是复制集形式(如{ "_id" : "rs1", "members" : [ {...} ] }
),查看成员状态。若有成员状态为STARTUP2
且长时间未改变,可能是节点在初始化时遇到问题,如无法同步数据。若状态为DOWN
,则该成员节点可能已故障。例如,复制集rs1
的成员member2
状态为DOWN
,表明member2
节点出现故障。 - 主节点异常:注意复制集的主节点(
PRIMARY
)信息。若主节点频繁切换,可能是网络不稳定或者主节点本身存在性能问题,容易引发整个复制集的数据写入和同步异常。比如,短时间内rs1
的主节点从member1
切换到member3
又切换回member1
,这就是异常情况。
- 复制集成员异常:在
- 配置服务器状态:
- 配置服务器失联:在
configsvr
部分,若某个配置服务器的状态显示异常(如MISSING
),可能导致集群元数据管理出现问题。因为配置服务器存储了集群的关键元数据,如分片信息、块范围等。若cfg1
配置服务器失联,集群可能无法正确进行数据路由等操作。
- 配置服务器失联:在
故障发生后对故障恢复机制的关键作用
- 确定故障范围:
- 分片故障:通过
sh.status()
知道哪个分片出现故障后,运维人员可以直接定位到相关的分片节点。例如,如果shard2
故障,就可以针对shard2
的服务器硬件、网络连接、MongoDB 进程等进行排查和修复,避免在整个集群范围盲目排查。 - 复制集故障:明确复制集中哪个成员故障以及主节点状态异常等情况,有助于快速确定需要恢复的具体节点。如复制集
rs1
的member3
故障,就可以着重检查member3
服务器,同时考虑如何让复制集重新选举出稳定的主节点。 - 配置服务器故障:若发现某个配置服务器故障,可集中精力恢复该配置服务器,因为它对整个集群的元数据管理至关重要。恢复后,集群可以重新正确管理数据分片和路由。
- 分片故障:通过
- 数据修复与同步:
- 分片数据恢复:知道分片故障后,可以根据其他正常分片的数据以及复制集的同步机制来恢复故障分片的数据。例如,若
shard1
故障恢复后,它可以从其他分片获取缺失的数据块,重新进行数据同步,这依赖于sh.status()
提供的其他分片和块的分布信息。 - 复制集数据同步:对于复制集成员故障,恢复节点后,可依据
sh.status()
中复制集的配置信息和其他正常成员状态,重新建立同步关系。如member2
恢复后,根据sh.status()
中rs1
的配置,它可以从主节点或者其他同步状态良好的成员节点拉取数据,重新同步。
- 分片数据恢复:知道分片故障后,可以根据其他正常分片的数据以及复制集的同步机制来恢复故障分片的数据。例如,若
- 集群状态重建:
- 重新配置分片:如果因为分片故障导致集群数据分布不均衡,在故障恢复后,可以根据
sh.status()
提供的信息,手动进行数据均衡操作,重新配置分片,使集群恢复到正常的负载状态。 - 修复元数据:配置服务器故障恢复后,需要依据
sh.status()
中的元数据信息(如故障前的分片、块范围等)来修复和重新同步配置服务器之间的元数据,确保集群能够正确路由和管理数据。
- 重新配置分片:如果因为分片故障导致集群数据分布不均衡,在故障恢复后,可以根据