Эта статья является частью нашего курса Академии под названием 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" } } ) |
Фото 7 Вставка новых документов в коллекцию книг с помощью команд для основного члена набора реплик .
Чтобы убедиться, что документы были реплицированы, давайте подключимся к любому вторичному члену набора реплик и 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 для упрощения управления репликацией и ее развертывания.
команда | rs.help () | ||
Описание | Выводит краткое описание для всех функций оболочки, связанных с репликацией. | ||
пример | В оболочке MongoDB давайте выполним команду:
|
||
Ссылка | http://docs.mongodb.org/manual/reference/method/rs.help/ |
rs.help ()
команда | replSetInitiate | ||
параметры |
|
||
обертка | rs.initiate (конфигурация) | ||
Описание | Команда инициирует новый набор реплик . При желании требуется настройка для запуска. | ||
пример | Смотрите пожалуйста раздел Настройка репликации . | ||
Ссылка | http://docs.mongodb.org/manual/reference/command/replSetInitiate/
http://docs.mongodb.org/manual/reference/method/rs.initiate/ |
replSetInitiate
команда | rs.conf () |
Описание | Команда возвращает текущую конфигурацию набора реплик . |
пример | Смотрите пожалуйста раздел Настройка репликации . |
Ссылка | http://docs.mongodb.org/manual/reference/method/rs.conf/ |
rs.conf ()
команда | rs.addArb (хост) |
Описание | Команда добавляет новый арбитр в существующий набор реплик . |
пример | Смотрите пожалуйста раздел Настройка репликации . |
Ссылка | http://docs.mongodb.org/manual/reference/method/rs.addArb/ |
rs.addArb (хост)
команда | rs.add (хост, арбитр только) |
Описание | Добавляет нового члена в существующий набор реплик . При установленном значении арбитраOnly true новый член будет добавлен в качестве арбитра, аналогично команде rs.addArb () . |
пример | Смотрите пожалуйста раздел Настройка репликации . |
Ссылка | http://docs.mongodb.org/manual/reference/method/rs.add/ |
rs.add (хост, арбитр только)
команда | rs.remove (хост) | ||
Описание | Команда удаляет существующий элемент из текущего набора реплик . Обратите внимание, что эта функция на короткое время отключит оболочку MongoDB и инициирует переподключение, поскольку набор реплик повторно согласовывает, какой элемент будет основным . В результате оболочка отобразит ошибку, даже если эта команда выполнена успешно. | ||
пример | В оболочке MongoDB давайте выполним команду:
|
||
Ссылка | http://docs.mongodb.org/manual/reference/method/rs.remove/ |
rs.remove (хост)
команда | replSetGetStatus |
обертка | rs.status () |
Описание | Команда возвращает состояние набора реплик с точки зрения текущего экземпляра MongoDB . Он должен быть запущен в контексте базы данных администратора . |
пример | Смотрите пожалуйста раздел Настройка репликации . |
Ссылка | http://docs.mongodb.org/manual/reference/command/replSetGetStatus/ |
replSetGetStatus
команда | replSetFreeze | ||
параметры |
|
||
обертка | rs.freeze ( в секундах) | ||
Описание | Команда запрещает элементу набора реплик искать выборы в течение указанного количества секунд. Эта команда часто используется вместе с командой replSetStepDown, чтобы другой элемент в реплике устанавливал новый основной . | ||
пример | Давайте переподключим оболочку MongoDB к одному из вторичных экземпляров bin / mongo –host primary1 и выполним команду:
|
||
Ссылка | http://docs.mongodb.org/manual/reference/command/replSetFreeze/ |
replSetFreeze
команда | rs.printSlaveReplicationInfo ()
db.printSlaveReplicationInfo () |
||
Описание | Команда выводит отчет о состоянии набора реплик с точки зрения вторичного члена набора. | ||
пример | В оболочке MongoDB давайте выполним команду:
|
||
Ссылка | http://docs.mongodb.org/manual/reference/method/rs.printSlaveReplicationInfo/
http://docs.mongodb.org/manual/reference/method/db.printSlaveReplicationInfo/ |
rs.printSlaveReplicationInfo ()
db.printSlaveReplicationInfo ()
команда | rs.printReplicationInfo () db.printReplicationInfo () |
||
Описание | Команда выводит отчет о состоянии набора реплик с точки зрения основного члена набора. | ||
пример | В оболочке MongoDB давайте выполним команду:
|
||
Ссылка | http://docs.mongodb.org/manual/reference/method/rs.printReplicationInfo/
http://docs.mongodb.org/manual/reference/method/db.printReplicationInfo/ |
rs.printReplicationInfo ()
db.printReplicationInfo ()
команда | db.getReplicationInfo () | ||
Описание | Команда выводит состояние набора реплик , используя данные, опрошенные из оплога . | ||
пример | В оболочке MongoDB давайте выполним команду:
|
||
Ссылка | http://docs.mongodb.org/manual/reference/method/db.getReplicationInfo/ |
db.getReplicationInfo ()
команда | isMaster | ||
обертка | db.isMaster () | ||
Описание | Команда отображает информацию о роли текущего члена в наборе реплик , включая информацию о том, является ли он основным (основным) , дополнительным или арбитром . | ||
пример | В оболочке MongoDB давайте выполним команду:
|
||
Ссылка | http://docs.mongodb.org/manual/reference/command/isMaster/
http://docs.mongodb.org/manual/reference/method/db.isMaster/ |
isMaster
команда | replSetMaintenance |
параметры | {
replSetMaintenance: <true | false> } |
Описание | Команда включает или отключает режим обслуживания для дополнительного члена набора реплик . Он должен быть запущен в контексте базы данных администратора . |
пример | Давайте снова подключим оболочку MongoDB к одному из вторичных экземпляров bin / mongo –host virtual1 и выполните команду: db.adminCommand ({replSetMaintenance: true}) |
Ссылка | http://docs.mongodb.org/manual/reference/command/replSetMaintenance/ |
replSetMaintenance
команда | replSetSyncFrom |
параметры | {
replSetSyncFrom: <хост> } |
обертка | rs.syncFrom (хост) |
Описание | Эта команда устанавливает элемент, с которого будет синхронизироваться этот элемент набора реплик (переопределяя логику выбора цели синхронизации по умолчанию). |
пример | Давайте переподключим оболочку MongoDB к одному из вторичных экземпляров bin / mongo –host virtual1 и выполним команду: rs.syncFrom («second2: 27017») |
Ссылка | http://docs.mongodb.org/manual/reference/command/replSetSyncFrom/
http://docs.mongodb.org/manual/reference/method/rs.syncFrom/ |
replSetSyncFrom
команда | replSetReconfig | ||
параметры |
|
||
обертка | rs.reconfig (конфигурация, сила) | ||
Описание | Команда изменяет конфигурацию существующего набора реплик . Он может использоваться для добавления и удаления членов из набора и / или для изменения конфигурации существующих членов. Обратите внимание, что эта функция может на короткое время отключить оболочку и вызвать повторное подключение, так как набор реплик повторно согласовывает, какой элемент будет основным . В результате оболочка может отображать ошибку, даже если эта команда выполнена успешно. | ||
пример | В оболочке MongoDB давайте выполним команду:
|
||
Ссылка | http://docs.mongodb.org/manual/reference/command/replSetReconfig/
http://docs.mongodb.org/manual/reference/method/rs.reconfig/ |
replSetReconfig
команда | replSetStepDown | ||
параметры |
|
||
обертка | rs.stepDown ( в секундах) | ||
Описание | Команда вынуждает текущего члена набора реплик уйти в качестве основного и затем пытается избежать выбора в качестве основного в течение указанного количества секунд. Команда вызывает ошибку, если текущий элемент не является основным . | ||
пример | В оболочке MongoDB давайте выполним команду:
Последовательный вызов команды rs.isMaster () подтверждает, что текущий член был понижен в качестве основного и стал вторичным узлом. |
||
Ссылка | http://docs.mongodb.org/manual/reference/command/replSetStepDown/
http://docs.mongodb.org/manual/reference/method/rs.stepDown/ |
replSetStepDown
команда | rs.slaveOk () |
Описание | Команда позволяет текущему соединению запускать операции чтения на вторичных членах набора реплик . |
пример | Смотрите пожалуйста раздел Настройка репликации . |
Ссылка | http://docs.mongodb.org/manual/reference/method/rs.slaveOk/ |
rs.slaveOk ()
5. Что дальше
В этом разделе мы рассмотрели репликацию — очень важный аспект управления данными. Мы видели, как легко настроить репликацию в MongoDB, используя функцию наборов реплик, и как это связано с сегментированием. В следующей части урока мы рассмотрим модель программирования Map / Reduce, которую MongoDB поддерживает из коробки.