深色模式
ElasticSearch 集群
摘要:Elasticsearch 的稳定运行依赖清晰的角色划分与正确的发现/选主配置。本文部署一个三节点集群,讲清 master、data、ingest、coordinating 各角色职责,配置堆内存与系统参数,并验证集群健康状态。
适用环境
bash
java -version 2>&1 | head -1 # ES 自带 JDK,也可指定 JAVA_HOME
free -g # 堆内存不超过物理内存 50%,且 <= 31G
cat /proc/sys/vm/max_map_count # 要求 >= 262144
ulimit -n # 建议 >= 655351
2
3
4
2
3
4
操作步骤
1. 系统参数准备
bash
sudo tee /etc/sysctl.d/99-es.conf <<'EOF'
vm.max_map_count=262144
EOF
sudo sysctl --system
# 放开资源限制
sudo tee /etc/security/limits.d/es.conf <<'EOF'
elasticsearch soft nofile 65535
elasticsearch hard nofile 65535
elasticsearch soft nproc 4096
elasticsearch - memlock unlimited
EOF1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
2. 安装
bash
sudo tar -xzf elasticsearch-8.13.0-linux-x86_64.tar.gz -C /opt
sudo ln -sfn /opt/elasticsearch-8.13.0 /opt/elasticsearch
sudo useradd -r -s /sbin/nologin elasticsearch 2>/dev/null || true
sudo mkdir -p /data/es/{data,logs}
sudo chown -R elasticsearch:elasticsearch /data/es /opt/elasticsearch-8.13.01
2
3
4
5
2
3
4
5
3. 配置节点角色(config/elasticsearch.yml)
yaml
cluster.name: prod-es
node.name: es-master-1
node.roles: [ master ] # 专用主节点,只负责集群元数据与选主
path.data: /data/es/data
path.logs: /data/es/logs
network.host: 10.0.0.1
http.port: 9200
discovery.seed_hosts: ["10.0.0.1", "10.0.0.2", "10.0.0.3"]
cluster.initial_master_nodes: ["es-master-1", "es-master-2", "es-master-3"]1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
yaml
# 数据节点:只存数据、负责搜索与聚合
node.name: es-data-1
node.roles: [ data, ingest ]1
2
3
2
3
yaml
# 协调节点:不存数据不选主,只做请求分发与结果归并
node.name: es-coord-1
node.roles: [ ]1
2
3
2
3
4. 配置堆内存
bash
# config/jvm.options.d/heap.options
-Xms8g
-Xmx8g1
2
3
2
3
堆大小规则:Xms == Xmx,且不超过物理内存的 50%、不超过 31G(超过后 JVM 压缩指针失效,反而浪费内存)。
5. 启动集群
bash
sudo -u elasticsearch /opt/elasticsearch/bin/elasticsearch -d -p /tmp/es.pid
sudo tail -f /data/es/logs/prod-es.log # 看到 started 即成功1
2
2
6. 安全配置(8.x 默认开启 TLS 与认证)
bash
# 为内置用户设置密码
sudo /opt/elasticsearch/bin/elasticsearch-reset-password -u elastic
# 查看/创建集群证书
sudo /opt/elasticsearch/bin/elasticsearch-certutil ca1
2
3
4
2
3
4
验证
bash
# 1) 集群健康(green 最佳,yellow 表示有副本未分配,red 表示有主分片缺失)
curl -k -u elastic:'密码' 'https://127.0.0.1:9200/_cluster/health?pretty'
# 2) 节点列表与角色
curl -k -u elastic:'密码' 'https://127.0.0.1:9200/_cat/nodes?v&h=name,node.role,heap.percent,ram.percent,cpu,load_1m'
# 3) 分片分配情况
curl -k -u elastic:'密码' 'https://127.0.0.1:9200/_cat/allocation?v'
curl -k -u elastic:'密码' 'https://127.0.0.1:9200/_cat/shards?v' | grep -c UNASSIGNED || echo "0 unassigned"
# 4) 主节点是否已选出
curl -k -u elastic:'密码' 'https://127.0.0.1:9200/_cat/master?v'1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
常见坑
WARNING
vm.max_map_count 未调整会直接启动失败并报 max virtual memory areas ... is too low。改完记得 sysctl --system 或重启生效。
WARNING
集群健康为 yellow 且只有单节点时是正常现象(副本无处可放)。加数据节点后会自动转为 green;若为 red 则说明主分片缺失,必须立即处理。
DANGER
cluster.initial_master_nodes 只在首次集群引导时生效。集群已成型后该配置残留,节点重启时可能触发错误的引导流程甚至形成脑裂。上线后应移除该配置。