Налаштування кластера Elasticsearch
Кластер Elasticsearch — кілька вузлів, що координують індексування та пошук. Один вузол — ризик: втрата даних при збої сервера, нема розподілу шардів. Мінімальний продакшен кластер: 3 вузли (master quorum = 2).
Docker Compose кластер
version: '3.8'
services:
es-master-1:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
environment:
- cluster.name=prod-cluster
- node.name=master-1
- node.roles=master,data
- discovery.seed_hosts=es-master-1,es-master-2,es-master-3
- cluster.initial_master_nodes=master-1,master-2,master-3
- xpack.security.enabled=false
- ES_JAVA_OPTS=-Xms2g -Xmx2g
volumes:
- esdata1:/usr/share/elasticsearch/data
ports:
- "9201:9200"
healthcheck:
test: curl -s http://localhost:9200/_cluster/health | grep status
interval: 10s
timeout: 5s
retries: 5
es-master-2:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
environment:
- cluster.name=prod-cluster
- node.name=master-2
- node.roles=master,data
- discovery.seed_hosts=es-master-1,es-master-2,es-master-3
- cluster.initial_master_nodes=master-1,master-2,master-3
- xpack.security.enabled=false
- ES_JAVA_OPTS=-Xms2g -Xmx2g
volumes:
- esdata2:/usr/share/elasticsearch/data
ports:
- "9202:9200"
es-master-3:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
environment:
- cluster.name=prod-cluster
- node.name=master-3
- node.roles=master,data
- discovery.seed_hosts=es-master-1,es-master-2,es-master-3
- cluster.initial_master_nodes=master-1,master-2,master-3
- xpack.security.enabled=false
- ES_JAVA_OPTS=-Xms2g -Xmx2g
volumes:
- esdata3:/usr/share/elasticsearch/data
ports:
- "9203:9200"
kibana:
image: docker.elastic.co/kibana/kibana:8.11.0
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://es-master-1:9200
volumes:
esdata1:
esdata2:
esdata3:
Перевірка здоров'я кластера
curl -s http://localhost:9200/_cluster/health | jq
# Вивід:
# {
# "cluster_name": "prod-cluster",
# "status": "green", # green = всі шарди розподілені
# "timed_out": false,
# "number_of_nodes": 3,
# "number_of_data_nodes": 3,
# "active_primary_shards": 5,
# "active_shards": 10
# }
Стратегія шардів
# Для індексу з 100 ГБ даних, 3 вузли:
# - 3 первинних шарди (по одному на вузол)
# - 2 реплики (всього 9 шардів)
curl -X PUT "localhost:9200/my_index" \
-H 'Content-Type: application/json' \
-d '{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2,
"index.refresh_interval": "30s"
}
}'
Ролі вузлів
# Вузол master (обирає лідерів)
node.roles: [ master ]
# Вузол data (зберігає шарди)
node.roles: [ data ]
# Вузол ingest (попередня обробка документів)
node.roles: [ ingest ]
# Комбінований (всі ролі)
node.roles: [ master, data, ingest ]







