Обработка запросов как с ведущими, так и с подчиненными / первичными и вторичными в MongoDB

Я хочу масштабировать чтение с помощью MongoDB. Для этого я могу настроить репликацию master-slave или набор реплик, но если я создам соединение с Mongo следующим образом:

from pymongo import ReplicaSetConnection, ReadPreference
from pymongo.errors import ConnectionFailure

try:
    connection = ReplicaSetConnection("somehost:10000", replicaSet='myapp_repl',
                                  read_preference=ReadPreference.SECONDARY) 
except ConnectionFailure ...

or:

from pymongo.master_slave_connection import MasterSlaveConnection
from pymongo.errors import ConnectionFailure

try:
    master = Connection(host="somehost", port=10000)
    slave1 = Connection(host="somehost", port=10001)
    slave2 = Connection(host="somehost", port=10002)
    connection = MasterSlaveConnection(master, slaves=[slave1, slave2])
except ConnectionFailure ...

Драйвер pymongo будет распределять запросы между вторичными/подчиненными серверами набора реплик. В этой ситуации первичный/главный не будет обрабатывать запросы, поэтому, если у меня будет 2 узла, я не буду улучшать возможности чтения, потому что только 1 узел будет обрабатывать запросы. Как сделать так, чтобы запросы обрабатывались как ведущими, так и подчиненными (первичными и вторичными)?


person Artem Mezhenin    schedule 24.04.2012    source источник
comment
Не знаю, сработает ли это, но что произойдет, если вы попробуете: connection=MasterSlaveConnection(master, slaves=[slave1, slave2, master) ?   -  person Randall Hunt    schedule 24.04.2012
comment
Хм, это действительно работает! Есть ли решение для набора реплик?   -  person Artem Mezhenin    schedule 24.04.2012


Ответы (1)


Это немного взломать, но:

connection = MasterSlaveConnection(master, slaves=[slave1, slave2, master)

Однако MasterSlaveConnection устарел.

Я не уверен в каком-либо другом способе исправить это.

Возможно, вы захотите изучить сегментирование или добавить арбитра для голосования на новых праймериз: http://www.mongodb.org/display/DOCS/Adding+an+Arbiter

person Randall Hunt    schedule 24.04.2012
comment
ReadPreference уже SECONDARY, но эта опция не заставляет pymongo балансировать запросы между первичными и вторичными (только между вторичными, если они существуют). - person Artem Mezhenin; 24.04.2012
comment
Итак, после расспросов в #mongodb я не смог найти способ обойти это :/, я могу сказать вам, что он вернется к первичному, если вторичные узлы не работают. - person Randall Hunt; 24.04.2012
comment
Обсуждение выше верно; в ближайшем будущем мы, вероятно, добавим ReadPreference.ANY в PyMongo, чтобы разрешить распространение среди всех членов набора реплик. - person A. Jesse Jiryu Davis; 24.04.2012