Запустите script против набора реплик в MongoDB
У меня есть набор реплик из 3 узлов, и я хочу запустить очистку script против него каждый конец дня. Что бы я сделал, если бы был только один node, был бы простой bash script:
~/mongo/bin/mongo host:port cleanupScript.js
Но так как я хочу запустить тот же script против набора реплик, я не могу использовать этот подход. Мне нужно каким-то образом найти, какой из node является основным, и запустить script против этого node.
Итак, вопрос: есть ли способ запустить script для всей совокупности реплик, а процесс mongo
выбрать первичный node и выполнить на нем?
Спасибо!
Ответы
Ответ 1
Mongo shell может напрямую подключаться к набору реплик - это работает с 2.4 (текущим), 2.2 (предыдущим) и 2.0 (версия до этого).
Предполагая, что у вас есть набор реплик, называемый myrs, а ваши хосты - host1: 27017 и т.д., используйте следующий синтаксис:
mongo -host myrs/host1:27017
Оболочка выяснит остальную часть, включая соединение с первичным, и если основные шаги вниз или исчезнут, он снова подключится к новому первичному, когда он будет выбран.
Ответ 2
Обычно я устанавливаю приоритет для node в replicaset. Это дает мне свободу выбора, какой node должен получать нагрузку на чтение и запись.
В вашем случае, я думаю, если вы установите приоритет для узлов, вы всегда можете запустить свой script с наивысшим приоритетом node, так как node будет основным почти все время.
Приоритет настройки довольно прост и прост. Вы можете проверить эту ссылку http://docs.mongodb.org/manual/tutorial/force-member-to-be-primary/
Я надеюсь, что это решит вашу проблему.
OKAY.... Возможно, это то, что вам нужно.
#!/bin/bash
PRIMARY=`~/mongo/bin/mongo localhost:27017 --eval "printjson(rs.isMaster())" | grep "primary" | cut -d"\"" -f4`
echo "$PRIMARY"
~/mongo/bin/mongo "$PRIMARY" cleanupScript.js
Запустите это на любом node, и он даст вам "сервер: порт" первичного. Дайте полный путь к исполняемому файлу mongo. Чтобы избежать ошибок.
PS: вся команда находится в backticks. Каким-то образом это не видно, поэтому вам следует сказать вам.
Ответ 3
К сожалению, оболочка 'mongo' не поддерживает подключение к набору реплик: только для отдельных узлов. Если вы хотите сделать это, у вас есть два варианта:
- Используйте другой язык, который поддерживает подключение к набору реплик. (PHP, Python, Perl, Java и Ruby поддерживают это.)
- Имейте драйвер script, который запускает команду 'rs.status()', анализирует вывод этой команды и определяет текущий первичный. Если вы не подключили node, а затем снова подключитесь к правильному первичному node
Я бы хотел, чтобы у меня был лучший ответ для вас.