Подтвердить что ты не робот

Запустите script против набора реплик в MongoDB

У меня есть набор реплик из 3 узлов, и я хочу запустить очистку script против него каждый конец дня. Что бы я сделал, если бы был только один node, был бы простой bash script:

~/mongo/bin/mongo host:port cleanupScript.js

Но так как я хочу запустить тот же script против набора реплик, я не могу использовать этот подход. Мне нужно каким-то образом найти, какой из node является основным, и запустить script против этого node.

Итак, вопрос: есть ли способ запустить script для всей совокупности реплик, а процесс mongo выбрать первичный node и выполнить на нем?

Спасибо!

4b9b3361

Ответ 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

Я бы хотел, чтобы у меня был лучший ответ для вас.