01
先看两个故障,带着问题去思考
首先大致看一下分片未分配原因:
结果显示分片大都是因为node_left导致未分配,然后通过explainAPI查看分片myindex[3]不自动分配的具体原因:
我们在explainapi中指定了只显示分片myindex[3]的信息,诊断结果的主要信息如下:
意味着Elasticsearch找到了这个分片在磁盘的数据,但是由于分片数据不是最新的,无法将其分配为主分片。
分片分配失败,查看日志有如下报错:
产生该错误的原因是副分片与主分片sync_id相同,但是doc数量不一样,导致recovery失败。造成sync_id相同,但doc数量不同的原因可能有多种,例如下面的情况:
1.写入过程使用自动生成docid
2.主分片写doc完成,转发请求到副分片
3.在此期间,并行的一条deletebyquery删除了主分片上刚刚写完的doc,同时副分片也执行了这个删除请求
4.主分片转发的索引请求到达副分片,由于是自动生成id的,副分片将直接写入该doc,不做检查。最终导致副分片与主分片doc数量不一致。
A、B两个案例的解决方式如何?别急,我们先梳理一下RED与YELLOW问题
02
正文:RED与YELLOW
集群RED和YELLOW是Elasticsearch集群最常见的问题之一,无论RED还是YELLOW,原因只有一个:有部分分片没有分配。
如果有一个以上的主分片没有被分配,集群以及相关索引被标记为RED状态,如果所有主分片都已成功分配,有部分副分片没有被分配,集群以及相关索引被标记为YELLOW状态。
对于集群RED或YELLOW的问题诊断推荐使用ClusterAllocationExplainAPI,该API可以给出造成分片未分配的具体原因。例如,如下请求可以返回第一个未分配的分片的具体原因:
也可以只查看特定分片未分配的原因:
引用一个