不为失败找理由,要为成功找方法。

遇到一个诡异的问题,并发新增索引时发生version conflict

Elasticsearch | 作者 FuNian | 发布于2019年03月28日 | 阅读数:8558

接口使用:transportClient.prepareIndex(indexName,type,Id).setSource(xcontentBuilder).setCreate(true).get;
异常现象:
使用多节点多线程调用新增接口,使用自己生成的UUID作为索引Id,偶尔会发生VersionConflictEngineException: version conflict, document already exisits (current version [1]), 异常发生时经常是同时有十几个或二十几个索引同时报版本冲突。
问题分析
由于ES中 index/type/Id 唯一确定一个document,初步认定是由于生成的索引Id发生碰撞引起的。但是UUID发生如此密集的碰撞也比较诡异,于是在每次新增索引之前先记录索引Id到日志索引库中,若发生UUID冲突,应能查询到2条或更多条相同的UUID。
之后又发生了该异常:批量新增50W个document,有15个报出了version conflict异常,并在一次重试后成功创建索引。
根据报错信息查询,发现报异常的文档与已建立的索引都是该次批量新增操作中写入的document,不是与历史数据发生冲突,此时去运行日志索引库中根据发生冲突的UUID查询,并没有找到2个或以上相同的UUID。明明报错信息是版本冲突,可查询运行日志又没有UUID发生碰撞,现象相互矛盾,无法理解了,这是问题一。
另外查询该次批量新增的结果,发现共新增索引数据500015条,比预期多了15条,猜测是报异常的文档发生了重复写入,可是单独测试新增API prepareIndex,发生版本冲突时,文档根本无法写入,不会发生重复写入,那多出的15个document是怎么回事呢?这是问题二。
求各位大佬帮忙分析一下
已邀请:

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

加上这个参数试试:
op_type=create。
 
 

王庆焕 - https://discuss.elastic.co/u/wangqinghuan/

赞同来自:

最好让es自己生成_id,如果自己的uuid要存,就单独存储一个uuid字段。

要回复问题请先登录注册