Сохраняйте как можно большее разделение между участниками, размещая экземпляры mongod на разных машинах. При использовании виртуальных машин для производственных развертываний каждый экземпляр mongod следует размещать на отдельном хост-сервере, обслуживаемом избыточными цепями питания и избыточными сетевыми путями, и, по возможности, развертывать каждый элемент реплики, установленный на свой собственный. Компьютер привязан к стандартной базе данных MongoDB. порт 27017.
Набор реплик из трех узлов-членов обеспечивает достаточную избыточность, чтобы противостоять большинству сетевых разделов и другим сбоям системы. Эти коллекции также имеют достаточную емкость для многих распределенных операций чтения. Набор реплик всегда должен состоять из нечетного числа членов. Это гарантирует, что выборы пройдут гладко.
Вопросы, которые следует учитывать при развертывании:
- Настройте виртуальную частную сеть. Убедитесь, что топология вашей сети направляет весь трафик между узлами-членами на одном сайте через локальную сеть.
- Настройте контроль доступа, чтобы предотвратить подключения неизвестных клиентов к набору реплик.
- Настройте правила сети и брандмауэра, чтобы разрешить входящие и исходящие пакеты только через порты MongoDB по умолчанию и только в развертываниях.
- Убедитесь, что каждый узел-член набора реплик доступен по разрешимому DNS-имени или имени хоста. Вы должны правильно настроить DNS-имена или настроить системный файл /etc/hosts, чтобы отразить эту конфигурацию.
- Каждый участник должен иметь возможность подключаться к любому другому участнику.
ПРИМЕЧАНИЕ. Если возможно, используйте логические DNS-имена хостов вместо IP-адресов, особенно при настройке элементов набора реплик или сегментированных элементов кластера. Использование логических имен хостов DNS позволяет избежать изменений конфигурации из-за изменения IP-адреса.
Развертывание набора реплик в производственной среде с отключенным контролем доступа
-
Привязка IP: использование параметра bind_ip гарантирует, что MongoDB прослушивает подключения от приложений по настроенному адресу. Перед привязкой к нелокальному (например, общедоступному) IP-адресу убедитесь, что ваш кластер защищен от несанкционированного доступа. Например, следующий экземпляр mongod привязан к локальному хосту и имени хоста TestHostname, которое связано с IP-адресом 198.51.100.1:
mongod --bind_ip localhost,TestHostname
Чтобы подключиться к этому экземпляру, удаленные клиенты должны указать имя хоста или связанный с ним IP-адрес 198.51.100.1:
mongo --host TestHostname mongo --host 198.51.100.1
-
Создайте каталог, в котором MongoDB хранит файлы данных, указав конфигурацию mongod в файле конфигурации, хранящемся в /etc/mongod.conf или в соответствующем месте.
-
Запустите каждый элемент набора реплик с соответствующими параметрами. Для каждого члена запустите экземпляр mongod со следующими настройками:
-
Задайте для параметра replication.replSetName имя набора реплик (если ваше приложение подключается к нескольким наборам реплик, каждый из них должен иметь свое имя, некоторые драйверы соединяют наборы реплик по имени набора реплик).
-
Задайте для параметра net.bindIp значение hostname/ip или список имен хостов/ips, разделенных запятыми, и другую конфигурацию, необходимую для настройки развертывания.
В следующем примере указывается имя набора реплик и привязка IP с помощью параметров командной строки --replSet и --bind_ip:
mongod --replSet "rs0" --bind_ip localhost,<hostname(s)|ip address(es)>
Для
укажите имя хоста и/или IP-адрес экземпляра mongod, который удаленные клиенты (включая других членов набора реплик) могут использовать для подключения. Кроме того, имя набора реплик и IP-адрес также можно указать в файле конфигурации.Чтобы запустить mongod с файлом конфигурации, используйте параметр --config, чтобы указать путь к файлу конфигурации: replication: replSetName: "rs0" net: bindIp: localhost,<hostname(s)|ip address(es)> mongod --config <path-to-config>
-
Подключитесь к одному из экземпляров mongod с помощью оболочки mongo, запустите оболочку mongo с того же компьютера, на котором запущен один из mongod (mongodb0.example.net в этом руководстве). Чтобы подключиться к mongod, прослушивающему локальный хост через порт по умолчанию 27017, просто укажите mongo.
-
Чтобы запустить набор реплик, запустите rs.initiate() только на одном и только одном экземпляре mongod набора реплик, например, запустив rs.initiate() на члене набора реплик 0:
rs.initiate( { _id : "rs0", members: [ { _id: 0, host: "mongodb0.example.net:27017" }, { _id: 1, host: "mongodb1.example.net:27017" }, { _id: 2, host: "mongodb2.example.net:27017" } ] })
-
Чтобы просмотреть конфигурацию набора реплик, используйте rs.conf() для отображения объекта конфигурации набора реплик. Например, объект конфигурации набора реплик выглядит следующим образом:
{ "_id" : "rs0", "version" : 1, "protocolVersion" : NumberLong(1), "members" : [ { "_id" : 0, "host" : "mongodb0.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 1, "host" : "mongodb1.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "mongodb2.example.net:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : -1, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("585ab9df685f726db2c6a840") } }
-
Убедитесь, что в наборе реплик есть первичная реплика, используйте rs.status(), чтобы увидеть первичный узел набора реплик.
Развертывание приложений наборов реплик в средах тестирования и разработки
В этом тесте, а также в развертывании для разработки три участника работают на одном компьютере.
-
Привязка IP: использование параметра bind_ip гарантирует, что MongoDB прослушивает подключения от приложений по настроенному адресу. Перед привязкой к нелокальному (например, общедоступному) IP-адресу убедитесь, что ваш кластер защищен от несанкционированного доступа. Например, следующий экземпляр mongod привязан к локальному хосту и имени хоста TestHostname, которое связано с IP-адресом 198.51.100.1:
mongod --bind_ip localhost,TestHostname
Чтобы подключиться к этому экземпляру, удаленные клиенты должны указать имя хоста или связанный с ним IP-адрес 198.51.100.1:
mongo --host TestHostname mongo --host 198.51.100.1
-
Создайте необходимые каталоги данных для каждого члена, введя команду, подобную следующей: это создаст каталоги с именами «rs0-0», «rs0-1» и «rs0-2», которые будут содержать файлы базы данных для экземпляра, пример следующий:
mkdir -p / srv / mongodb / rs0-0 / srv / mongodb / rs0-1 / srv / mongodb / rs0-2
-
Запустите экземпляр mongod в его собственном окне оболочки, введя следующую команду:
//不同的三个节点: mongod --replSet rs0 --port 27017 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-0 --smallfiles --oplogSize 128 mongod --replSet rs0 --port 27018 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-1 --smallfiles --oplogSize 1284 mongod --replSet rs0 --port 27019 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-2 --smallfiles --oplogSize 128
- При этом каждый экземпляр запускается как член набора реплик с именем rs0, каждый из которых работает на своем порту, а параметр --dbpath указывает путь к каталогу данных. Если вышеуказанный порт уже используется, выберите другой порт.
- Экземпляр привязан к локальному хосту и IP-адресу хоста.
- Параметры --smallfiles и --oplogSize уменьшают дисковое пространство, используемое каждым экземпляром mongod. [1] Это идеально подходит для тестирования и развертывания разработки, поскольку предотвращает перегрузку компьютера. Дополнительные сведения об этих и других параметрах конфигурации см. в разделе (docs.MongoDB.com/manual/ref E…)
-
Чтобы подключиться к одному из экземпляров mongod через оболочку mongo, вам нужно указать какой экземпляр, указав номер порта. Предположим, что выбран первый, как в следующей команде:
mongo --port 27017
-
В оболочке mongo используйте rs.initiate() для запуска набора реплик, в основном для создания объекта конфигурации набора реплик в среде оболочки mongo и замены его именем хоста системы, а затем передайте файл rsconf в rs.initiate (), следующим образом Пример показывает:
rsconf = { _id: "rs0", members: [ { _id: 0, host: "<hostname>:27017" }, { _id: 1, host: "<hostname>:27018" }, { _id: 2, host: "<hostname>:27019" } ] } rs.initiate( rsconf )
6. Отобразите текущую конфигурацию реплики, введя команду rs.conf(): rs.conf(), используйте операцию rs.status() для проверки состояния набора реплик в любое время. Объект конфигурации набора реплик выглядит следующим образом:
{
"_id" : "rs0",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "<hostname>:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "<hostname>:27018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "<hostname>:27019",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("598f630adc9053c6ee6d5f38")
}
}
Узел арбитра добавлен в набор реплик
Узлы-арбитры — это экземпляры mongod, которые являются частью набора реплик, но не содержат данных. Арбитражные узлы участвуют в выборах для разрыва связей. Если набор реплик имеет четное число элементов, добавьте арбитра.
Арбитражные узлы требуют минимальных ресурсов и не требуют специального оборудования. Вы можете развернуть арбитр на сервере приложений или хосте мониторинга. Не запускайте арбитр в системе, в которой также размещены первичные или вторичные узлы-члены набора реплик.
Узел кворума не хранит данные, но до того, как процесс mongod узла кворума будет добавлен в набор реплик, узел кворума будет работать как любой другой процесс mongod и запускать набор файлов данных и полноразмерный журнал.
-
Создайте каталог данных (например, storage.dbPath) для узла кворума. Экземпляр mongod использует этот каталог для данных конфигурации. Этот каталог не будет содержать наборы данных. Например, создайте каталог /data/arb:
mkdir /data/arb
-
Запустите узел арбитра, указав каталог данных и имя набора реплик для присоединения. Следующее запускает кворум, используя /data/arb в качестве dbPath и rs в качестве имени набора реплик:
mongod --port 27017 --dbpath /data/arb --replSet rs --bind_ip localhost,<hostname(s)|ip address(es)>
-
Подключитесь к основному и добавьте арбитра в набор реплик. , используя метод rs.addArb(), как показано в следующем примере, в котором предполагается, что m1.example.net — это имя хоста, связанное с указанным IP-адресом узла-арбитра:
rs.addArb("m1.example.net:27017") //此操作添加在m1.example.net主机上的端口27017上运行的仲裁器。
Один экземпляр превратился в набор реплик
Процесс преобразования автономного экземпляра mongod в набор реплик. Используйте автономные экземпляры для тестирования и разработки, но всегда используйте наборы реплик в рабочей среде. Этот процесс специфичен для экземпляров, которые не являются частью сегментированного кластера. Конкретный процесс выглядит следующим образом:
-
Закройте одноэкземплярный mongod.
-
Перезапустите экземпляр. Используйте параметр --replSet, чтобы указать имя нового набора реплик. Например, следующая команда запускает автономный экземпляр как член нового набора реплик с именем rs0. Команда использует существующий путь к базе данных автономного /srv/mongodb/db0:
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost,<hostname(s)|ip address(es)>
-
Подключите оболочку mongo к экземпляру mongod.
-
Запустите новый набор реплик, используя rs.initiate(): rs.initiate() Набор реплик теперь работает. Чтобы просмотреть конфигурацию набора реплик, используйте rs.conf(). Чтобы проверить статус набора реплик, используйте rs.status().
добавить новый узел
В наборе реплик может быть до семи членов с правом голоса. Чтобы добавить члена в набор реплик, в котором уже есть семь членов с правом голоса, вы должны добавить члена в качестве члена без права голоса или удалить голосование из существующего члена. Эти процедуры можно использовать для добавления новых элементов в существующий набор. Вы также можете «повторно добавить» удаленных участников, используя тот же процесс. Если данные удаленного участника все еще относительно новые, их легко восстановить.
Если у вас есть резервные копии или моментальные снимки существующих участников, вы можете переместить файлы данных (например, каталоги dbPath) в новую систему и использовать их для быстрого запуска новых участников. Файл должен быть допустимой копией файла данных члена того же набора реплик.
Подготовить каталог данных
Перед добавлением нового элемента в существующий набор реплик используйте одну из следующих стратегий для подготовки каталога данных нового элемента.
- Убедитесь, что каталог данных нового члена не содержит данных. Новые участники будут копировать данные существующих участников.
- Если новый участник находится в процессе восстановления, он должен выйти и стать вторичным участником, прежде чем MongoDB сможет реплицировать все данные в процессе репликации. Этот процесс требует времени, но не требует вмешательства администратора.
- Вручную скопируйте каталог данных из существующего элемента. Новый член станет вторичным членом и будет синхронизировать текущее состояние набора реплик. Дублирование данных может сократить время, необходимое для обновления новых участников.
- Убедитесь, что вы можете скопировать каталог данных на нового члена и начать копирование в пределах окна, разрешенного оплогом. В противном случае новый экземпляр должен выполнить первоначальную синхронизацию, что приведет к полной повторной синхронизации данных, как описано в разделе Повторная синхронизация элементов набора реплик.
- Используйте rs.printReplicationInfo(), чтобы проверить текущее состояние члена набора реплик по отношению к оплогу.
Конкретные шаги
-
Запустите новый экземпляр mongod. Укажите каталог данных и имя набора реплик. В следующем примере указывается каталог данных /srv/mongodb/db0 и набор реплик rs0:
mongod --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost,<hostname(s)|ip address(es)>
Каталог данных, имя набора реплик и привязку ip можно указать в файле конфигурации mongod.conf и запустить mongod с помощью следующей команды:
mongod --config /etc/mongod.conf
-
При подключении к основному узлу набора реплик элементы можно добавлять только при подключении к основному узлу. Если вы не знаете, какой элемент является главным узлом, войдите в любой элемент набора реплик и введите команду db.isMaster().
-
Используйте rs.add() для добавления новых элементов в набор реплик. Передайте документ конфигурации члена методу. Например, чтобы добавить участника на хост mongodb3.example.net, введите следующую команду:
rs.add( { host: "mongodb3.example.net:27017", priority: 0, votes: 0 } )
-
Убедитесь, что новый участник достиг статуса SECONDARY. Чтобы проверить статус членов набора реплик, запустите rs.status(): rs.status()
-
Как только вновь добавленный участник перейдет в состояние SECONDARY, используйте rs.reconfig(), чтобы обновить приоритет вновь добавленного участника и проголосовать по мере необходимости. Например, если rs.conf() возвращает документ конфигурации для mongodb3.example.net:27017 в качестве пятого элемента в массиве участников, чтобы обновить его приоритет и проголосовать за 1, используйте следующую последовательность операций:
var cfg = rs.conf(); cfg.members[4].priority = 1 cfg.members[4].votes = 1 rs.reconfig(cfg)
ПРИМЕЧАНИЕ. Если у недавно добавленного вторичного сервера параметры голосования и приоритета больше нуля, во время начальной синхронизации этот вторичный сервер по-прежнему считается участником с правом голоса, даже если он не может обслуживать операции чтения и не может стать основным, поскольку его данные еще не согласованы. Это может привести к ситуации, когда большинство членов с правом голоса находятся в сети, но ни один из основных членов не может быть избран. Чтобы избежать этого, рассмотрите возможность первоначального добавления новых вторичных приоритетов: 0 и голосов: 0. Затем, как только участник перейдет в состояние SECONDARY, используйте rs.reconfig(), чтобы обновить его приоритет и проголосовать.
удалить узел
Используйте rs.remove() для удаления процесса
-
Завершите работу экземпляра mongod удаляемого члена. Чтобы закрыть экземпляр, подключитесь с помощью оболочки mongo и метода db.shutdownServer().
-
Подключитесь к текущему основному набору реплик. Чтобы определить текущий мастер, используйте db.isMaster() при подключении к любому члену набора реплик.
-
Удалите член, используя одну из следующих форм rs.remove():
rs.remove("mongod3.example.net:27017") rs.remove("mongod3.example.net") ПРИМЕЧАНИЕ. MongoDB может ненадолго отключить оболочку, если набору реплик необходимо выбрать новый основной сервер. В этом случае оболочка автоматически переподключится. Оболочка может отображать ошибку DBClientCursor::init call() failed, даже если команда выполнена успешно.
Используйте rs.reconfig() для удаления процесса
-
Завершите работу экземпляра mongod удаляемого члена. Чтобы закрыть экземпляр, подключитесь с помощью оболочки mongo и метода db.shutdownServer().
-
Подключитесь к текущему основному набору реплик. Чтобы определить текущий мастер, используйте db.isMaster() при подключении к любому члену набора реплик.
-
Выполните метод rs.conf(), чтобы просмотреть текущий документ конфигурации и определить позицию удаляемого элемента в массиве элементов, например, mongod_C.example.net находится на позиции 2 в следующем файле конфигурации:
{ "_id" : "rs", "version" : 7, "members" : [ { "_id" : 0, "host" : "mongod_A.example.net:27017" }, { "_id" : 1, "host" : "mongod_B.example.net:27017" }, { "_id" : 2, "host" : "mongod_C.example.net:27017" } ]
}
-
Назначьте текущий документ конфигурации переменной cfg, измените объект cfg, чтобы удалить элемент, и перезапустите новую конфигурацию, как в следующем примере:
cfg = rs.conf() cfg.members.splice(2,1) rs.reconfig(cfg)
-
Чтобы подтвердить, что новая конфигурация вступила в силу, вызовите rs.conf(). Например, вывод будет:
{ "_id" : "rs", "version" : 8, "members" : [ { "_id" : 0, "host" : "mongod_A.example.net:27017" }, { "_id" : 1, "host" : "mongod_B.example.net:27017" } ] }
Суммировать
В продолжении также процесс построения шардинга на практике, а также анализ принципа шардинга и наборов реплик.
Наконец, вы можете обратить внимание на публичный аккаунт, учиться вместе, делиться галантерейными товарами каждый день и получать обучающие видео!