在Elasticsearch维护过程中,我们经常会遇到分片未分配、内存溢出(OOM)、集群脑裂(Split-Brain)和索引损坏等问题。本文将介绍这些常见问题的 排查方法、解决方案及预防措施,帮助你高效管理你的Elasticsearch集群。
1 分片未分配问题排查
1.1 问题现象
- 分片长期处于UNASSIGNED 状态
- 集群健康状态为yellow或red
1.2 常见原因
- 节点资源不足(磁盘、CPU、内存)
- 分片分配策略限制(如cluster.routing.allocation配置)
- 索引配置问题(如index.routing.allocation设置)
- 主分片丢失(数据损坏或节点故障)
1.3 排查步骤
1.3.1 查看未分配分片
GET _cat/shards?v&h=index,shard,prirep,state,node,unassigned.reason&s=state
1.3.2 检查分配失败原因
GET _cluster/allocation/explain?pretty
1.3.3 修复方案
- 手动分配分片(适用于已知数据安全的情况):
POST _cluster/reroute
{
"commands": [
{
"allocate_stale_primary": {
"index": "my_index",
"shard": 0,
"node": "target_node",
"accept_data_loss": true
}
}
]
}
- 调整分片分配策略(如放宽磁盘阈值):
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": "90%",
"cluster.routing.allocation.disk.watermark.high": "95%"
}
}
2 内存溢出(OOM)处理
2.1 问题现象
- Elasticsearch 进程崩溃,日志出现OutOfMemoryError
- 节点频繁重启
2.2 常见原因
- 堆内存(Heap)不足(-Xms和-Xmx设置不合理)
- 字段数据(Fielddata)占用过高
- 聚合查询或大查询消耗内存
- JVM 内存泄漏
2.3 排查与优化
2.3.1 调整JVM堆内存(建议不超过物理内存的50%)
# config/jvm.options
-Xms4g
-Xmx4g
2.3.2 限制Fielddata使用
PUT _cluster/settings
{
"persistent": {
"indices.breaker.fielddata.limit": "60%"
}
}
2.3.3 优化查询
- 使用 size 限制返回数据量
- 避免 "size": 0 + 大聚合
2.3.4 监控内存使用
GET _nodes/stats/jvm
3 集群脑裂(Split-Brain)预防
3.1 问题现象
- 集群分裂成多个独立子集群
- 数据不一致,部分节点无法加入集群
3.2 常见原因
- 网络分区(节点间通信中断)
- 主节点选举配置不当(discovery.zen.minimum_master_nodes未正确设置)
3.3 解决方案
3.3.1 7.x 之前版本
# elasticsearch.yml
discovery.zen.minimum_master_nodes: (master_eligible_nodes / 2) + 1
3.3.2 7.x+ 版本
cluster.initial_master_nodes: ["node4", "node5", "node6"]
3.4 预防措施
- 使用多AZ部署 避免单点故障
- 监控节点间网络延迟
4 索引损坏与修复方法
4.1 问题现象
- 索引无法打开,报CorruptIndexException
- 分片状态为CORRUPT
4.2 常见原因
- 磁盘故障
- JVM崩溃导致数据未正确写入
- 服务器异常断电或强制终止进程
4.3 修复方法
4.3.1 使用Lucene检查工具
/export/home/elasticsearch-7.10.1/bin/elasticsearch-shard --index my_index --shard 0 --check
4.3.2 恢复未分配副本分片
POST my_index/_recover
4.3.3 重建索引(迫不得已)
POST _reindex
{
"source": { "index": "corrupted_index" },
"dest": { "index": "recovered_index" }
}
5 总结
问题 |
关键排查点 |
解决方案 |
分片未分配 |
UNASSIGNED分片 |
手动分配、调整策略 |
OOM |
JVM堆内存、Fielddata |
优化查询、限制内存 |
脑裂 |
主节点选举 |
设置minimum_master_nodes或者cluster.initial_master_nodes |
索引损坏 |
CORRUPT状态 |
使用_reindex恢复 |