1. 确认异常现象
- 节点状态查看:使用
GET _cat/nodes?v
命令,检查所有节点的状态,明确哪些节点处于 unassigned
(未分配)、down
(下线)等异常状态。
- 索引状态检查:通过
GET _cat/indices?v
查看索引状态,确定是否存在索引数据丢失情况,比如某些索引的文档计数异常。
2. 网络层面排查
- 节点间连通性:在异常节点所在服务器,使用
ping
命令检查与其他节点的网络连通性;若不通,进一步使用 traceroute
追踪路由,确定网络故障点。
- 端口检查:确认 ElasticSearch 通信端口(默认 9200 和 9300)是否开放。可通过
telnet
或 nc
命令测试端口连接。例如,telnet <目标节点IP> 9300
,若无法连接,检查防火墙配置,确保相应端口允许通过。
3. 集群配置检查
- 配置文件对比:对比异常节点与正常节点的 ElasticSearch 配置文件(
elasticsearch.yml
),重点检查 cluster.name
、node.name
、network.host
、discovery.seed_hosts
等关键配置项是否一致。
- 集群设置查看:执行
GET _cluster/settings
命令,检查集群的动态设置,如 cluster.routing.allocation
相关设置是否合理,是否因设置导致节点无法分配或数据丢失。
4. 日志分析
- 节点日志:查看异常节点的日志文件(通常位于
logs
目录下),搜索 ERROR
、WARN
级别的日志信息。例如,若有 MasterNotDiscoveredException
,可能是节点发现主节点失败;若有 DiskThresholdExceededException
,则可能是磁盘空间不足导致问题。
- 集群日志:查看集群日志(若有集中管理的日志系统),获取集群层面的异常信息,如节点加入、离开集群的记录,以及可能导致索引数据丢失的操作记录。
5. 数据恢复与修复
- 重新分配分片:如果是部分分片未分配,可尝试通过
POST _cluster/reroute
命令手动重新分配分片,例如:
POST _cluster/reroute
{
"commands": [
{
"allocate": {
"index": "<索引名>",
"shard": <分片号>,
"node": "<目标节点名>",
"allow_primary": true
}
}
]
}
- 数据恢复:若索引数据丢失,且有备份,可使用 ElasticSearch 的快照与恢复功能。先创建仓库(
PUT _snapshot/<仓库名>
),再从快照恢复索引(POST _snapshot/<仓库名>/<快照名>/restore
)。
6. 硬件资源检查
- 磁盘空间:检查异常节点的磁盘使用情况,使用
df -h
命令。若磁盘空间已满,清理不必要的文件,或增加磁盘空间。
- 内存使用:通过
free -h
命令查看内存使用,若内存不足,可考虑调整 ElasticSearch 的堆内存设置(ES_HEAP_SIZE
环境变量),或增加服务器物理内存。
7. 升级与补丁检查
- 版本兼容性:确认集群各节点的 ElasticSearch 版本是否一致且兼容。若版本不一致,可能导致各种异常,需按照官方文档进行版本升级或降级操作。
- 补丁安装:检查是否有官方发布的补丁可修复已知问题,及时安装相关补丁。