Настройка кластеризованного elasticsearch (два главных узла)

#elasticsearch #dotcms

#elasticsearch #dotcms

Вопрос:

В настоящее время мы настраиваем среду с двумя экземплярами elasticsearch (кластеризованные серверы).

Поскольку он кластеризован, нам нужно убедиться, что данные (индексы) синхронизированы между двумя экземплярами.

У нас нет возможности настроить дополнительный (3-й) сервер / экземпляр в качестве «главного».

Поэтому мы настроили оба экземпляра как основные, так и узлы данных. Таким образом, экземпляр 1 является master amp; node, а экземпляр 2 также является master amp; node.

Синхронизация работает нормально, когда оба экземпляра запущены и запущены. Но когда один экземпляр не работает, другой экземпляр продолжает пытаться подключиться к экземпляру, который не работает, что, очевидно, завершается неудачей, потому что экземпляр не работает. Поэтому узел, который включен, также больше не функционирует, поскольку он не может подключиться к своему «главному» узлу (который является узлом, который отключен), хотя сам экземпляр также является «главным».

В этом случае регистрируются следующие ошибки:

  • org.elasticsearch.cluster.block.Исключение ClusterBlockException: заблокировано: [SERVICE_UNAVAILABLE/2/ нет ведущего];
  • org.elasticsearch.transport.Исключение ConnectTransportException: [xxxxx-xxxxx-2][xx.xx.xx.xx:9300] исключение connect_exception
  • Вызвано: io.netty.channel.AbstractChannel $ AnnotatedConnectException: отказано в подключении: нет дополнительной информации: xx.xx.xx.xx / xx.xx.xx.xx.xx:9300

Короче говоря: два экземпляра elasticsearch master в кластерной настройке. Когда один не работает, другой не работает, потому что он не может подключиться к экземпляру «master».

Желаемый результат: если один из основных экземпляров не работает, другой должен продолжать функционировать (без ошибок).

Любые рекомендации о том, как решить эту проблему, без необходимости настраивать дополнительный сервер, который является «ведущим», а остальные 2 — «подчиненными»?

Спасибо

Ответ №1:

Чтобы иметь возможность голосовать, мастеров должно быть не менее 2. Вот почему у вас должно быть минимум 3 главных узла, если вы хотите, чтобы ваш кластер сопротивлялся потере одного узла.

Вы можете просто добавить специализированный небольшой главный узел, установив для всех остальных ролей значение false. У этого узла может быть очень мало ресурсов . Как описано в этом сообщении : https://discuss.elastic.co/t/master-node-resource-requirement/84609
Выделенным главным узлам требуется постоянное хранилище, но его не так много. 1-2 ядра процессора и 2-4 ГБ оперативной памяти часто достаточно для небольших развертываний. Поскольку выделенные главные узлы не хранят данные, вы также можете установить для кучи более высокий процент (75%-80%) от общего объема оперативной памяти, который рекомендуется для узлов данных.

Ответ №2:

Если нет опций для увеличения еще на 1 узел, вы можете установить
minimum_master_nodes= 1 . Это позволит вашему кластеру es работать, даже если 1 узел запущен. Но это может привести к проблеме разделения мозга, поскольку мы ограничили видимость только 1 узла для формирования кластера. В этом случае вам необходимо перезапустить кластер, чтобы разрешить разделение мозга.

Я бы посоветовал вам перейти на elasticsearch 7.0 или выше. Там вы можете работать с двумя узлами, каждый из которых имеет право на мастер, и проблема с разделением мозга не возникнет.

Ответ №3:

У вас не должно быть 2 основных подходящих узла в кластере, так как это очень рискованно и может привести к проблеме разделения мозга.

Основные узлы не требуют много ресурсов, но, поскольку у вас всего два узла данных, вы все равно можете обойтись без выделенных основных узлов (но, пожалуйста, имейте в виду, что у этого есть недостатки), чтобы просто сэкономить.

Итак, просто удалите главную роль с другого узла, и все будет готово.