Разница между Sharding и репликацией на MongoDB

77

Я просто запутался насчет Sharding и Replication, как они работают .. Согласно определению

Репликация. Набор реплик в MongoDB - это группа процессов mongod, которые поддерживают один и тот же набор данных.

Sharding: Sharding - это метод хранения данных на нескольких машинах.

Насколько я понимаю, если есть данные 75 ГБ, то при репликации (3 сервера) он будет хранить 75 ГБ данных на каждом сервере, то есть 75 ГБ на сервере-1, 75 ГБ на сервере-2 и 75 ГБ на сервере-3 .. (поправьте меня если я ошибаюсь) .. и при осколке это будет храниться как данные 25 ГБ на сервере-1, данные 25 ГБ на сервере-2 и данные 25 ГБ на сервере-3. (Верно?) ... но потом я столкнулся с этой строкой в учебник

Осколки хранят данные. Для обеспечения высокой доступности и согласованности данных в производственном сегментированном кластере каждый сегмент представляет собой набор реплик.

Поскольку набор реплик имеет 75 ГБ, но шард имеет 25 ГБ, то как они могут быть эквивалентны ... это меня сильно смущает ... Я думаю, что я упускаю что-то великое в этом. Пожалуйста, помогите мне в этом.

Саад Саади
источник

Ответы:

111

Набор реплик означает, что у вас есть несколько экземпляров MongoDB, каждый из которых отражает все данные друг друга. Набор реплик состоит из одного мастера (также называемого «первичным») и одного или нескольких подчиненных (он же вторичный). Операции чтения могут обслуживаться любым ведомым устройством, поэтому вы можете повысить производительность чтения, добавив дополнительные ведомые устройства в набор реплик (при условии, что ваше клиентское приложение способно фактически использовать различные члены набора). Но операции записи всегда выполняются на главном сервере набора реплик и затем распространяются на ведомые устройства, поэтому запись не будет выполняться быстрее, если вы добавите больше подчиненных устройств.

Наборы реплик также предлагают отказоустойчивость. Когда один из членов набора реплик выходит из строя, другие вступают во владение. Когда мастер выйдет из строя, рабы выберут нового мастера. По этой причине для продуктивного развертывания рекомендуется всегда использовать MongoDB в качестве набора реплик как минимум из трех серверов, два из которых содержат данные (третий - «арбитр» без данных, который необходим для определения нового мастера, когда один из рабов выходит из строя).

Sharded кластера означает , что каждый осколок кластера (который также может быть точной копией-набор) берет на себя часть данных. Каждый запрос, как чтение, так и запись, обслуживается кластером, в котором находятся данные. Это означает, что производительность чтения и записи может быть увеличена путем добавления большего количества сегментов в кластер. Какой документ находится на каком осколке, определяется ключом осколка каждой коллекции. Их следует выбирать таким образом, чтобы данные могли быть равномерно распределены по всем кластерам и чтобы было ясно, для большинства общих запросов, где находится ключ shard (пример: когда вы часто запрашиваете user_name, ваш ключ shard должен включать поле, user_nameпоэтому каждый запрос может быть делегирован только одному фрагменту, который имеет этот документ).

Недостатком является то, что страдает отказоустойчивость. Когда один осколок кластера разрушается, любые данные на нем недоступны. По этой причине каждый член кластера также должен быть набором реплик. Это не обязательно. Если вам не важна высокая доступность, осколок также может быть единственным экземпляром mongod без репликации . Но для производственного использования вы всегда должны использовать репликацию .

Так что это значит для вашего примера?

                            Sharded Cluster             
             /                    |                    \
      Shard A                  Shard B                  Shard C
        / \                      / \                      / \
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+
|Primary| |Secondary|    |Primary| |Secondary|    |Primary| |Secondary|
|  25GB |=| 25GB    |    | 25 GB |=| 25 GB   |    | 25GB  |=| 25GB    |   
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+

Если вы хотите разделить данные размером 75 ГБ на 3 фрагмента по 25 ГБ каждый, вам нужно как минимум 6 серверов баз данных, организованных в три набора реплик. Каждый набор реплик состоит из двух серверов, которые имеют одинаковые 25 ГБ данных.

Вам также понадобятся серверы для арбитров трех наборов реплик, а также маршрутизатор mongos и сервер конфигурации для кластера. Арбитры очень легковесны и нужны только тогда, когда член набора репликации выходит из строя, поэтому они обычно могут использовать одно и то же оборудование с чем-то другим. Но маршрутизатор Mongos и config-сервер должны быть избыточными и находиться на своих собственных серверах.

Philipp
источник
2
Большое спасибо за подробный ответ ... еще один вопрос ... если основной не работает во время выполнения операции записи или чтения. 1) Какова задержка в выборе основного из вторичных и 2) во время этой задержки, где будут временно храниться данные?
Саад Саади
4
@SaadSaadi Процесс первичных выборов описан в документации . Вторичным людям требуется от 10 до 12 секунд, чтобы заметить, что основной не работает. Первичные выборы обычно занимают миллисекунды. Набор реплик доступен только для чтения, в то время как основной нет. Любые попытки приложений записать данные в течение этого времени потерпят неудачу.
Филипп
1
@Philipp: всего два комментария: (1) ключ шарда нельзя изменить (т. Е. Нельзя разделить ключ, используя другой ключ) и (2) вы можете читать из вторичных узлов набора реплик, но согласованность зависит от задачи записи (в Чтобы быть согласованным, параметр w должен быть равен набору реплик sth, который не является жизнеспособным, поскольку каждый шард может иметь разные размеры набора реплик преднамеренно или из-за сбоев узла).
Майк Аргириу
@ Филипп, не могли бы вы ответить на дополнительные вопросы на dba.stackexchange.com/questions/208482/… ?
user3198603
18
  • Sharding разделяет набор данных на отдельные части.
  • Репликация дублирует набор данных.

Эти две вещи могут складываться, так как они разные. Использование обоих означает, что вы осколите свой набор данных в нескольких группах реплик. Другими словами, вы копируете осколки; набор данных без осколков - это один «осколок».

Монго кластер с тремя осколками и 3 репликами будет иметь 9 узлов.

  • 3 набора 3-узловых реплик.
  • Каждый набор реплик содержит один осколок.
sysadmin1138
источник
Для одного большого файла хранится ли он в одном или нескольких сегментах (таким образом, между узлами)?
Тони
Обратите внимание, что в MongoDB 3.4 или более поздней версии вам также понадобятся серверы mongoDB для конфигурации и дополнительный сервер в качестве маршрутизатора mongos. Таким образом, общее количество кластеров 3x3 в вашем примере составляет 13 серверов.
dthrasher
9

По сегментированию , вы разделяете свою коллекцию на несколько частей.
Репликация вашей базы данных означает, что вы делаете зеркала вашего набора данных.

haper
источник
4

С точки зрения функциональности доставлено. Sharding обеспечивает масштабируемость и параллелизм. Репликация обеспечивает доступность

Ашиш Кумар
источник
Нет, репликация также обеспечивает масштабируемость и параллелизм только с учетом того, что чтение происходит гораздо чаще, чем запись
Кристоф