指定 CRUD 在副本集上的运行方式
Overview
在本指南中,您可以学习;了解如何配置写关注(write concern)、读关注(read concern)和读取偏好(read preference)选项,以修改MongoDB PHP库对副本集运行创建、读取、更新和删除( CRUD ) 操作的方式。
您可以在以下级别设置写关注、读关注和读取偏好选项:
客户端,为所有操作执行设置默认值,除非被覆盖
会话
事务
Database
Collection
此列表还指示了选项设置的优先级递增顺序。 示例,如果为ACID 事务设立读关注(read concern)级别,它将覆盖从客户端继承的读关注(read concern)级别。
这些选项允许您自定义副本集中数据的因果一致性和可用性。 要查看读取偏好(read preference)、读关注(read concern)和写关注(write concern)选项的完整列表,请参阅MongoDB Server手册中的以下指南:
配置读取和写入操作
您可以通过设置读取偏好(read preference)来控制库路由读取操作的方式。 您还可以通过设置读关注和写入关注来控制库如何等待副本集上写入操作的确认。
本节介绍如何通过将选项大量参数传递给以下任一方法来配置各个级别的读取偏好(read preference)、读关注(read concern)和写关注(write concern):
MongoDB\Client::__construct() :配置客户端级别设置
MongoDB\Client::startSession() :配置会话级设置
MongoDB\Client::selectDatabase() :配置数据库级设置
MongoDB\Client::selectCollection() :配置集合级别设置
客户端配置
此示例演示如何通过向构造函数传递大量来设立 MongoDB\Client
实例的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。 该代码配置以下设置:
secondary
读取偏好(read preference):读取操作从从节点(secondary node from replica set)副本集成员检索数据local
读关注(read concern):读取操作返回实例的最新数据,但不保证该数据已写入大多数副本集成员2
写关注(write concern):主节点 (primary node in the replica set)和一个从从节点(secondary node from replica set)副本集成员必须确认写入操作
$clientOptions = [ 'readPreference' => 'secondary', 'readConcernLevel' => 'local', 'w' => '2', ]; $client = new Client('mongodb://localhost:27017', $clientOptions);
或者,您可以在连接 URI 中指定读取和写入设置,该 URI 作为参数传递给MongoDB\Client
构造函数:
$uri = 'mongodb://localhost:27017/?readPreference=secondary&readConcernLevel=local&w=2'; $client = new Client($uri);
注意
readPreference
、readConcernLevel
和 w
客户端选项接受string值。 在任何其他级别配置读取和写入设置时,必须将MongoDB\Driver\ReadPreference
、 MongoDB\Driver\ReadConcern
和MongoDB\Driver\WriteConcern
类型的值分配给相应的选项。
会话配置
此示例演示如何通过将大量传递给startSession()
方法来设立会话的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。 该代码配置以下设置:
PRIMARY_PREFERRED
读取偏好(read preference):读取操作从主节点 (primary node in the replica set)副本集成员检索数据,如果从节点(secondary node from replica set)主节点 (primary node in the replica set)不可用,则从节点成员检索数据LOCAL
读关注(read concern):读取操作返回实例的最新数据,但不保证该数据已写入大多数副本集成员MAJORITY
写关注(write concern):所有副本集成员中的大多数必须确认写入操作
$sessionOptions = [ 'readPreference' => new ReadPreference(ReadPreference::PRIMARY_PREFERRED), 'readConcern' => new ReadConcern(ReadConcern::LOCAL), 'writeConcern' => new WriteConcern(WriteConcern::MAJORITY), ]; $session = $client->startSession($sessionOptions);
事务配置
此示例演示如何通过将大量传递给startTransaction()
方法来设立ACID 事务的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。 该代码配置以下设置:
PRIMARY
读取偏好(read preference):读取操作从主节点 (primary node in the replica set)副本集成员检索数据MAJORITY
读关注(read concern):读取操作返回实例已写入大多数副本集成员的最新数据1
写关注(write concern):主节点 (primary node in the replica set)副本集成员必须确认写入操作
$transactionOptions = [ 'readPreference' => new ReadPreference(ReadPreference::PRIMARY), 'readConcern' => new ReadConcern(ReadConcern::MAJORITY), 'writeConcern' => new WriteConcern(1), ]; $session->startTransaction($transactionOptions);
数据库配置
此示例演示如何通过将选项大量传递给selectDatabase()
方法来设立名为test_database
的数据库的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。 该代码配置以下设置:
PRIMARY_PREFERRED
读取偏好(read preference):读取操作从主节点 (primary node in the replica set)副本集成员检索数据,如果从节点(secondary node from replica set)主节点 (primary node in the replica set)不可用,则从节点成员检索数据AVAILABLE
读关注(read concern):读取操作返回实例的最新数据,但不保证该数据已写入大多数副本集成员MAJORITY
写关注(write concern):所有副本集成员中的大多数必须确认写入操作
$db = $client->selectDatabase('test_database', [ 'readPreference' => new ReadPreference(ReadPreference::PRIMARY_PREFERRED), 'readConcern' => new ReadConcern(ReadConcern::AVAILABLE), 'writeConcern' => new WriteConcern(WriteConcern::MAJORITY), ]);
集合配置
此示例演示如何通过将选项大量传递给selectCollection()
方法来设置集合test_collection
的设立的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。 该代码配置以下设置:
SECONDARY_PREFERRED
读取偏好(read preference):读取操作从节点副本集成员检索数据,如果没有可用的从节点,则从从节点(secondary node from replica set)主节点 (primary node in the replica set)成员检索数据AVAILABLE
读关注(read concern):读取操作返回实例的最新数据,但不保证该数据已写入大多数副本集成员0
写关注(write concern):请求不确认写入操作
$collection = $client->selectCollection('test_database', 'test_collection', [ 'readPreference' => new ReadPreference(ReadPreference::SECONDARY_PREFERRED), 'readConcern' => new ReadConcern(ReadConcern::AVAILABLE), 'writeConcern' => new WriteConcern(0), ]);
高级读取配置
本节介绍如何通过以下方式进一步自定义读取操作设置:
标签集
MongoDB Server允许您根据您选择的任何条件应用键值标签应用于副本集成员。 然后,您可以使用这些标签来定位一个或多个成员以执行读取操作。
默认, MongoDB PHP库在选择要读取的成员时会忽略标签。 要指示MongoDB PHP库首选某些标记,请将它们作为参数传递给MongoDB\Driver\ReadPreference
类构造函数。 然后,设立MongoDB\Driver\ReadPreference
对象设置为readPreference
数据库选项的值。
假设您连接到一个副本集,其中包含托管在美国多个数据中心的成员。 此代码示例将readPreference
选项设置为一个标签集,指示test_database
优先按以下顺序从从节点(secondary node from replica set)副本集成员读取:
来自纽约数据中心(
['dc' => 'ny']
) 的成员来自旧金山数据中心(
['dc' => 'sf']
) 的成员任何从节点(secondary node from replica set)(
[]
)
$readPreference = new ReadPreference( ReadPreference::RP_SECONDARY, [ ['dc' => 'ny'], ['dc' => 'sf'], [], ], ); $db = $client->selectDatabase( 'test_database', ['readPreference' => $readPreference], );
LocalThreshold
如果多个副本集成员与您指定的读取偏好(read preference)和标签集匹配, MongoDB PHP库将从根据其网络探测(ping)时间选择的最近的副本集成员中读取。
默认,该库仅使用 ping 时间与最近节点的网络探测(ping)时间在15毫秒以内的节点进行查询。 要在延迟较高的成员之间分配读取,请将选项大量传递给设置localThresholdMS
选项的MongoDB\Client
构造函数。
以下示例指定了35毫秒的本地阈值:
$options = [ 'replicaSet' => 'repl0', 'readPreference' => new ReadPreference(ReadPreference::RP_SECONDARY_PREFERRED), 'localThresholdMS' => 35, ]; $client = new Client('mongodb://localhost:27017', [], $options);
在前面的示例中, MongoDB PHP库在最近成员的网络探测(ping)时间的35毫秒内在匹配成员之间分配读取。
注意
通过mongos
实例与副本集通信时, MongoDB PHP库会忽略localThresholdMS
的值。 在这种情况下,请使用localThreshold命令行选项。
API 文档
要学习;了解有关本指南中讨论的任何方法或类型的更多信息,请参阅以下库API文档:
要学习;了解有关startTransaction()
方法的更多信息,请参阅 MongoDB\ 驱动程序\Session::startTransaction() 在扩展API文档中。