面试题答案
一键面试常见取值及含义
- w:1
- 含义:这是默认的写关注级别。表示在确认写操作成功之前,MongoDB只需确保写入操作在主节点上完成。只要主节点确认已收到并处理了写操作,就会向客户端返回成功响应,而不等待任何副本集成员的确认。
- 示例:假设我们在一个副本集环境下执行插入操作,当设置
writeConcern: {w: 1}
时,主节点一旦将数据插入自己的存储中,就会告知客户端插入成功,即使此时副本节点还未同步到这条新数据。
- w:majority
- 含义:要求写操作必须在大多数副本集成员(超过一半的副本集节点,不包括仲裁节点)上成功完成,MongoDB才会向客户端返回成功响应。这确保了数据的强一致性,因为多数节点拥有相同的数据副本,即使主节点发生故障,新选举出的主节点也能保证数据的完整性。
- 示例:在一个由5个节点(4个数据节点和1个仲裁节点)组成的副本集中,多数节点为3个(4 / 2 + 1)。当设置
writeConcern: {w: majority}
进行写操作时,必须有3个数据节点成功写入数据,MongoDB才会向客户端确认写操作成功。
- w:N(N为具体数字)
- 含义:要求写操作必须在N个副本集成员上成功完成,MongoDB才会向客户端返回成功响应。N必须小于或等于副本集成员的总数(不包括仲裁节点)。
- 示例:在一个由3个数据节点组成的副本集中,如果设置
writeConcern: {w: 2}
,那么写操作必须在2个节点上成功完成,客户端才会收到写成功的响应。
- w: “all”
- 含义:要求写操作必须在所有数据承载副本集成员(不包括仲裁节点)上成功完成,MongoDB才会向客户端返回成功响应。这提供了最高级别的数据冗余和一致性,但可能会导致写操作的延迟增加,因为需要等待所有节点完成写入。
- 示例:在一个有4个数据节点的副本集中,设置
writeConcern: {w: "all"}
,写操作必须在这4个节点上都成功完成,客户端才会收到写成功的消息。
实际应用场景选择
- w:1
- 适用场景:适用于对写入速度要求极高,且对数据一致性要求相对较低的场景。例如,某些日志记录系统,即使偶尔丢失一些最新的日志数据也不会对整体系统运行产生重大影响。在这种场景下,使用
w:1
可以极大地提高写入性能,因为不需要等待副本节点的确认。
- 适用场景:适用于对写入速度要求极高,且对数据一致性要求相对较低的场景。例如,某些日志记录系统,即使偶尔丢失一些最新的日志数据也不会对整体系统运行产生重大影响。在这种场景下,使用
- w:majority
- 适用场景:适用于大多数对数据一致性要求较高的业务场景,如金融交易记录、用户账户信息等。在这些场景中,确保数据的一致性至关重要,因为数据的不一致可能会导致严重的业务问题。虽然
w:majority
会比w:1
增加一些写入延迟,但能保证数据在多数节点上的一致性,从而在主节点故障时数据依然可靠。
- 适用场景:适用于大多数对数据一致性要求较高的业务场景,如金融交易记录、用户账户信息等。在这些场景中,确保数据的一致性至关重要,因为数据的不一致可能会导致严重的业务问题。虽然
- w:N
- 适用场景:当你对副本集成员的写入确认数量有特定要求时使用。例如,在一些特定的合规性要求下,可能需要确保数据在特定数量的节点上成功写入。如果你的应用场景介于
w:1
的高性能和w:majority
的强一致性之间,且对确认节点数量有明确数值需求,w:N
可能是合适的选择。
- 适用场景:当你对副本集成员的写入确认数量有特定要求时使用。例如,在一些特定的合规性要求下,可能需要确保数据在特定数量的节点上成功写入。如果你的应用场景介于
- w: “all”
- 适用场景:适用于对数据一致性和耐久性要求极高的场景,如涉及关键业务数据且不容许任何数据丢失的场景。但由于需要等待所有节点确认,写入性能会显著下降,所以只有在对数据完整性绝对要求的情况下才使用,例如一些国家级关键数据存储等场景。