В MongoDB 2.2 и версии 1.3.0 драйвера добавлена поддержка » предпочтений чтения, которые позволяют контролировать направление запросов к экземплярам mongod в среде с набором реплик. Предпочтения чтения могут быть указаны для каждого соединения базы данных или коллекции. Предпочтения, определенные на более высоком уровне, будут наследоваться по умолчанию (например, MongoCollection будет наследовать предпочтения чтения, определенные в соответствующем экземпляре MongoDB).
Предпочтения чтения задаются с помощью комбинации режимов и наборов тегов. Режимы определяют приоритетность экземпляров mongod, а » наборы тегов определяют критерии для приемлемых экземпляров mongod. Экземпляры Mongod имеют право, только если они находятся в пределах 15 мс времени пинга от ближайшего экземпляра Mongod.
Все режимы предпочтений чтения, кроме MongoClient::RP_PRIMARY, могут возвращать устаревшие данные, поскольку вторичные сервера реплицируют операции с основного с некоторой задержкой. Убедитесь, что ваше приложение может переносить устаревшие данные, если вы решите использовать режим, отличный от MongoClient::RP_PRIMARY.
MongoClient::RP_PRIMARY
Все операции чтения используют только набор реплик с основного сервера. Работает по умолчанию. Если основной сервер недоступен, операции чтения приведут к исключению.
Этот режим несовместим с использованием наборов тегов. Указание набора тегов с помощью MongoClient::RP_PRIMARY приведет к исключению.
MongoClient::RP_PRIMARY_PREFERRED
В большинстве ситуаций операции читаются с основного сервера. Однако, если он недоступен, как в случае аварийного переключения, операции читаются с вторичных серверов.
Когда предпочтения чтения включает в себя набор тегов, клиент читает сначала с основного сервера, если он доступен, а затем с вторичных, которые соответствуют указанным тэгам. Если ни у одного вторичного сервероа нет совпадающих тегов, операция чтения выдаст исключение.
Версия 2.2 mongos добавила полную поддержку предпочтений чтения. При подключении к более старым экземплярам mongos MongoClient::RP_PRIMARY_PREFERRED будет отправлять запросы к вторичным серверам.
MongoClient::RP_SECONDARY
Операции только для чтения с вторичных серверов. Если вторичные серверы недоступны, операции чтения приведут к исключению.
Большинство наборов имеют по крайней мере один вторичный объект, но в некоторых ситуациях доступного вторичного устройства может не быть. Например, набор с первичным, вторичным и арбитром может не иметь никаких вторичных серверов, если участник находится в состоянии восстановления или недоступен.
Когда предпочтение чтения включает в себя набор тегов, клиент пытается найти вторичные элементы, которые соответствуют указанному набору тегов, и направляет чтения случайному вторичному элементу из ближайшей группы. Если ни у каких вторичных серверов нет совпадающих тегов, операция чтения выдаст исключение.
MongoClient::RP_SECONDARY_PREFERRED
В большинстве ситуаций операции читаются со вторичных серверов, но в ситуациях, когда набор состоит из одного основного сервера без других членов, операция чтения будет использовать основной сервер.
Когда предпочтения чтения включает в себя набор тегов, клиент пытается найти вторичный сервер, который соответствует указанному набору тегов, и направляет чтения случайному вторичному серверу из ближайшей группы. Если ни у каких вторичных серверов нет совпадающих тегов, операция чтения выдаст исключение.
MongoClient::RP_NEAREST
Драйвер считывает данные со случайного члена набора, время проверки которого менее чем на 15 мс медленнее, чем у участника с самым низким временем проверки связи. Чтения в режиме MongoClient::RP_NEAREST не учитывают тип элемента и могут считываться как с основного, так и с вторичных.
Установите этот режим, чтобы минимизировать влияние задержки сети на операции чтения без предпочтения текущих или устаревших данных.
Если вы укажете набор тегов, клиент попытается найти элемент, который соответствует указанному набору тегов и направит операции чтения на случайный узел из ближайшей группы.
Замечание:
Все операции чтения из ближайшего члена набора реплик, которые соответствуют указанному режиму предпочтений чтения. Режим MongoClient::RP_NEAREST предпочитает чтение с низкой задержкой по сравнению с основным или дополнительным статусом члена.
» Наборы тегов позволяют указывать критерии, чтобы приложение могло ориентировать операции чтения на конкретные элементы на основе пользовательских параметров. Наборы тегов позволяют гарантировать, что операции чтения предназначены для членов в конкретном центре обработки данных или для целевых экземпляров Mongod, предназначенных для определенного класса операций, таких как отчеты или аналитика.
Вы можете указать наборы тегов в следующих режимах предпочтений чтения:
MongoClient::RP_PRIMARY_PREFERRED
MongoClient::RP_SECONDARY
MongoClient::RP_SECONDARY_PREFERRED
MongoClient::RP_NEAREST
Вы не можете указывать наборы тегов в режиме предпочтений чтения MongoClient::RP_PRIMARY. Теги применяются только при выборе дополнительного члена набора, за исключением режима, с выбором ближайшего члена набора.
Предпочтения чтения могут быть указаны либо в URI соединения, предоставленном MongoClient::__construct(), который использует синтаксис строки запроса, либо с помощью методов установки в основных классах, которые используют синтаксис массива для наборов тегов.
При указании режимов предпочтения чтения в строке запроса наборы тегов для значения readPreferenceTags должны быть последовательностью пар ключ/значение, разделенных запятыми.
Замечание:
Каждый набор тегов, определенный в строке запроса, будет использовать имя readPreferenceTags. В отличие от того, как PHP может обрабатывать строки запроса URL, последовательные значения для readPreferenceTags не будут перезаписывать друг друга. Драйвер будет собирать наборы тегов в порядке их появления в строке запроса.
Если драйвер не может найти соответствующий набор тегов, чтение не удастся! Вы несете ответственность за предоставление подходящего запасного варианта, такого как пустое значение readPreferenceTags для возврата к "предпочтению без набора тегов".
Пример #1 Предпочтения чтения в URI подключения с синтаксисом строки запроса
<?php
// Предпочитаем ближайший сервер без тегов
$uri = 'mongodb://rs1.example.com,rs2.example.com/';
$uri .= '?readPreference=nearest';
$m = new MongoClient($uri, array('replicaSet' => 'rs'));
// Выбираем ближайший сервер в "восточном" дата-центре
$uri = 'mongodb://rs1.example.com,rs2.example.com/';
$uri .= '?readPreference=nearest';
$uri .= '&readPreferenceTags=dc:east';
$m = new MongoClient($uri, array('replicaSet' => 'rs'));
// Предпочитаем ближайший сервер в "восточном" центре обработки данных, также используемый для отчетности,
// но используем сервер в "западном" центре обработки данных
$uri = 'mongodb://rs1.example.com,rs2.example.com/';
$uri .= '?readPreference=nearest';
$uri .= '&readPreferenceTags=dc:east,use:reporting';
$uri .= '&readPreferenceTags=dc:west';
$m = new MongoClient($uri, array('replicaSet' => 'rs'));
// Предпочитаем ближайший сервер в "восточном" центре обработки данных,
// затем сервер в "западном" центре обработки данных, и, наконец,
// возвращаемся к предпочтению без набора тегов
$uri = 'mongodb://rs1.example.com,rs2.example.com/';
$uri .= '?readPreference=nearest';
$uri .= '&readPreferenceTags=dc:east';
$uri .= '&readPreferenceTags=dc:west';
$uri .= '&readPreferenceTags=';
$m = new MongoClient($uri, array('replicaSet' => 'rs'));
?>
Пример #2 Устанавливаем предпочтения чтения с синтаксисом массива для наборов тегов
<?php
$m = new MongoClient('mongodb://rs1.example.com,rs2.example.com', array(
'replicaSet' => 'rs',
));
// Предпочитаем ближайший сервер без тегов
$m->setReadPreference(MongoClient::RP_NEAREST, array());
// Выбираем ближайший сервер в "восточном" дата-центре
$m->setReadPreference(MongoClient::RP_NEAREST, array(
array('dc' => 'east'),
));
// Предпочитаем ближайший сервер в "восточном" центре обработки данных, также используемый для отчетности,
// но используем сервер в "западном" центре обработки данных
$m->setReadPreference(MongoClient::RP_NEAREST, array(
array('dc' => 'east', 'use' => 'reporting'),
array('dc' => 'west'),
));
// Предпочитаем ближайший сервер в "восточном" центре обработки данных,
// затем сервер в "западном" центре обработки данных, и, наконец,
// возвращаемся к предпочтению без набора тегов
$m->setReadPreference(MongoClient::RP_NEAREST, array(
array('dc' => 'east'),
array('dc' => 'west'),
array(),
));
?>