2. 集群部署实战:单节点与多节点部署、节点角色划分、JVM堆内存配置
好,咱们直接进入正题。上一章聊了ES的底层原理,这一章咱们动手干点实在的——部署集群。
说实话,我见过太多人一上来就搭个三节点集群,结果跑了两天就崩了。为啥?节点角色没分清楚,堆内存瞎配。今天咱们就把这些坑一个个填平。
2.1 单节点部署:快速上手
先说说单节点。很多新手觉得单节点就是“装个ES就能用”,其实没那么简单。
我个人习惯,单节点主要用于开发测试环境。生产环境?除非你的数据量极小,否则别这么干。
单节点部署要点:
- 下载ES压缩包,解压到指定目录
- 修改
elasticsearch.yml配置文件 - 启动ES,验证是否正常
举个例子,我常用的单节点配置长这样:
# elasticsearch.yml
cluster.name: my-es-cluster
node.name: node-1
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
注意最后一行 discovery.type: single-node。这个参数告诉ES:“我就一个节点,别去找其他节点了”。不加这个,单节点启动时会一直尝试发现其他节点,导致启动超慢。
小技巧: 启动后访问 http://localhost:9200/_cat/nodes?v,能看到节点状态。如果返回了节点信息,说明部署成功。
2.2 多节点部署:集群的基石
多节点部署才是生产环境的正解。但这里有个误区——很多人以为多节点就是复制几份配置文件,改个节点名就完事了。
嗯,没那么简单。
多节点部署的核心在于节点发现和选主机制。ES节点之间通过 discovery.seed_hosts 互相发现,然后通过 cluster.initial_master_nodes 确定初始主节点。
我曾经遇到过一个案例:某团队部署了5个节点,结果启动后集群一直处于黄色状态。排查了半天,发现是节点发现配置写错了,节点之间根本连不上。
来看一个标准的三节点配置:
# 节点1 (node-1)
cluster.name: prod-cluster
node.name: node-1
network.host: 192.168.1.10
discovery.seed_hosts: ["192.168.1.11", "192.168.1.12"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
# 节点2 (node-2)
cluster.name: prod-cluster
node.name: node-2
network.host: 192.168.1.11
discovery.seed_hosts: ["192.168.1.10", "192.168.1.12"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
# 节点3 (node-3)
cluster.name: prod-cluster
node.name: node-3
network.host: 192.168.1.12
discovery.seed_hosts: ["192.168.1.10", "192.168.1.11"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
你看,每个节点的 discovery.seed_hosts 要填其他节点的地址,而不是自己的。这个细节很多人会搞反。
注意: cluster.initial_master_nodes 只在集群第一次启动时生效。集群稳定后,如果新增节点,不需要再配置这个参数。
2.3 节点角色划分:各司其职
ES的节点角色有四种:Master、Data、Ingest、Coordinating。说白了,就是让不同节点干不同的事。
我见过最坑的配置:所有节点都是全能型,既当Master又当Data还当Ingest。结果呢?Master节点因为处理数据请求,导致集群选主超时,整个集群不稳定。
咱们来看看每种角色该干什么:
| 角色 | 职责 | 建议配置 |
|---|---|---|
| Master | 管理集群状态、处理节点加入/离开、创建/删除索引 | 3台专用节点,不存数据 |
| Data | 存储数据、处理CRUD、执行搜索和聚合 | 根据数据量扩展,建议SSD |
| Ingest | 数据预处理、管道处理(如字段转换、数据清洗) | 2-3台,或与Coordinating合并 |
| Coordinating | 接收客户端请求、分发到Data节点、汇总结果 | 2-4台,作为负载均衡层 |
配置方式很简单,在 elasticsearch.yml 里设置:
# 专用Master节点
node.roles: [master]
# 专用Data节点
node.roles: [data]
# 专用Ingest节点
node.roles: [ingest]
# 专用Coordinating节点
node.roles: []
注意最后一行——Coordinating节点的 node.roles 是空数组。这意味着它不参与任何具体工作,只负责转发请求。
我的建议: 生产环境至少部署3个Master节点(奇数个,防止脑裂)。Data节点根据数据量来,一般建议每个Data节点存储不超过2TB数据。Coordinating节点2-4个就够了,多了反而增加网络开销。
2.4 JVM堆内存配置:别让内存成为瓶颈
JVM堆内存配置,这是ES性能调优的重中之重。很多人觉得“内存越大越好”,结果把堆内存设到32GB,然后发现GC频繁,性能反而下降了。
为什么会这样?因为JVM的指针压缩技术。当堆内存小于32GB时,JVM会启用指针压缩,对象引用只占4字节。超过32GB,指针压缩失效,对象引用变成8字节,内存占用翻倍,GC效率也下降。
所以,ES官方建议:堆内存不要超过32GB。一般推荐设置为物理内存的一半,但不超过32GB。
举个例子,如果你的服务器有64GB内存:
- 堆内存:31GB(留1GB给JVM自身开销)
- 剩余33GB:给操作系统、文件系统缓存用
配置方式有两种:
# 方式一:环境变量
export ES_JAVA_OPTS="-Xms31g -Xmx31g"
# 方式二:修改 jvm.options 文件
# 在 config/jvm.options 中设置
-Xms31g
-Xmx31g
注意 -Xms 和 -Xmx 要设置成一样,避免JVM动态调整堆大小带来的性能抖动。
避坑指南: 我曾经遇到一个案例,某团队把堆内存设成了40GB,结果ES频繁Full GC,查询响应时间从10ms飙升到5秒。后来改成31GB,问题立刻解决。记住:ES不是Java应用,它更依赖文件系统缓存,而不是堆内存。
2.5 实战:搭建一个三节点集群
好了,理论说完了,咱们动手搭一个。假设有三台服务器:
- 192.168.1.10:Master + Coordinating
- 192.168.1.11:Data
- 192.168.1.12:Data
配置如下:
# 节点1 (192.168.1.10)
cluster.name: prod-cluster
node.name: master-coord-1
node.roles: [master]
network.host: 192.168.1.10
discovery.seed_hosts: ["192.168.1.11", "192.168.1.12"]
cluster.initial_master_nodes: ["master-coord-1", "data-1", "data-2"]
# 节点2 (192.168.1.11)
cluster.name: prod-cluster
node.name: data-1
node.roles: [data]
network.host: 192.168.1.11
discovery.seed_hosts: ["192.168.1.10", "192.168.1.12"]
cluster.initial_master_nodes: ["master-coord-1", "data-1", "data-2"]
# 节点3 (192.168.1.12)
cluster.name: prod-cluster
node.name: data-2
node.roles: [data]
network.host: 192.168.1.12
discovery.seed_hosts: ["192.168.1.10", "192.168.1.11"]
cluster.initial_master_nodes: ["master-coord-1", "data-1", "data-2"]
启动顺序:先启动Master节点,再启动Data节点。启动后,访问 http://192.168.1.10:9200/_cluster/health,如果返回 status: green,说明集群搭建成功。
注意: 如果集群状态是 yellow,说明有副本分片未分配。这通常是正常的,因为单节点集群无法分配副本。多节点集群出现yellow,就要检查节点是否都加入了。
嗯,这一章的内容就到这里。下一章咱们聊聊索引分片与副本策略,这可是ES性能调优的核心中的核心。