Эта статья является частью нашего курса Академии под названием MongoDB — A Scalable NoSQL DB .
В этом курсе вы познакомитесь с MongoDB. Вы узнаете, как установить его и как управлять им через оболочку. Кроме того, вы узнаете, как получить программный доступ к нему через Java и как использовать Map Reduce с ним. Наконец, будут объяснены более сложные понятия, такие как шардинг и репликация. Проверьте это здесь !
Содержание
1. Введение
Репликация — это основополагающий метод обеспечения безопасности ваших данных (путем обеспечения избыточности) и высокой доступности в любое время (путем предоставления нескольких экземпляров, обслуживающих точную копию данных). Репликация очень помогает восстанавливаться после сбоя оборудования и предотвращает перерывы в обслуживании. Очень часто он используется для разгрузки некоторой работы (например, создания отчетов или резервного копирования) с первичных серверов на выделенные реплики.
Существуют серверные классы репликации: Master — Master (или Active — Active ) и Master — Slave (или Active — Passive ). В настоящий момент MongoDB реализует репликацию Master-Slave (или Active-Passive ) (только один узел может одновременно принимать операции записи) с автоматическим выбором основного ( основного ) в случае сбоя.
MongoDB поддерживает репликацию в форме наборов реплик : группы экземпляров MongoDB, которые поддерживают одинаковые (синхронизированные) данные в нескольких экземплярах (серверах).
Набор реплик состоит из одного первичного экземпляра MongoDB (который принимает все операции записи) и одного или нескольких вторичных экземпляров, которые синхронизируются с первичным, чтобы иметь один и тот же набор данных. Для поддержки репликации первичный журнал регистрирует все изменения в своих наборах данных в своем оплоге: специальная ограниченная коллекция, которая хранит непрерывную запись всех операций, которые изменяют данные, хранящиеся в базах данных. Следовательно, вторичные серверы реплицируют оплог первичного сервера и применяют операции к своим наборам данных, чтобы базы данных были синхронизированы (более подробную информацию см. В официальной документации ). Обратите внимание, что эти операции применяются асинхронно, поэтому вторичные экземпляры не всегда могут возвращать самые последние данные (см. Официальную документацию для получения более подробной информации), что известно как задержка репликации .
При желании каждый набор реплик может включать одного или нескольких арбитров : экземпляры MongoDB, которые не поддерживают набор данных, но существуют только для голосования на выборах, внеся большинство голосов. Интересно, что первичный экземпляр может уйти в отставку и стать вторичным , вторичный может быть повышен до первичного, но арбитры никогда не меняют своих ролей (более подробную информацию см. В официальной документации ).
Если первичный элемент недоступен другим членам набора реплик в течение более 10 секунд, набор реплик будет пытаться продвинуть один из вторичных экземпляров, чтобы он стал новым первичным , запустив процесс выбора: первый вторичный сервер , получивший большинство голосование становится основным (пожалуйста, обратитесь к официальной документации для более подробной информации).
До введения набора реплик (который является рекомендуемым способом настройки репликации), MongoDB поддерживал немного другую модель репликации master / slave , которая на данный момент считается устаревшей (более подробную информацию см. В официальной документации ). Мы не собираемся освещать эту модель в этой части урока.
2. Настройка репликации
Стоит отметить, что каждый вторичный элемент в наборе реплик может быть настроен для определенной цели:
- Участник с приоритетом 0 : никогда не становится основным на выборах (более подробную информацию см. в официальной документации )
- скрытый член : невидим для клиентских приложений (пожалуйста, обратитесь к официальной документации для более подробной информации)
- отложенный элемент : отражает более раннее или отложенное состояние набора данных (более подробную информацию см. в официальной документации )
При настройке набора реплик очень важно иметь нечетное количество членов, чтобы гарантировать, что набор реплик всегда сможет выбрать первичку, набрав большинство голосов (более подробные разъяснения см. В официальной документации ). В конфигурации примера набора реплик, которую мы собираемся настроить, есть один первичный экземпляр, три вторичных экземпляра и один арбитр , всего 5 элементов.
Первым шагом в настройке набора реплик является запуск всех экземпляров MongoDB, которые должны быть его членами. Процесс очень похож на тот, который мы рассмотрели в части 1. Установка MongoDB — Как установить MongoDB, за исключением нового аргумента командной строки --replSet
который задает имя набора реплик .
1
|
bin /mongod --replSet "rs-demo" --bind_ip 192.168.100.1 --dbpath data |
1
|
bin /mongod --replSet "rs-demo" --bind_ip 192.168.100.2 --dbpath data |
1
|
bin /mongod --replSet "rs-demo" --bind_ip 192.168.100.3 --dbpath data |
1
|
bin /mongod --replSet "rs-demo" --bind_ip 192.168.100.4 --dbpath data |
1
|
bin /mongod --replSet "rs-demo" --bind_ip 192.168.100.5 --dbpath data |
Начиная с этого момента, все остальные этапы настройки будут выполняться с использованием оболочки MongoDB и богатого набора ее команд для настройки репликации (см. Подробности в командах репликации и помощниках команд ).
Давайте подключимся к первому члену набора реплик, используя оболочку MongoDB: bin/mongo --host 192.168.100.1
. Начальная команда для инициализации набора реплик — rs.initiate()
: она инициирует новый набор реплик, который состоит из текущего члена и использует конфигурацию по умолчанию.
Давайте немедленно rs.conf()
другую полезную команду rs.conf()
для проверки текущих членов и конфигурации набора реплик (должен быть указан только текущий экземпляр):
Давайте продолжим, сначала добавив арбитр в набор реплик, используя rs.addArb()
передавая экземпляр арбитра: 27017 в качестве параметра: rs.addArb( "arbiter:27017" )
. Вызов rs.conf()
демонстрирует нового члена с установленным значением true .
Следуя той же процедуре, давайте добавим все остальные вторичные элементы в набор реплик, но на этот раз с помощью обычной команды rs.add()
и предоставим имя хоста и порт, очень похожие на rs.addArb()
:
1
|
rs.add( "secondary1:27017" ) |
1
|
rs.add( "secondary2:27017" ) |
1
|
rs.add( "secondary3:27017" ) |
Отлично, набор реплик полностью настроен! Другая очень полезная команда rs.status()
предоставляет подробный отчет о текущем наборе реплик .
Для демонстрации, давайте повторно используем пример книжного магазина из Части 3. Учебник по MongoDB и Java и вставляем пару документов в коллекцию книг . Обратите внимание, что эти операции должны выполняться против основного члена набора реплик (второстепенные участники и арбитры не принимают операции записи).
01
02
03
04
05
06
07
08
09
10
11
12
13
|
db.books.insert( { "title" : "MongoDB: The Definitive Guide" , "published" : "2013-05-23" , "categories" : [ "Databases" , "NoSQL" , "Programming" ], "publisher" : { "name" : "O'Reilly" } } ) db.books.insert( { "title" : "MongoDB Applied Design Patterns" , "published" : "2013-03-19" , "categories" : [ "Databases" , "NoSQL" , "Patterns" , "Programming" ], "publisher" : { "name" : "O'Reilly" } } ) |
Чтобы убедиться, что документы были реплицированы, давайте подключимся к любому вторичному члену набора реплик и bin/mongo --host secondary3 bookstore
все документы в коллекции книг : bin/mongo --host secondary3 bookstore
.
Обратите внимание, что для любого вторичного члена ошибка будет возникать, если у команды rs.slaveOk()
не было проблем перед запуском операций чтения:
1
2
|
rs.slaveOk() db.books. find ( {}, { title: 1 }).pretty() |
3. Репликация и разбиение (разбиение)
Осколок и репликация идут рядом. В части 4. Руководства по Sharding MongoDB данного руководства мы упомянули, что настоятельно рекомендуется настроить каждый сегмент в качестве набора реплик . Такие развертывания позволяют иметь избыточные копии каждого раздела ваших данных, а также высокую доступность в случае сбоя основного члена набора реплик шарда.
К счастью, это очень легко сделать, просто следуя другому соглашению об именах членов при вызове команды sh.addShard()
: каждое имя хоста должно начинаться с префикса набора реплик . Например, команды, которые мы видели в Части 4. Руководство по Sharding MongoDB :
1
2
|
sh.addShard( "ubuntu:27000" ) sh.addShard( "ubuntu:27001" ) |
В случае, если каждый осколок является набором реплик , команды будут выглядеть так:
1
2
|
sh.addShard( " rs1/ubuntu:27000" ) sh.addShard( " rs1/ubuntu:27001" ) |
4. Команды репликации и команды-помощники
Оболочка MongoDB предоставляет помощники команд и переменную контекста rs для упрощения управления репликацией и ее развертывания.
5. Что дальше
В этом разделе мы рассмотрели репликацию — очень важный аспект управления данными. Мы видели, как легко настроить репликацию в MongoDB, используя функцию наборов реплик, и как это связано с сегментированием. В следующей части урока мы рассмотрим модель программирования Map / Reduce, которую MongoDB поддерживает из коробки.