面试题答案
一键面试数据读写应对方式
- 读操作:
- 在网络分区期间,每个分片可能独立运行。如果客户端连接到某个分片,该分片在自己的分区内有数据副本,它可以继续为读请求提供服务,从本地副本读取数据。
- 但是,当网络分区修复后,可能需要进行数据一致性检查,以确保从不同分区读取的数据最终是一致的。
- 写操作:
- MongoDB 分片集群使用多数选举机制(majority voting)。在写操作时,只有当大多数分片确认写入成功,写操作才被认为是成功的。在网络分区情况下,如果某个分区内没有达到大多数分片的确认,写操作会失败。
- 例如,假设有 5 个分片副本,至少需要 3 个分片确认写入,写操作才成功。如果网络分区导致其中 2 个分片与其他 3 个分片隔离,那么在包含 3 个分片的分区内,写操作可以正常进行并成功,而在包含 2 个分片的分区内,写操作会失败。
集群状态管理
- 仲裁节点:仲裁节点(arbiter)在网络分区处理中起到重要作用。仲裁节点不存储数据,只参与选举。在网络分区时,仲裁节点可以帮助确定哪个分区拥有集群的多数成员,从而维持集群的一致性和可用性。
- 心跳检测:集群中的节点通过心跳机制互相监控状态。在网络分区时,心跳无法正常传递到其他分区的节点,节点会检测到网络异常。一旦检测到网络分区,节点会调整自己的行为,例如限制对分区外节点的操作,以避免数据不一致。
数据一致性维护
- 复制集同步:当网络分区修复后,不同分区的复制集会进行数据同步。落后的副本会从拥有最新数据的副本拉取数据,以达到数据一致性。
- 版本控制:MongoDB 使用内部的版本控制系统(如 oplog,操作日志)来记录所有的写操作。在网络分区修复后,通过对比 oplog 中的记录,来确保数据的正确同步和一致性。