配置副本集操作
Overview
在本指南中,您可以学习;了解如何配置写关注(write concern)、读关注(read concern)和读取偏好(read preference)选项,以修改Scala驾驶员在副本集上运行创建、读取、更新和删除(增删改查 ) 操作的方式。
读取和写入设置优先级
您可以在以下级别设置写关注、读关注和读取偏好选项:
客户端,为所有操作执行设置默认值,除非被覆盖
事务
Database
Collection
此列表还指示了选项设置的优先级递增顺序。 示例,如果为ACID 事务设立读关注(read concern)级别,它将覆盖从客户端继承的读关注(read concern)级别。
写关注、读关注(read concern)和读取偏好(read preference)选项允许您自定义副本集中数据的因果一致性和可用性。要查看这些选项的完整列表,请参阅MongoDB Server手册中的以下指南:
配置读取和写入操作
您可以通过设置读取偏好(read preference)控制驾驶员如何在副本集节点之间路由读取操作。您还可以通过设置读关注和写入关注来控制驾驶员如何等待副本集上写入操作的确认。
以下部分介绍如何在各个级别配置这些读取和写入设置。
客户端配置
此示例演示如何通过将 MongoClientSettings
实例传递给构造函数设立MongoClient
实例的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。该代码配置以下设置:
secondary
读取偏好(read preference):读取操作从从节点(secondary node from replica set)副本集成员检索数据。LOCAL
读关注(read concern):读取操作会返回实例的最新数据,但不保证该数据已写入大多数副本集成员。W2
写关注(write concern):主节点 (primary node in the replica set)副本集成员和一个从节点(secondary node from replica set)成员必须确认写入操作。
val mongoClient = MongoClient(MongoClientSettings.builder() .applyConnectionString(ConnectionString("mongodb://localhost:27017/")) .readPreference(ReadPreference.secondary()) .readConcern(ReadConcern.LOCAL) .writeConcern(WriteConcern.W2) .build())
或者,您可以在连接 URI 中指定读取和写入设置,该 URI 作为参数传递给MongoClient
构造函数:
val uriClient = MongoClient("mongodb://localhost:27017/?readPreference=secondary&w=2&readConcernLevel=local")
事务配置
此示例演示如何通过将TransactionOptions
startTransaction()
实例传递给ClientSession
方法来设立ACID 事务的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。事务在 会话 中运行,会话是您打算按顺序运行的相关读取或写入操作的分组。在配置ACID 事务选项之前,请创建一个 实例以启动会话。
该示例配置了以下设置:
primary
读取偏好(read preference):读取操作从主节点 (primary node in the replica set)副本集成员检索数据。MAJORITY
读关注(read concern):读取操作返回实例已写入大多数副本集成员的最新数据。W1
写关注(write concern):主节点 (primary node in the replica set)副本集成员必须确认写入操作。
val clientSessionFuture = mongoClient.startSession().toFuture() val clientSession = Await.result(clientSessionFuture, Duration(10, TimeUnit.SECONDS)) val tOptions: TransactionOptions = TransactionOptions.builder() .readPreference(ReadPreference.primary()) .readConcern(ReadConcern.MAJORITY) .writeConcern(WriteConcern.W1) .build() clientSession.startTransaction(tOptions)
数据库配置
此示例展示了如何通过将 setter 方法链接到 getDatabase()
方法来设立名为 test_database
的数据库的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。该代码配置以下设置:
primaryPreferred
读取偏好(read preference):读取操作从主节点 (primary node in the replica set)副本集成员检索数据,如果主节点 (primary node in the replica set)不可用,则从从节点(secondary node from replica set)成员检索数据。AVAILABLE
读关注(read concern):读取操作会返回实例的最新数据,但不保证该数据已写入大多数副本集成员。MAJORITY
写关注(write concern):所有副本集成员中的大多数必须确认写入操作。
val database = mongoClient.getDatabase("test_database") .withReadPreference(ReadPreference.primaryPreferred()) .withReadConcern(ReadConcern.AVAILABLE) .withWriteConcern(WriteConcern.MAJORITY)
集合配置
此示例展示了如何通过将 setter 方法链接到 getCollection()
方法来设立名为 test_collection
的集合的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。该代码配置以下设置:
secondaryPreferred
读取偏好(read preference):读取操作从从节点(secondary node from replica set)副本集成员检索数据,如果没有可用的从从节点(secondary node from replica set)成员,则从主节点 (primary node in the replica set)成员检索数据。AVAILABLE
读关注(read concern):读取操作会返回实例的最新数据,但不保证该数据已写入大多数副本集成员。UNACKNOWLEDGED
写关注(write concern):副本设立成员不需要确认写入操作。
val collection = database.getCollection("test_collection") .withReadPreference(ReadPreference.secondaryPreferred()) .withReadConcern(ReadConcern.AVAILABLE) .withWriteConcern(WriteConcern.UNACKNOWLEDGED)
高级读取配置
以下部分介绍了进一步自定义Scala驾驶员从副本集成员读取的方式。
标签集
在MongoDB Server中,您可以根据您选择的任何条件将键值标签应用副本集成员。然后,您可以使用这些标签来定位一个或多个成员以执行读取操作。
默认下, Scala驾驶员在选择要读取的成员时会忽略标签。要指示Scala驾驶员优先选择某些标签,请将标签作为列表传递给读取偏好(read preference)setter 方法。
假设您连接到一个副本集,其中包含托管在美国多个数据中心的成员。您希望驾驶员优先按以下顺序从从节点(secondary node from replica set)副本集成员读取:
来自 纽约数据中心 的节点,标记为
("dc", "ny")
来自旧金山数据中心的节点,标记为
("dc", "sf")
任何从从节点(secondary node from replica set)
此代码示例会将表示前面副本集成员的标签列表传递给 ReadPreference.secondary()
setter 方法。然后,代码将读取偏好(read preference)信息传递给 withReadPreference()
方法,以在数据库上设立读取顺序:
val tag1 = new TagSet(new Tag("dc", "ny")) val tag2 = new TagSet(new Tag("dc", "sf")) val tag3 = new TagSet() val readPreference = ReadPreference.secondary(List(tag1, tag2, tag3).asJava) val database = mongoClient.getDatabase("test_database") .withReadPreference(readPreference)
LocalThreshold
如果多个副本集成员与您指定的读取偏好(read preference)和标签集匹配,则Scala驾驶员将从根据其网络探测(ping)时间选择的最近副本集成员中读取。
默认情况下,驾驶员仅使用 ping 时间与最近节点的网络探测(ping)时间在 15 毫秒以内的节点进行查询。要在延迟较高的成员之间分配读取,请在 MongoClientSettings
实例中设立localThreshold
选项,或在连接 URI 中设置 localThresholdMS
选项。
以下示例指定了 35 毫秒的本地阈值。选择 MongoClientSettings 或 Connection URI标签页,查看每种方法的相应代码:
val client = MongoClient(MongoClientSettings.builder() .applyConnectionString(ConnectionString("mongodb://localhost:27017/")) .applyToClusterSettings(builder => builder .localThreshold(35, TimeUnit.MILLISECONDS) ) .build())
val connectionString = "mongodb://localhost:27017/?replicaSet=repl0&localThresholdMS=35" val client = MongoClient(connectionString)
在前面的示例中, Scala驾驶员在最近成员的网络探测(ping)时间后的 35 毫秒内在匹配成员之间分发读取。
注意
localThresholdMS
通过mongos
实例与副本集集通信时, Scala驾驶员会忽略 选项。在这种情况下,请使用 localThreshold 命令行选项。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: