1.集群状态:
(1)绿色—最健康的状态,代表所有的主分片和副本分片都可用;
(2)黄色—所有的主分片可用,但是部分副本分片不可用;
(3)红色—部分主分片不可用。(此时执行查询部分数据仍然可以查到,遇到这种情况,还是赶快解决比较好。)
2.查看集群中不同节点,不同索引的状态
GET _cat/shards?h=index,shard,prirep,state,unassigned.reason
3.导致未分配分片unassigned可能的原因
1)INDEX_CREATED:由于创建索引的API导致未分配。 2)CLUSTER_RECOVERED :由于完全集群恢复导致未分配。 3)INDEX_REOPENED :由于打开open或关闭close一个索引导致未分配。 4)DANGLING_INDEX_IMPORTED :由于导入dangling索引的结果导致未分配。 5)NEW_INDEX_RESTORED :由于恢复到新索引导致未分配。 6)EXISTING_INDEX_RESTORED :由于恢复到已关闭的索引导致未分配。 7)REPLICA_ADDED:由于显式添加副本分片导致未分配。 8)ALLOCATION_FAILED :由于分片分配失败导致未分配。 9)NODE_LEFT :由于承载该分片的节点离开集群导致未分配。 10)REINITIALIZED :由于当分片从开始移动到初始化时导致未分配(例如,使用影子shadow副本分片)。 11)REROUTE_CANCELLED :作为显式取消重新路由命令的结果取消分配。 12)REALLOCATED_REPLICA :确定更好的副本位置被标定使用,导致现有的副本分配被取消,出现未分配。
4.解决未分配分片unassigned方案
方案一、
极端情况—这个分片数据已经不可用,直接删除该分片。
ES中没有直接删除分片的接口,除非整个节点数据已不再使用,删除节点。
curl -u elastic:xxxx -XDELETE ‘localhost:9200/index_name/’
方案二、
集群中节点数量>集群中所有索引可配置最大副本数量。
N> R
其中:
N—集群中节点的数目;
R—集群中所有索引可配置最大副本数目。
知识点:当节点加入和离开集群时,主节点会自动重新分配分片,以确保分片的多个副本不会分配给同一个节点。换句话说,主节点不会将主分片分配给与其副本相同的节点,也不会将同一分片的两个副本分配给同一个节点。
如果没有足够的节点相应地分配分片,则分片可能会处于未分配状态。
由于我的集群就3个节点,即N=3;所以R=2,也能满足公式,而集群副本分配默认为1。
问题就转嫁为:
1)添加节点处理,即N增大;
2)调小副本分片,即R置为2。
R置为2的方式,可以通过如下命令行实现【当集群节点大于1时,不建议将索引副本设置为0】:
curl -u elastic:xxxx -XPUT "http://localhost:9200/_settings" -d \'{ "number_of_replicas" : 2 }\'
{"acknowledged":true}
查看elasticsearchx系统配置
GET _settings
然而查到我的集群出问题的索引副本竟然是3
尝试将默认副本数number_of_replicas改为1
集群健康状态恢复了