一、什么是Elasticsearch Yellow状态
Elasticsearch是一款流行的开源分布式全文搜索和分析引擎,由Elasticsearch BV开发和维护。Elasticsearch Yellow状态指的是在集群中主分片(number_of_replicas设置为1)和至少一个副本分片都存在,但是有一些部分出现问题,例如少量分片未分配、投票脱机的节点或磁盘空间低于设置的阈值。它表示在数据丢失或分片不可恢复之前还有时间来修复问题。
二、导致Elasticsearch Yellow状态的原因
1、未分配分片: 当Elasticsearch在集群中加入新节点或有节点关闭时,由于数据迁移可能导致未分配分片。当未分配分片>0时,数据就不能良好地分布在节点上,数据访问就可能会出现问题。
2、投票的脱机节点:Elasticsearch将集群中的节点视为主节点或数据节点的一部分,并通过投票选出主节点。当主节点脱机时,投票选出其他节点成为新的主节点。事情变得更糟糕的是,在集群结构不稳定的情况下,可能出现投票分歧而没有达成consensus。这些情况都会导致集群状态的黄色警报。
3、磁盘空间低于设置的阈值:磁盘空间的不充足可能会导致数据丢失和停机。默认情况下,Elasticsearch将不允许将分片分配到空间低于5%的节点上。如果某个节点低于这个阈值,状态将被标记为黄色。
三、如何诊断Elasticsearch Yellow状态
1、通过健康检查API:使用curl命令或浏览器中的HTTP请求连接到Elasticsearch的API地址,然后发送GET请求来检查集群的状态。输出结果中将包含活跃分片数(active_shards),分配分片(unassigned_shards)的数量以及节点数。如果活动分片数小于期望值或分配的分片数大于零,则检查分片分配是否正常或是否有分配失败的索引。
$ curl -XGET 'http://localhost:9200/_cat/health?pretty' { "cluster_name" : "elasticsearch", "status" : "yellow", "timed_out" : false, "number_of_nodes" : 3, "number_of_data_nodes" : 2, "active_primary_shards" : 10, "active_shards" : 20, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 3, "delayed_unassigned_shards": 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch": 0, "task_max_waiting_in_queue_millis": 0, "active_shards_percent_as_number": 86.95652173913044 }2、通过分片和节点API:使用curl命令或浏览器中的HTTP请求连接到Elasticsearch的API地址,然后发送GET请求以获得与每个索引,节点,分片和状态相关的信息。
$ curl -XGET 'http://localhost:9200/_cat/shards?v'
四、如何解决Elasticsearch Yellow状态
1、增加节点:通过添加额外的节点,可以将负载分散到更多的节点中,从而使每个节点处理的数据更少。这可以提高性能和稳定性,并为磁盘故障提供更好的保护。默认情况下,Elasticsearch 中包含一个单独的主节点,负责协调集群。将数据节点和观察节点部署到集群将提供更多的弹性和更好的性能。
2、重新分配分片: 重新分配失败的分片或重新分配未分配的分片可以解决由于节点故障引起的丢失的数据和索引。
curl -XPOST 'http://localhost:9200/_cluster/reroute' -d '{ "commands": [ { "allocate_replica": { "index": "your_index", "shard": 0, "node": "your_new_node", "allow_primary": true } } ] }'3、调整副本数量:根据使用情况,可以在不同的节点之间设置更多副本,以减少数据丢失的风险。
PUT /my_index/_settings { "index": { "number_of_replicas": 2 } }4、清理不必要的分片:清理无用的分片和索引,可以释放磁盘空间并提高性能。
DELETE /my_index