Статьи

Руководство по репликации MongoDB

Эта статья является частью нашего курса Академии под названием 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. Настройка репликации

Стоит отметить, что каждый вторичный элемент в наборе реплик может быть настроен для определенной цели:

При настройке набора реплик очень важно иметь нечетное количество членов, чтобы гарантировать, что набор реплик всегда сможет выбрать первичку, набрав большинство голосов (более подробные разъяснения см. В официальной документации ). В конфигурации примера набора реплик, которую мы собираемся настроить, есть один первичный экземпляр, три вторичных экземпляра и один арбитр , всего 5 элементов.

Рисунок 1. Пример конфигурации набора реплик.

Фото 1 Пример конфигурации набора реплик .

Первым шагом в настройке набора реплик является запуск всех экземпляров 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() : она инициирует новый набор реплик, который состоит из текущего члена и использует конфигурацию по умолчанию.

Рисунок 2. Инициирование набора реплик с конфигурацией по умолчанию.

Фото 2 Инициирование набора реплик с конфигурацией по умолчанию.

Давайте немедленно rs.conf() другую полезную команду rs.conf() для проверки текущих членов и конфигурации набора реплик (должен быть указан только текущий экземпляр):

Рисунок 3. Проверка элементов и конфигурации текущего набора реплик.

Фото 3 Проверка текущих членов набора реплик и конфигурации.

Давайте продолжим, сначала добавив арбитр в набор реплик, используя rs.addArb() передавая экземпляр арбитра: 27017 в качестве параметра: rs.addArb( "arbiter:27017" ) . Вызов rs.conf() демонстрирует нового члена с установленным значением true .

Рисунок 4. Добавление арбитра и проверка элементов и конфигурации текущего набора реплик.

Фото 4 Добавление арбитра и проверка текущих членов набора репликации и конфигурации.

Следуя той же процедуре, давайте добавим все остальные вторичные элементы в набор реплик, но на этот раз с помощью обычной команды rs.add() и предоставим имя хоста и порт, очень похожие на rs.addArb() :

1
rs.add( "secondary1:27017" )
1
rs.add( "secondary2:27017" )
1
rs.add( "secondary3:27017" )
Рисунок 5. Добавление вторичных элементов и проверка текущей конфигурации набора реплик.

Фото 5 Добавление дополнительных членов и проверка текущей конфигурации набора реплик .

Отлично, набор реплик полностью настроен! Другая очень полезная команда rs.status() предоставляет подробный отчет о текущем наборе реплик .

Рисунок 6. Получение текущего состояния набора реплик.

Фото 6 Получение текущего состояния набора реплик .

Для демонстрации, давайте повторно используем пример книжного магазина из Части 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. Вставка новых документов в коллекцию книг с помощью команд для основного члена набора реплик.

Фото 7 Вставка новых документов в коллекцию книг с помощью команд для основного члена набора реплик .

Чтобы убедиться, что документы были реплицированы, давайте подключимся к любому вторичному члену набора реплик и bin/mongo --host secondary3 bookstore все документы в коллекции книг : bin/mongo --host secondary3 bookstore .

Обратите внимание, что для любого вторичного члена ошибка будет возникать, если у команды rs.slaveOk() не было проблем перед запуском операций чтения:

1
2
rs.slaveOk()
db.books.find( {}, { title: 1 }).pretty()
Рисунок 8. Запрос коллекции книг на вторичном элементе набора реплик.

Фото 8 Запрос коллекции книг на вторичном элементе набора реплик .

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 давайте выполним команду:

1
rs.help()

05.RS.HELP

Ссылка http://docs.mongodb.org/manual/reference/method/rs.help/

rs.help ()

команда replSetInitiate
параметры
1
2
3
{
    replSetInitiate : <configuration>
}
обертка 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 давайте выполним команду:

1
rs.remove( "secondary3:27017" )

05.RS.REMOVE

Ссылка http://docs.mongodb.org/manual/reference/method/rs.remove/

rs.remove (хост)

команда replSetGetStatus
обертка rs.status ()
Описание Команда возвращает состояние набора реплик с точки зрения текущего экземпляра MongoDB . Он должен быть запущен в контексте базы данных администратора .
пример Смотрите пожалуйста раздел Настройка репликации .
Ссылка http://docs.mongodb.org/manual/reference/command/replSetGetStatus/

http://docs.mongodb.org/manual/reference/method/rs.status/

replSetGetStatus

команда replSetFreeze
параметры
1
2
3
{
    replSetFreeze: <seconds>
}
обертка rs.freeze ( в секундах)
Описание Команда запрещает элементу набора реплик искать выборы в течение указанного количества секунд. Эта команда часто используется вместе с командой replSetStepDown, чтобы другой элемент в реплике устанавливал новый основной .
пример Давайте переподключим оболочку MongoDB к одному из вторичных экземпляров bin / mongo –host primary1 и выполним команду:

1
rs.freeze( 10 )

05.RS.FREEZE

Ссылка http://docs.mongodb.org/manual/reference/command/replSetFreeze/

http://docs.mongodb.org/manual/reference/method/rs.freeze/

replSetFreeze

команда rs.printSlaveReplicationInfo ()

db.printSlaveReplicationInfo ()

Описание Команда выводит отчет о состоянии набора реплик с точки зрения вторичного члена набора.
пример В оболочке MongoDB давайте выполним команду:

1
rs.printSlaveReplicationInfo()

05.RS.PRINTSLAVEREPLICATIONINFO

Ссылка 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 давайте выполним команду:

1
rs.printReplicationInfo()

05.RS.PRINTREPLICATIONINFO

Ссылка 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 давайте выполним команду:

1
rs.getReplicationInfo()

05.DB.GETREPLICATIONINFO

Ссылка http://docs.mongodb.org/manual/reference/method/db.getReplicationInfo/

db.getReplicationInfo ()

команда isMaster
обертка db.isMaster ()
Описание Команда отображает информацию о роли текущего члена в наборе реплик , включая информацию о том, является ли он основным (основным) , дополнительным или арбитром .
пример В оболочке MongoDB давайте выполним команду:

1
db.isMaster()

05.DB.ISMASTER

Ссылка 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})

05.REPLSETMAINTENANCE

Ссылка http://docs.mongodb.org/manual/reference/command/replSetMaintenance/

replSetMaintenance

команда replSetSyncFrom
параметры {

replSetSyncFrom: <хост>

}

обертка rs.syncFrom (хост)
Описание Эта команда устанавливает элемент, с которого будет синхронизироваться этот элемент набора реплик (переопределяя логику выбора цели синхронизации по умолчанию).
пример Давайте переподключим оболочку MongoDB к одному из вторичных экземпляров bin / mongo –host virtual1 и выполним команду: rs.syncFrom («second2: 27017»)

05.REPLSETSYNCFROM

Ссылка http://docs.mongodb.org/manual/reference/command/replSetSyncFrom/

http://docs.mongodb.org/manual/reference/method/rs.syncFrom/

replSetSyncFrom

команда replSetReconfig
параметры
1
2
3
4
5
6
7
{
 
replSetReconfig: <configuration>,
 
force: <true|false>
 
}
обертка rs.reconfig (конфигурация, сила)
Описание Команда изменяет конфигурацию существующего набора реплик . Он может использоваться для добавления и удаления членов из набора и / или для изменения конфигурации существующих членов. Обратите внимание, что эта функция может на короткое время отключить оболочку и вызвать повторное подключение, так как набор реплик повторно согласовывает, какой элемент будет основным . В результате оболочка может отображать ошибку, даже если эта команда выполнена успешно.
пример В оболочке MongoDB давайте выполним команду:

1
rs.reconfig( rs.conf() )

05.RS.RECONFIG

Ссылка http://docs.mongodb.org/manual/reference/command/replSetReconfig/

http://docs.mongodb.org/manual/reference/method/rs.reconfig/

replSetReconfig

команда replSetStepDown
параметры
1
2
3
4
5
6
7
{
 
replSetStepDown: <seconds> ,
 
force: <true|false>
 
}
обертка rs.stepDown ( в секундах)
Описание Команда вынуждает текущего члена набора реплик уйти в качестве основного и затем пытается избежать выбора в качестве основного в течение указанного количества секунд. Команда вызывает ошибку, если текущий элемент не является основным .
пример В оболочке MongoDB давайте выполним команду:

1
rs.stepDown( 10 )

05.RS.STEPDOWN

Последовательный вызов команды 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 поддерживает из коробки.