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