...
В MongoDB репликация осуществляется объединением нескольких (в типовой конфигурации - 3) узлов в Replica Set. Replica Set состоит из одного primary узла и нескольких secondary (подробнее https://docs.mongodb.com/v2v4.40/administration/replica-setsset-deployment/). Для упрощения предлагаем схему:
Primary — основной сервер mongoDB.
Secondary — точные копии баз(ы) данных с real-time синхронизацией.
Arbiter — сервер отвечает только за выборы преемника, сам стать преемником он не может, поэтому рекомендуется отдавать под арбитра минимальные ресурсы.
Минимальные характеристики для mongo-db arbiter:
vCore: 1, 64-bit x86 CPUs
vRAM: 2 ГБ
vHDD: 20Гб
Все операции по изменению данных выполняются только на primary. При этом MongoDB автоматически выполняет failover и смену primary на живой узел, если текущий primary выйдет из строя. Но это требует 3+ узлов в replica set.
Предупреждение |
---|
При конфигурации по умолчанию Replica Set из двух узлов полностью выходит из строя при отказе одного из них (даже secondary). |
Настройка replicaSet
В /etc/mongodbhosts на всех узлах необходимо добавить ноды по типу <IP_address> <hostname>
В /etc/mongod.conf
на обоих всех узлах:
добавить строкуДобавить/раскомментировать блок
Блок кода | ||
---|---|---|
| ||
replSetreplication: = replSetName: "<replica_set_name>" |
где <replica_set_name>
имя replica set, выбирается произвольно, но должно быть одинаково на обоих всех серверахзакомментировать либо удалить строку.
Разрешить внешние подключения, прописав в параметре bindIp (bind_ip в старой версии mongo) адрес 0.0.0.0 (0.0.0.0 - разрешает подключения с любых ip адресов)
Блок кода | ||||
---|---|---|---|---|
| ||||
# bind_ip =bindIp: 1270.0.0.10 |
Перезапустить MongoDB
Блок кода | ||
---|---|---|
| ||
root@swlc01-server:/# service mongodbmongod restart |
На первом узле зайти в консоль MongoDB
...
Блок кода | ||||
---|---|---|---|---|
| ||||
replica_set_name:PRIMARY> confcfg = rs.conf() replica_set_name:PRIMARY> confcfg.members[<индекс>].host = "<ip_server1>:27017" replica_set_name:PRIMARY> rs.reconfig(confcfg) |
И снова проверить текущую конфигурацию:
...
Параметр "host"
должен содержать ip-адрес этого сервера.
Добавить в Replica Set второй узел Secondary (выполнять на первом сервереPRIMARY):
Блок кода | ||||
---|---|---|---|---|
| ||||
replica_set_name:PRIMARY> rs.add("<ip_server2>:27017")
{ "ok" : 1 } |
Если MongoDB отвечает на эту команду ошибкой, возможно, нет связи со вторым узлом (или там прописан bind_ip = прописан bindIp: 127.0.0.1
), или там не настроен replSet
блок replication
. Правильный ответ должен быть таким.
На втором узле приглашение консоли управления MongoDB должно смениться на:
Блок кода | ||
---|---|---|
| ||
root@swlc01-server:/# mongo replica_set_name:SECONDARY> |
То же самое выполнить для остальных узлов.Добавить в Replica Set узел Arbiter (выполнять на PRIMARY):
Блок кода | ||||
---|---|---|---|---|
| ||||
replica_set_name:PRIMARY> rs.add("<ip_server3>:27017",true)
{ "ok" : 1 } |
Проверить состояние Replica Set можно выполнив в консоли MongoDB команду rs.status()
...