面试题答案
一键面试不同writeConcern值对性能和数据一致性的影响
- writeConcern: {w: 1}
- 性能:性能最高,因为只要主节点确认写入成功,就返回成功响应给客户端,无需等待副本节点同步数据。在高并发写入场景下,能快速处理大量写入请求。
- 数据一致性:一致性相对较低。若主节点在数据同步到副本节点之前崩溃,可能导致数据丢失,因为客户端已收到写入成功的响应,但副本节点可能未同步该数据。
- writeConcern: {w: "majority"}
- 性能:性能适中。需要等待大多数节点(超过半数)确认写入成功才返回响应给客户端。这会增加写入操作的延迟,因为要等待副本节点同步数据。
- 数据一致性:一致性较高。多数节点确认写入成功,意味着即使主节点崩溃,选举新主节点时,新主节点也会包含这些已确认写入的数据,减少数据丢失的风险。
- writeConcern: {w: }
- 性能:性能较低,尤其是当
<number of replicas>
较大时。需要等待指定数量的副本节点确认写入成功才返回响应给客户端,这会极大增加写入操作的延迟。 - 数据一致性:一致性高,当指定数量的副本节点都确认写入成功,数据丢失的风险极低。
- 性能:性能较低,尤其是当
在高并发写入场景下平衡性能与数据一致性选择writeConcern
- 对数据一致性要求不高但追求高性能:
- 选择:writeConcern: {w: 1}。例如,在一些日志记录场景,少量数据丢失对整体业务影响不大,高并发写入时可选择此值以提高写入性能。
- 对数据一致性和性能都有一定要求:
- 选择:writeConcern: {w: "majority"}。如电商订单系统,既要保证在大多数情况下数据不丢失,又要能承受一定的高并发写入。此设置在保证较高一致性的同时,性能也相对可接受。
- 对数据一致性要求极高,可牺牲部分性能:
- 选择:writeConcern: {w: }。例如在金融交易场景,任何数据丢失都可能导致严重后果,即使高并发写入场景下延迟较高,也需保证数据一致性,此时可根据副本节点数量选择合适的
w
值。
- 选择:writeConcern: {w: }。例如在金融交易场景,任何数据丢失都可能导致严重后果,即使高并发写入场景下延迟较高,也需保证数据一致性,此时可根据副本节点数量选择合适的