记录一次线上排查elasticsearch的ResourceAlreadyExistsException过程
1.情景
我司一家私有云客户,前断时间更新我司最新的补丁后,搜索人员信息的时候搜索不出来出据,后续运维排查问题发现同步数据的工程已经宕机,后又启动服务,发现服务怎么也跑不起来
2.过程
2.1程序启动的时候会去判断索引是否存在,然后通过程序创建索引,每当程序启动的时候都报如下异常
说实话是头一次看见这个问题,从抛出的日志来看是索引已经存在,不让在创建,然后通过google搜索,发现有如下四种情况
一个一个排查发现23不成立,由于这个索引已经存在查看mapping的时候发现mapping是存在的,那就只剩下第一种情况的可能了,但是程序里面会判断这个索引是否存在,不存在的话才会去创建这个索引,当时我们把这个索引删除了,然后用程序去创建的时候,又出现另外一个索引相同的情况,然后又出现了另外一个报错
但是这个索引实际上是有mapping的
2.2思考
因为只有这一家客户有这种问题,排除代码层面上的问题,如何复现这个两个问题呢,凡事有因必有果,当时我自己在本地测试的时候的确发现重复创建索引会出现这种问题,然后就猜测是不是集群本身有问题,后面使用以下命令
curl --location --request GET 'http://192.168.22.92:9200/_cat/nodes?pretty'
发现集群中只有两个节点,实际有三个节点,查看另外一个节点的状态,发现elasticsearch正在跑没有问题,一脸懵逼,明明那个节点不存在这个索引的信息,但是什么创建索引的时候却报这个异常呢,
2.3结论
查找资料发现,可能出现了脑裂的情况,节点三和集群断开了联系,默认主节点不可用将自己提升为主节点,而我们通过命令删除了报错的索引的信息压根没有同步到第三个节点,当我们使用客户端创建索引的时候,请求打到了删除索引的主节点判断索引不存在返回false,当我们创建索引的时候索引的时候,事件上节点三的索引因为没有同步分片信息导致索引没有被删除,所以才报出那个问题。
2.4解决
同步分片信息导致索引没有被删除,所以才报出那个问题。
2.4解决
将断开节点的索引重新加入集群后,成功解决问题,证明了自己的猜想