一文说清楚AWS DocumentDB 的 write concern 与 read concern,以及他们是否需要成对出现

MongoDB 中的写关注(Write Concern)和读关注(Read Concern)是用于控制数据一致性和持久性的配置选项。

写关注(Write Concern)

写关注定义了 MongoDB 在确认写操作成功前所需的条件。它指定了需要多少个节点确认写操作已经持久化。

写关注级别

  • w: 0:不等待确认,客户端不会等待任何写操作确认(不推荐,因为可能丢失数据)。
  • w: 1:等待主节点确认写操作成功。默认是 w: 1
  • w: "majority":等待多数节点(大多数副本集成员)确认写操作成功。
  • w: <number>:等待指定数量的节点确认写操作成功。
  • j: true:确保写操作已经写入磁盘日志(journal),提供更高的持久性。
  • wtimeout: <ms>:设置写操作的超时时间。

使用场景

  1. 高可用性要求:在金融交易等关键操作中,需要确保数据已写入到大多数节点或已写入到磁盘日志中。
  2. 性能优化:在非关键数据写入中,可以降低写关注级别以提升性能。

示例

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:用于事务中的一致性快照读取,确保读取的所有数据来自同一时间点。

使用场景

  1. 强一致性要求:在需要读取最新提交数据的场景中,使用较高的读关注级别。
  2. 性能优化:在数据一致性要求不高的场景中,可以降低读关注级别以提升性能。

示例

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 客户端配置中同时设置写关注和读关注,但这并不是必须的。
posted @ 2024-07-05 01:19  gongchengship  阅读(18)  评论(0编辑  收藏  举报