MongoDB Как узнать IP-адрес первичного сервера БД в наборе реплик?
Я запускаю реплику mongodb, установленную на 3 узла, позволяет их ip 192.168.1.100, 192.168.1.101,192.168.1.102
теперь в текущем наборе реплик 192.168.1.100 является первичным, а 192.168.1.101 и 192.168.1.102 являются вторичными, мое приложение подключается к 192.168.1.100 для операций записи. Теперь через 2 дня 192.168.1.100 отключается, а mongodb выбирает 192.168.1.101 как первичный. как мое приложение знает 192.168.1.101 является основным.
- это их любая плавающая концепция ip в mongodb, так что ручная работа не требуется, когда первичный сервер переключается в наборе реплик.
Ответы
Ответ 1
По-видимому, вы сможете использовать свой "драйвер" (инструмент mongo cli или предпочитаемый язык, ex node -mongo) для подключения к любому члену набора реплик. После подключения просто спросите текущий mongod для других членов набора:
> db.runCommand("ismaster")
{
"ismaster" : false,
"secondary" : true,
"hosts" : [
"ny1.acme.com",
"ny2.acme.com",
"sf1.acme.com"
],
"passives" : [
"ny3.acme.com",
"sf3.acme.com"
],
"arbiters" : [
"sf2.acme.com",
]
"primary" : "ny2.acme.com",
"ok" : true
}
Для моего использования важно НЕ подключаться к основному. Подобно OP, я хочу минимизировать количество соединений, необходимых для поиска вторичного элемента. Этот метод должен работать для вас, но документация здесь может быть немного устаревшей.
http://docs.mongodb.org/meta-driver/latest/legacy/connect-driver-to-replica-set/
Ответ 2
Когда ваш клиент подключается к любому данному члену в наборе реплик ( "семя" ), он будет запрашивать набор реплик для других членов в наборе. Поэтому, если вы подключитесь к .100, он запросит набор и найдет, что .101 и .102 также являются допустимыми членами набора.
Если драйвер теряет свое соединение с .100, он будет запускаться через другие найденные семена и попытаться найти соединение. Как только это произойдет, он запросит набор реплик, узнает, кто является текущим мастером, и подключится к нему. Все это происходит прозрачно.
Вы можете проверить это, войдя в мастер и выполнив следующее:
rs.stepDown(60)
Это заставит машину уйти в отставку как мастер (и вызвать выбор нового мастера). Он не будет иметь право на переизбрание на 60 секунд. Вы можете использовать это, чтобы проверить поведение вашего приложения в обстоятельствах, когда изменяется первичный node.
Когда вы настраиваете соединение с репликацией, вы обычно укажете несколько хостов для подключения. Все они служат семенами для использования драйвером для сопоставления набора реплик, так что у вас нет единственной точки сбоя, если вы перезапустите приложение, пока установленный вами единственный хост отключен. Специфика этого будет зависеть от того, какой драйвер вы используете, - проверьте документацию вашего драйвера.
Ответ 3
Чтобы выяснить, какой текущий IP-адрес первичного сервера запускается из командной строки:
rs.status().members.find(r=>r.state===1).name
В зависимости от стека приложений и драйвера вам может потребоваться указать все хосты в реплике для автоматического выбора первичного для записи.