跳到主要内容

第3章 Elasticsearch集群搭建

本章介绍Elasticsearch集群的概念、部署、扩容和运维管理,帮助实现高可用性、数据冗余和负载均衡。


4.1 集群核心概念

集群特点

对运维友好:不需要太多java的知识也可以很方便的维护整个集群。
搭建方便:搭建副本非常简单,只需要将新节点加入已有集群即可,会自动同步数据。
自动故障转移:当节点出现故障时,会自动故障转移,将有数据复制到其他正常的节点。

数据分片机制

主分片:	  实际存储的数据,负责读写,粗框的是主分片
副本分片: 主分片的副本,提供读,同步主分片,细框的是副本分片

主分片负责写入操作,副本分片提供数据备份和读取负载分担,同一索引的主分片和副本分片不会在同一节点上。

副本作用

主分片的备份,副本数量可以自定义

副本提供数据容错、读取性能分担和高可用性保障。

默认配置

7.X版本之前默认规则: 1副本,5分片
7.x版本之后默认规则: 1副本,1分片

7.x后减少默认分片数避免过度分片,单分片在小数据量时性能更好。

节点类型

主节点:	 负责调度数据分配到哪个节点
数据节点: 实际负责处理数据的节点
默认: 主节点也是工作节点

集群健康状态

绿色: 所有数据都完整,且副本数满足
黄色: 所有数据都完整,但是副本数不满足
红色: 一个或多个索引数据不完整

4.2 集群部署实战

部署准备

最好是使用干净的环境部署集群,如果以前有单节点的数据,最好备份出来,然后再清空集群数据。
⚠️ 重要操作

清理旧数据前务必备份!

systemctl stop elasticsearch.service
rm -rf /var/lib/elasticsearch/*

软件安装

# 7.x版本之后不需要单独的安装JDK,软件包自带了JDK
rpm -ivh elasticsearch-7.9.1-x86_64.rpm

# 配置内存锁定
systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity

Node1配置文件

cat > /etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: luffy_linux
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 127.0.0.1,10.0.0.51
http.port: 9200
discovery.seed_hosts: ["10.0.0.51","10.0.0.52"]
cluster.initial_master_nodes: ["10.0.0.51"]
EOF

Node2配置文件

cat > /etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: luffy_linux
node.name: node-2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 127.0.0.1,10.0.0.52
http.port: 9200
discovery.seed_hosts: ["10.0.0.51","10.0.0.52"]
cluster.initial_master_nodes: ["10.0.0.51"]
EOF

关键配置说明

在 Elasticsearch 集群配置中,cluster.initial_master_nodes 是一个非常重要的参数,它用于指定在集群首次启动时,哪些节点有资格被选为主节点(Master Node)。这个参数只在集群首次启动时生效,后续的集群启动或节点加入时不再需要。

Elasticsearch 集群需要一个主节点来协调集群状态(如索引创建、分片分配等)。在集群首次启动时,Elasticsearch 需要确定哪些节点有资格成为主节点。如果没有明确指定,可能会导致集群无法正确启动或出现脑裂(Split Brain)问题。

启动和验证

# 启动服务
systemctl daemon-reload
systemctl restart elasticsearch

# 查看日志
tail -f /var/log/elasticsearch/luffy_linux.log

image-20201218091903908.png


4.3 集群扩容管理

新节点安装

# 7.0版本之后不需要单独安装JDK
rpm -ivh elasticsearch-7.9.1-x86_64.rpm

# 配置内存锁定
systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity

Node3配置

cat > /etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: oldboy_linux
node.name: node-3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 127.0.0.1,10.0.0.53
http.port: 9200
discovery.seed_hosts: ["10.0.0.51","10.0.0.53"]
cluster.initial_master_nodes: ["10.0.0.51"]
EOF

扩容要点

对于新添加的节点来说:
只需要知道集群内任意一个节点的IP和他自己本身的IP即可
discovery.seed_hosts: ["10.0.0.51","10.0.0.53"]

对于以前的节点来说:
什么都不需要更改

分片状态监控

紫色: 正在迁移
黄色: 正在复制
绿色: 正常

新节点加入后会触发分片重新分配,数据迁移过程中分片状态会变化,最终达到绿色健康状态。

故障转移测试场景

1.停掉主节点,观察集群是否正常
2.停掉主节点,是否还会选举出新的主节点
3.停掉主节点,数据分片的分布会不会发生变化,分片状态会不会发生变化
4.停掉主节点,然后在持续的写入数据,等节点恢复之后,会如何处理落后的数据
5.3个节点的Elasticsearch集群,极限情况下最多允许坏几台?
6.主节点故障,集群健康状态发生什么变化?

故障转移结论

1.如果主节点坏掉了,会从活着的数据节点中选出一台新的主节点
2.如果主分片坏掉了,副本分片会升级为主分片
3.如果副本数不满足,会尝试在其他的节点上重新复制一份数据
4.修复上线只需要正常启动故障的节点即会自动加入到集群里,并且自动同步数据
5.7.x版本之后则必须至少2个节点存活集群才能正常工作

image-20201222145109387.png

image-20201222161714345.png

image-20201222161848055.png


4.4 集群运维实践

索引副本管理

索引一旦建立完成,分片数就不可以修改了
但是副本数可以随时修改
# 创建索引时自定义副本和分片
PUT /linux2/
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 0
}
}

# 修改单个索引的副本数
PUT /linux2/_settings/
{
"settings": {
"number_of_replicas": 2
}
}

# 修改所有的索引的副本数
PUT /_all/_settings/
{
"settings": {
"number_of_replicas": 0
}
}

生产环境配置建议

2个节点: 默认就可以
3个节点: 重要的数据,2副本 不重要的默认
日志收集: 1副本3分片

image-20201222165008364.png

image-20201222165036682.png

运维注意事项

1.插入和读取数据在任意节点都可以执行,效果一样
2.es-head可以连接集群内任一台服务

3.主节点负责读写
如果主分片所在的节点坏掉了,副本分片会升为主分片

4.主节点负责调度
如果主节点坏掉了,数据节点会自动升为主节点

5.通讯端口
默认会有2个通讯端口:9200和9300
9300并没有在配置文件里配置过
如果开启了防火墙并且没有放开9300端口,那么集群通讯就会失败
🚨 生产环境重要提醒

生产环境运维要点

  • 定期检查集群健康状态
  • 确保分片均匀分布在各节点
  • 监控CPU、内存、磁盘使用率
  • 确保9200和9300端口通畅
⚠️ 故障排除指南

常见问题诊断

  1. 集群状态异常 - 检查节点网络连通性、配置文件一致性、查看日志错误
  2. 分片未分配 - 检查磁盘空间、验证副本配置、手动重新分配分片
  3. 节点无法加入 - 验证cluster.name一致性、检查discovery.seed_hosts配置、确认防火墙端口

应急处理命令

# 查看未分配分片
GET /_cat/shards?v&h=index,shard,prirep,state,unassigned.reason

# 手动分配分片
POST /_cluster/reroute
{
"commands": [
{
"allocate_empty_primary": {
"index": "my-index",
"shard": 0,
"node": "node-1",
"accept_data_loss": true
}
}
]
}

本章小结

通过本章学习,掌握了集群核心概念、部署技能、扩容管理和运维实战经验。集群部署是Elasticsearch生产应用的基础,合理的集群架构和运维策略是保证服务稳定性的关键。

📝 更新时间: 2025-01-26
🎯 适用版本: Elasticsearch 7.x/8.x
📚 难度等级: 中级进阶