...
В 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_name>
имя replica set, выбирается произвольно, но должно быть одинаково на обоих всех серверахИзменить строку.
Разрешить внешние подключения, прописав в параметре bindIp (bind_ip в старой версии mongo) адрес 0.0.0.0 (0.0.0.0 - разрешает подключения с любых ip адресов)
Блок кода | ||||
---|---|---|---|---|
| ||||
bind_ip = bindIp: 0.0.0.0 |
Перезапустить 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 (выполнять на первом сервере):
...
Если MongoDB отвечает на эту команду ошибкой, возможно, нет связи со вторым узлом (или там прописан bind_ip = прописан bindIp: 127.0.0.1
), или там не настроен блок replication
. Правильный ответ должен быть таким.
На втором узле приглашение консоли управления MongoDB должно смениться на:
Блок кода | ||
---|---|---|
| ||
root@swlc01-server:/# mongo replica_set_name:SECONDARY> |
То же самое выполнить для остальных узлов.Добавить в Replica Set узел Arbiter (выполнять на первом сервере):
Блок кода | ||||
---|---|---|---|---|
| ||||
replica_set_name:PRIMARY> rs.add("<ip_server3>:27017",true)
{ "ok" : 1 } |
Проверить состояние Replica Set можно выполнив в консоли MongoDB команду rs.status()
...