#mongodb #kubernetes #replicaset
Вопрос:
Я использую диаграмму управления Microk8s и bitnami здесь
Я настроил набор реплик из 3 реплик монго-0 (по определению это первично), монго-1 и монго-2
Bitnami заставляет набор реплик всегда использовать mongo-0 (если он доступен) в качестве первичной реплики. Однако может произойти следующее: я узнаю, что мне нужно обновить узлы, скажем, для увеличения объема хранилища. Чтобы сделать это, мне нужно было бы:
- Слейте воду с узла, на котором работает монго-0. Это автоматически запускает новые выборы, и, скажем, монго-1 является новым первичным кандидатом.
- Я добавлю в кластер новый узел (с большей емкостью).
Это заставит набор реплик mongodb назначить модуль mongo-0 новому узлу. Однако новый узел пуст, поэтому постоянный том, где я храню базу данных (скажем, /mnt/mongo), пуст.
Я ожидал бы, что текущая первичная реплика завершит заполнение базы данных новой репликой (mongo-0 и, следовательно, ее постоянный том), и только когда это будет сделано, сделайте mongo-0 основным.
Однако я видел, что mongo-0 становится основным без копирования в него каких-либо данных из предыдущего основного, эффективно удаляя всю базу данных, так как теперь основной узел утверждает, что база данных пуста.
Как это возможно? Что я здесь упускаю?
Ответ №1:
Я не знаком с вашими точными инструментами управления, но процесс масштабирования, который вы описали, неверен. Вы не должны удалять 1 из 3 узлов из набора реплик в любой момент, по крайней мере, не в производственной среде.
Для замены узла RS:
- Добавьте четвертый узел с нужными параметрами.
- Установите приоритеты узлов таким образом, чтобы узел, который вы хотите удалить, имел более низкий приоритет, чем любой другой узел.
- Подождите, пока у вновь добавленного узла не появится приемлемая задержка репликации.
- Убедитесь, что основной узел-это не тот узел, который вы хотите удалить.
- Удалите узел, который вы хотите удалить из RS.
Я бы сказал, что ожидать, что универсальное программное обеспечение автоматически определит, когда № 3 завершится, и правильно перейдет к № 4, довольно оптимистично. Может быть, менеджер операций MongoDB сделал бы это.
Ваш пост содержит ряд других неверных утверждений о том, как работает MongoDB. Например, узел, у которого нет данных, не может стать основным в наборе реплик с данными. Возможно, у вас возникли другие проблемы с конфигурацией, и у вас на самом деле есть независимые узлы/несколько наборов реплик в том, что вы считаете одним развертыванием.
Комментарии:
1. «Убедитесь, что основной узел-это не тот узел, который вы хотите удалить». Как заставить узел быть вторичным перед его заменой?
2. Вы не можете заставить узел быть основным, но при правильно установленных приоритетах вы можете практически гарантировать, что узел в конечном итоге станет основным, пока он может справляться с нагрузкой на запись. Чтобы убедиться, что узел не является основным, установите приоритеты, чтобы сделать какой-либо другой узел основным.