一文说清楚AWS DocumentDB 的 write concern 与 read concern,以及他们是否需要成对出现
MongoDB 中的写关注(Write Concern)和读关注(Read Concern)是用于控制数据一致性和持久性的配置选项。
写关注(Write Concern)
写关注定义了 MongoDB 在确认写操作成功前所需的条件。它指定了需要多少个节点确认写操作已经持久化。
写关注级别
w: 0
:不等待确认,客户端不会等待任何写操作确认(不推荐,因为可能丢失数据)。w: 1
:等待主节点确认写操作成功。默认是 w: 1w: "majority"
:等待多数节点(大多数副本集成员)确认写操作成功。w: <number>
:等待指定数量的节点确认写操作成功。j: true
:确保写操作已经写入磁盘日志(journal),提供更高的持久性。wtimeout: <ms>
:设置写操作的超时时间。
使用场景
- 高可用性要求:在金融交易等关键操作中,需要确保数据已写入到大多数节点或已写入到磁盘日志中。
- 性能优化:在非关键数据写入中,可以降低写关注级别以提升性能。
示例
import com.mongodb.MongoClientSettings;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MongoConfig {
@Bean
public MongoClient mongoClient() {
MongoClientSettings settings = MongoClientSettings.builder()
.writeConcern(WriteConcern.MAJORITY // 设置写关注级别为 majority
.withJournal(true) // 确保写操作写入磁盘日志
.withWTimeout(2000, TimeUnit.MILLISECONDS)) // 设置写操作超时时间为 2 秒
.build();
return MongoClients.create(settings);
}
}
读关注(Read Concern)
读关注定义了 MongoDB 读取操作的隔离性和一致性级别。它指定了从数据库中读取数据时所需的保证。
读关注级别
local
:读取本地节点中的最新数据(默认)。majority
:读取已经被大多数节点确认的数据,确保数据的一致性。linearizable
:读取最严格一致性的最新数据,确保读取的是最新提交的数据。snapshot
:用于事务中的一致性快照读取,确保读取的所有数据来自同一时间点。
使用场景
- 强一致性要求:在需要读取最新提交数据的场景中,使用较高的读关注级别。
- 性能优化:在数据一致性要求不高的场景中,可以降低读关注级别以提升性能。
示例
import com.mongodb.MongoClientSettings;
import com.mongodb.ReadConcern;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MongoConfig {
@Bean
public MongoClient mongoClient() {
MongoClientSettings settings = MongoClientSettings.builder()
.readConcern(ReadConcern.MAJORITY) // 设置读关注级别为 majority
.build();
return MongoClients.create(settings);
}
}
综合配置
在同一个 MongoDB 客户端配置中同时设置写关注和读关注:
import com.mongodb.MongoClientSettings;
import com.mongodb.ReadConcern;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MongoConfig {
@Bean
public MongoClient mongoClient() {
MongoClientSettings settings = MongoClientSettings.builder()
.writeConcern(WriteConcern.MAJORITY // 配置写关注
.withJournal(true) // 确保写操作写入磁盘日志
.withWTimeout(2000, TimeUnit.MILLISECONDS)) // 设置写操作超时时间为 2 秒
.readConcern(ReadConcern.MAJORITY) // 配置读关注
.build();
return MongoClients.create(settings);
}
}
小结
- 写关注(Write Concern):控制写操作的持久性和确认级别,适用于需要确保写入操作可靠性的场景。
- 读关注(Read Concern):控制读取操作的一致性和隔离性,适用于需要确保读取数据一致性的场景。
通过合理配置写关注和读关注,可以在不同的业务场景下优化 MongoDB 的性能和数据一致性,从而提高系统的可靠性和效率。
在 AWS DocumentDB 中的 写关注与读关注
写关注
在 AWS DocumentDB 中,write concern
是用于指定写操作的确认级别,即确定写操作在数据库中持久化的程度。默认情况下,AWS DocumentDB 使用 "w": 1
作为其写关注级别,这意味着写操作在主节点上成功执行后,客户端会收到确认。
AWS DocumentDB 不支持直接修改 MongoDB 的 write concern
设置,因为 AWS DocumentDB 是托管服务,许多配置细节是由 AWS 管理的。然而,我们可以在客户端代码中指定特定的 write concern
设置以覆盖默认值。
设置 Write Concern 在客户端代码中
你可以在 Java 中使用 MongoDB 驱动程序来设置 write concern
。以下是一个示例:
import com.mongodb.MongoClientSettings;
import com.mongodb.ServerAddress;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import com.mongodb.connection.ClusterSettings;
import java.util.Collections;
public class DocumentDBExample {
public static void main(String[] args) {
// Create a custom WriteConcern
WriteConcern writeConcern = WriteConcern.MAJORITY.withWTimeout(1000);
// Configure the MongoClient with custom settings
ClusterSettings clusterSettings = ClusterSettings.builder()
.hosts(Collections.singletonList(new ServerAddress("your-documentdb-endpoint", 27017)))
.build();
MongoClientSettings settings = MongoClientSettings.builder()
.applyToClusterSettings(builder -> builder.applySettings(clusterSettings))
.writeConcern(writeConcern)
.build();
// Create a MongoClient with the custom settings
MongoClient mongoClient = MongoClients.create(settings);
// Access your database
MongoDatabase database = mongoClient.getDatabase("your-database-name");
// Perform operations on the database
// Example: Insert a document
database.getCollection("your-collection-name").insertOne(new Document("key", "value"));
// Close the client
mongoClient.close();
}
}
在这个示例中,我们创建了一个自定义的 WriteConcern
,并将其配置为 WriteConcern.MAJORITY
,这意味着写操作需要在大多数副本集成员上确认。然后,我们将此 WriteConcern
应用于 MongoClientSettings
,并创建一个 MongoClient
实例。
其他 Write Concern 级别
MongoDB 提供了多个 Write Concern
级别,每个级别都有不同的确认要求:
WriteConcern.ACKNOWLEDGED
: 默认级别,写操作在主节点上成功执行后,客户端会收到确认。WriteConcern.UNACKNOWLEDGED
: 写操作不需要确认,客户端不会等待服务器的响应。WriteConcern.W1
: 写操作在一个节点上确认后,客户端会收到确认。WriteConcern.W2
: 写操作在两个节点上确认后,客户端会收到确认。WriteConcern.MAJORITY
: 写操作在大多数副本集成员上确认后,客户端会收到确认。
你可以根据需求选择合适的 Write Concern
级别,并在客户端代码中进行设置。
在 Spring Data MongoDB 中设置 Write Concern
如果你使用 Spring Data MongoDB,可以在配置中设置 Write Concern
。例如:
import com.mongodb.WriteConcern;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
@Configuration
public class MongoConfig {
@Bean
public MongoTemplate mongoTemplate() {
String connectionString = "mongodb://your-documentdb-endpoint:27017/your-database-name";
SimpleMongoClientDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(connectionString);
MongoTemplate mongoTemplate = new MongoTemplate(factory);
mongoTemplate.setWriteConcern(WriteConcern.MAJORITY);
return mongoTemplate;
}
}
这样,Spring Data MongoDB 将使用指定的 Write Concern
设置进行所有写操作。
通过在客户端代码中配置 Write Concern
,你可以根据特定需求调整 AWS DocumentDB 的写操作确认级别。
MongoDB 的 write concern(写关注) 和 read concern(读关注) 是不是必须成对出现 --> 不需要,但可以成对出现
MongoDB 的写关注(Write Concern)和读关注(Read Concern)不需要成对出现,它们是独立的配置选项,用于不同的操作场景。
写关注(Write Concern)
写关注用于控制写操作的持久性和确认级别。可以单独配置写关注,以确保写操作符合所需的可靠性要求。
配置写关注的场景
- 高可靠性要求:在金融交易等关键操作中,需要确保数据已写入到大多数节点或已写入到磁盘日志中。
- 性能优化:在非关键数据写入中,可以降低写关注级别以提升性能。
配置示例
import com.mongodb.MongoClientSettings;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MongoConfig {
@Bean
public MongoClient mongoClient() {
MongoClientSettings settings = MongoClientSettings.builder()
.writeConcern(WriteConcern.MAJORITY) // 配置写关注
.build();
return MongoClients.create(settings);
}
}
读关注(Read Concern)
读关注用于控制读取操作的一致性和隔离性。可以单独配置读关注,以确保读取操作符合所需的一致性要求。
配置读关注的场景
- 强一致性要求:在需要读取最新提交数据的场景中,使用较高的读关注级别。
- 性能优化:在数据一致性要求不高的场景中,可以降低读关注级别以提升性能。
配置示例
import com.mongodb.MongoClientSettings;
import com.mongodb.ReadConcern;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MongoConfig {
@Bean
public MongoClient mongoClient() {
MongoClientSettings settings = MongoClientSettings.builder()
.readConcern(ReadConcern.MAJORITY) // 配置读关注
.build();
return MongoClients.create(settings);
}
}
综合配置示例
虽然写关注和读关注可以独立配置,但也可以在同一个配置中同时设置它们:
import com.mongodb.MongoClientSettings;
import com.mongodb.ReadConcern;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MongoConfig {
@Bean
public MongoClient mongoClient() {
MongoClientSettings settings = MongoClientSettings.builder()
.writeConcern(WriteConcern.MAJORITY) // 配置写关注
.readConcern(ReadConcern.MAJORITY) // 配置读关注
.build();
return MongoClients.create(settings);
}
}
小结
- 独立配置:写关注和读关注是独立的配置,可以根据具体需求单独设置。
- 不同场景:写关注主要用于控制写操作的确认级别,读关注主要用于控制读操作的一致性。
- 灵活组合:可以在同一个 MongoDB 客户端配置中同时设置写关注和读关注,但这并不是必须的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了