Elasticsearch集群搭建:3节点生产环境实操教程
搭建 Elasticsearch 集群的核心是三件事:让各节点能互相发现、让主节点选举稳定、让分片能正常分配。
下面以 3 台 Linux 服务器、Elasticsearch 7.x 或 8.x 为例,给出一套可直接照做的流程。
准备阶段:系统与网络条件
三台机器建议配置一致,至少 4 核 8G 内存,磁盘用 SSD。
假设 IP 为:
- node-1:192.168.1.101
- node-2:192.168.1.102
- node-3:192.168.1.103
每台机器先做三件事:
- 关闭防火墙或放行 9200、9300 端口。
- 设置主机名并写入
/etc/hosts,保证三台机器能互相解析。 - 创建专用用户,Elasticsearch 不允许用 root 直接启动。
# 设置主机名(每台机器改成自己的名字)
hostnamectl set-hostname node-1
# 三台机器都追加 hosts
echo "192.168.1.101 node-1" >> /etc/hosts
echo "192.168.1.102 node-2" >> /etc/hosts
echo "192.168.1.103 node-3" >> /etc/hosts
# 创建用户
useradd esuser
passwd esuser
系统参数也要调,否则启动时会报 max virtual memory areas vm.max_map_count is too low。
# 临时生效
sysctl -w vm.max_map_count=262144
# 永久生效
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p
同时修改文件句柄限制,在 /etc/security/limits.conf 末尾加入:
esuser soft nofile 65536
esuser hard nofile 65536
esuser soft nproc 4096
esuser hard nproc 4096
安装 Elasticsearch 并配置集群参数
三台机器都执行相同安装步骤。
以 tar.gz 包为例,上传到 /opt 后解压:
tar -zxvf elasticsearch-7.17.0-linux-x86_64.tar.gz -C /opt/
chown -R esuser:esuser /opt/elasticsearch-7.17.0
接着编辑 /opt/elasticsearch-7.17.0/config/elasticsearch.yml,三台机器只有 node.name 不同:
cluster.name: es-prod-cluster
node.name: node-1
path.data: /opt/elasticsearch-7.17.0/data
path.logs: /opt/elasticsearch-7.17.0/logs
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.1.101:9300", "192.168.1.102:9300", "192.168.1.103:9300"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
几个关键点:
cluster.name三台必须完全一致,否则不会组成同一集群。node.name必须唯一,建议与主机名一致,方便排查。network.host写0.0.0.0允许外部访问,生产环境应配合防火墙限制来源。discovery.seed_hosts列出所有候选节点,用于节点发现。cluster.initial_master_nodes只在集群首次启动时使用,集群稳定后不要依赖它反复重启。
如果使用 Elasticsearch 8.x,默认开启安全认证,首次启动会生成密码和证书。
若只是内网测试,可在配置中关闭安全功能;
生产环境则建议保留并配置 TLS。
具体以对应版本文档为准。
启动集群与状态验证
依次在三台机器上用 esuser 启动:
su - esuser
cd /opt/elasticsearch-7.17.0
./bin/elasticsearch -d
首次启动建议先不加 -d,直接前台运行,观察日志里有没有报错。
确认无误后再后台启动。
验证集群是否正常,常用三个命令:
# 查看节点列表
curl -XGET 'http://192.168.1.101:9200/_cat/nodes?v'
# 查看集群健康状态
curl -XGET 'http://192.168.1.101:9200/_cluster/health?pretty'
# 查看分片分配
curl -XGET 'http://192.168.1.101:9200/_cat/shards?v'
健康状态 green 表示主分片和副本分片都正常;yellow 表示主分片正常但副本未分配,单节点集群常见,三节点集群如果出现 yellow,要检查副本数和节点数是否匹配。
容易踩的坑
- 内存锁定失败:日志出现
memory locking requested for elasticsearch process but memory is not locked,需要在elasticsearch.yml里设置bootstrap.memory_lock: true,并确保limits.conf中的memlock为unlimited。 - 节点无法发现彼此:先确认 9300 端口互通,再检查
discovery.seed_hosts是否写错 IP 或端口。 initial_master_nodes重复使用:该配置只在集群第一次初始化时生效,已有数据的集群重启时不要随意修改节点名或该列表,否则可能触发重新选举。- 磁盘水位触发只读:默认磁盘使用超过 85% 会触发分片只读,需及时清理或调整
cluster.routing.allocation.disk.watermark阈值。 - JVM 堆内存设置过大:
jvm.options中-Xms和-Xmx建议设为物理内存的一半,且不超过 31G,否则会浪费指针压缩优化。
集群稳定后的常规检查
集群跑起来后,建议把以下检查做成日常巡检项:
- 用
_cluster/health确认状态不是red。 - 用
_cat/nodes?v确认三台节点都在线。 - 用
_cat/indices?v观察索引和分片数量是否合理。 - 检查日志目录下
es-prod-cluster.log有无持续报错。
如果后续需要扩容,新节点只需保证 cluster.name 一致、discovery.seed_hosts 指向现有节点,启动后会自动加入集群。
常见问题
Q:三台机器都启动成功,但集群显示 red 怎么办?
先查 _cluster/health? 看未分配分片数量,再用
pretty_cat/shards? 定位具体索引。
v
常见原因是节点磁盘水位过高或分片分配规则冲突,处理后再用 _cluster/reroute 手动触发分配。
Q:能不能只搭两个节点?
可以,但两个节点无法形成多数派,主节点选举容易出问题。
生产环境建议至少三个专用主节点候选,避免脑裂。
Q:Elasticsearch 8.x 还需要手动配置 initial_master_nodes 吗?
8.x 默认启用安全功能,首次启动会自动完成部分初始化流程。
如果手动配置集群,仍需根据实际版本确认发现和选举相关参数,不要直接套用 7.x 配置。
到这里,一个基础的三节点 Elasticsearch 集群就搭建完成。
后续可以根据业务量调整分片数、副本数和 JVM 参数,但每次调整前先在测试环境验证,避免直接影响线上检索。