Кластер OpenSearch состоит из нескольких серверов (узлов), работающих как единое целое. Кластеризация - это технология, позволяющая масштабировать OpenSearch до сотен узлов, способных хранить многие терабайты данных и согласованно отвечать на большое количество запросов одновременно.
Запросы на поиск или индексирование обычно балансируются по нагрузке между узлами данных OpenSearch, а узел, получивший запрос, при необходимости передает его другим узлам и координирует ответ пользователю.
Примечания и полезные сведения
Ключевыми элементами кластеризации являются:
- Состояние кластера - информация о том, какие индексы входят в кластер, их маппинги данных и другая информация, которая должна быть совместно использована всеми узлами для обеспечения согласованности всех операций в кластере.
- Мастер-узел - в каждом кластере должен быть выбран один мастер-узел, отвечающий за координацию работы кластера и обеспечивающий наличие на каждом узле актуальной копии состояния кластера.
- Формирование кластера - OpenSearch требует набора конфигураций, определяющих, как формируется кластер, какие узлы могут присоединиться к нему и как узлы коллективно выбирают главный узел, отвечающий за контроль состояния кластера. Эти конфигурации обычно хранятся в конфигурационном файле opensearch.yml, переменных окружения на узле или в состоянии кластера.
- Роли узлов - В небольших кластерах обычно все узлы выполняют все роли; все узлы могут хранить данные, становиться мастер-узлами или обрабатывать конвейеры ввода. Однако по мере роста кластера для упрощения конфигурирования и повышения эффективности работы узлов принято распределять между ними определенные роли. В частности, принято определять ограниченное число выделенных мастер-узлов.
- Репликация - данные могут быть реплицированы на нескольких узлах данных. Это означает, что в случае выхода из строя одного узла данные не будут потеряны. Это также означает, что поисковый запрос может быть обработан более чем одним узлом.
Общие проблемы
Многие проблемы OpenSearch вызваны операциями, которые создают чрезмерную нагрузку на кластер, поскольку требуют хранения и передачи между узлами чрезмерного количества информации, являющейся частью состояния кластера. Например:
- Слишком маленькие шарды
- Слишком большое количество полей (взрыв полей).
Проблемы также могут быть вызваны неадекватными конфигурациями, приводящими к ситуациям, когда кластер OpenSearch не может безопасно выбрать ведущий узел. К таким проблемам относятся:
- Мастер-узел не обнаружен
- Проблема разделенного мозга
Резервные копии
Поскольку OpenSearch является кластерной технологией, недостаточно иметь резервные копии каталога данных каждого узла. Это связано с тем, что резервные копии были сделаны в разное время, и поэтому между ними может не быть полной согласованности. Поэтому единственным способом резервного копирования кластера OpenSearch является использование моментальных снимков, которые содержат полную картину индекса в любой момент времени.
Устойчивость кластера
При проектировании кластера OpenSearch важно подумать об устойчивости кластера. В частности, что произойдет, если выйдет из строя один узел? А для больших кластеров, где несколько узлов могут совместно использовать общие сервисы, такие как сеть или источник питания, - что произойдет, если сеть или источник питания выйдут из строя? В этом случае полезно обеспечить распределение основных узлов по зонам доступности, а также использовать распределение шардов по разным стойкам или зонам доступности в центре обработки данных.
Контекст журнала
Имя класса "отключенного" журнала - LeaderChecker.java. Для тех, кто ищет более подробный контекст, мы извлекли из исходного кода OpenSearch следующее:
1 2 3 4 5 6 7 | } void handleDisconnectedNode(DiscoveryNode discoveryNode) { if (discoveryNode.equals(leader)) { logger.debug("leader [{}] disconnected"; leader); leaderFailed(new NodeDisconnectedException(discoveryNode; "disconnected")); } } private void scheduleNextWakeUp() { logger.trace("scheduling next check of {} for [{}] = {}"; leader; LEADER_CHECK_INTERVAL_SETTING.getKey(); leaderCheckInterval);<p></p> |