面试题答案
一键面试MongoDB应对网络分区确保数据一致性的方式
- 心跳检测与感知:MongoDB各节点(分片、副本集成员等)通过定期发送心跳包来检测彼此的连接状态。一旦网络分区发生,心跳包无法正常传递,节点能迅速感知到与其他节点的失联情况。
- 副本集机制:在副本集中,主节点负责处理写操作,并将操作日志同步到从节点。网络分区时,若主节点与部分从节点失联,只要主节点所在分区包含大多数成员(通过投票机制确定),主节点仍能继续提供服务,新的写操作会在该分区内的成员间同步。而失联的从节点在网络恢复后,会通过oplog重放等方式追赶数据,确保与主节点的数据一致。
不同网络分区场景下的策略
部分分片失联
- 读写影响:读操作可能会受到影响,因为部分数据所在的分片失联,可能无法获取到完整数据。写操作方面,若失联分片包含参与写操作的节点(如副本集主节点在失联分片中),写操作可能失败;若写操作不涉及失联分片的数据,仍可正常进行。
- 应对策略:MongoDB会尝试重新建立与失联分片的连接。若短时间内无法恢复,会标记该分片为不可用状态,查询路由(mongos)在路由请求时会避开该分片。同时,集群会根据剩余可用分片的负载情况,动态调整数据分布和请求路由,以维持整体服务。当失联分片恢复后,会自动重新加入集群,并通过数据同步机制补齐缺失的数据。
仲裁节点失联
- 读写影响:仲裁节点主要用于副本集的选举决策,本身不存储数据。因此,仲裁节点失联通常不会直接影响读写操作。但如果副本集处于选举状态,仲裁节点失联可能会影响选举结果,进而间接影响写操作(因为主节点选举失败,无法确定写操作的接收者)。
- 应对策略:若仲裁节点失联,副本集在进行选举时,只要剩余成员能形成多数派,选举仍可正常进行。若因仲裁节点失联导致无法形成多数派,副本集可能会进入只读状态(防止数据不一致)。在网络恢复后,仲裁节点会重新加入副本集,参与后续的选举过程。