面试题答案
一键面试1. 根据业务需求合理配置writeConcern
- 高可用性配置:
- 对于关键业务数据,可将
writeConcern
设置为{w: "majority"}
。这样能确保写入操作在大多数副本集成员上持久化,即使部分节点故障,数据仍可从多数存活节点恢复,保证高可用性。例如,在一个包含5个副本集成员的集群中,至少需要3个成员确认写入,写入才被视为成功。 - 如果希望更快的写入速度,但仍保证一定程度的可用性,可设置
w: 2
或w: 3
等,根据副本集成员数量和实际情况选择。这在一些非核心业务,且副本集成员相对稳定的场景下适用。
- 对于关键业务数据,可将
- 一致性配置:
- 若业务对数据一致性要求极高,除了
w: "majority"
,还可结合j: true
,即{w: "majority", j: true}
。这里j: true
表示写入操作需等待数据写入到持久化日志(journal)后才返回成功,进一步确保数据一致性。但这种配置会增加写入延迟。 - 对于一些实时性要求不高但一致性要求严格的报表生成等业务,可使用这种配置。
- 若业务对数据一致性要求极高,除了
- 性能配置:
- 对于性能敏感的业务,如日志记录等,可设置
writeConcern
为{w: 1}
。这种配置下,只要主节点确认写入成功,操作就返回成功,写入速度最快,但数据一致性和可用性保障相对较弱。
- 对于性能敏感的业务,如日志记录等,可设置
2. 网络分区故障时writeConcern配置调整
- 网络分区检测:首先要通过MongoDB自带的心跳机制和监控工具,如
mongosniff
、mtools
等,及时检测到网络分区的发生。 - 避免数据丢失或不一致的调整:
- 若检测到网络分区,且业务能容忍一定的写入延迟,可将
writeConcern
临时调整为更严格的配置,如从w: 1
调整为{w: "majority", j: true}
。这样在网络分区恢复后,数据的一致性和完整性更有保障。 - 如果网络分区期间,业务不能停止写入操作,且网络分区可能导致部分副本集成员失联,可根据网络分区情况估算存活的副本集成员数量,动态调整
w
值。例如,若预估有3个成员在同一网络分区内且可正常通信,可将w
设置为2 ,确保至少有2个存活节点确认写入,避免因写入到可能失联的节点而导致数据不一致或丢失。同时,待网络分区恢复后,再根据集群实际状态恢复到正常的writeConcern
配置。
- 若检测到网络分区,且业务能容忍一定的写入延迟,可将