Есть ли опция для балансировки нагрузки с наборами реплик mongodb? Я не спрашиваю о HAProxy или подобном, но о встроенной функции от mongodb. Не удалось найти советы по этому вопросу в документации.
Если вы используете sharding, то «балансировщик нагрузки» - это процесс mongos - фактически он больше похож на маршрутизатор - он хранит копию базы данных config в памяти и может принимать решения на основе ключа shard.
Если вы имеете в виду балансировку нагрузки для идентичных наборов реплик или для членов набора, то существует запрос функции, чтобы монгос также обрабатывал этот сценарий ( https://jira.mongodb.org/browse/SERVER-1594 ), однако как работают драйверы, на самом деле не обязательно (хотя это сделает драйверы менее сложными).
В одном наборе реплик вы не можете распространять записи, все они должны идти к основному. Вы можете распространять чтения для вторичных пользователей уже через настройки чтения по своему усмотрению. Драйвер отслеживает, что является первичным, а что вторичным, и направляет запросы соответствующим образом.
«Балансировка нагрузки» достигается с помощью шардинга. Разделяя, вы фактически распределяете записи / обновления на отдельные осколки. Не существует специального алгоритма, который бы делал это, так как mongo позволит вам разбить данные на любую комбинацию клавиш, которую вы хотите. Лучшие алгоритмы разбиения - это те, которые содержат последовательность последовательных записей плюс случайный.
Например, идентификатор пользователя может быть разделен следующим образом
xx-sha1(user email)
xx = time sequence
Помните, что для реализации шардинга вам необходимо иметь три сервера конфигурации и узлы данных. Узлы данных могут быть сгруппированы в наборы реплик для избыточности и могут использоваться (только если вы можете) для чтения данных из вторичных серверов. Я говорю, только если вы можете читать данные, потому что репликация выполняется асинхронно, поэтому нет никакой гарантии, что новые данные будут доступны во время запроса на вторичных серверах.
Имейте в виду, что алгоритм разделения полностью зависит от вас и должен соответствовать потребностям вашего приложения. Также вам следует подумать, хотите ли вы просто записать данные и только при случайном чтении или вам нужно прочитать их сразу после того, как вы их написали.