SolrCloud中的乐观并发问题

时间:2019-09-23 07:37:07

标签: solr concurrency solrcloud optimistic-concurrency

我在云模式下使用Solr v7.7.1。我面临与optimistic concurrency相关的问题:

我有一个嵌套的文档,可以在提交更新之前同时进行多次更新。在建立索引的过程中,我们获取要修改的文档及其_version_,对其进行修改,然后将其与相同的_version_一起发送至solr。如果更新在提交之前多次发生,则会引发以下错误:

  

原因:   org.apache.solr.client.solrj.impl.HttpSolrClient $ RemoteSolrException:   来自服务器的错误   http://1.2.3.4:8983/solr/mcollection_shard1_replica_n2:版本   预计1111会发生冲突= 1645085633861910528   实际= 1645090791527284737

在上述错误中,我们基本上试图在索引和提交先前版本的文档之前为ID为1111的文档建立索引。解决此问题的方法是简单地提交所有更新,然后再次尝试索引新文档。但是,即使提交后,solr也会使用相同的版本代码给出相同的错误。可能是什么问题?

一个奇怪的发现是,当solr不在云模式下运行时,不会遇到此问题。

1 个答案:

答案 0 :(得分:1)

当我们使用嵌套文档时,这似乎是solr的一个非常具体的问题。

在为文档建立索引时,当提到_version_时,solr通过执行real-time get来检查已存在的最新文档的版本。实时获取从更新日志中获取数据(这意味着还可以访问尚未打开以供搜索的数据)。为此,solr会执行以下操作:

http://1.2.3.4:8983/solr/mcollection/get?id=1111

现在,如果您有2个嵌套文档,则在一个文档(doc1)中,父级具有id = 1111,而在另一个文档(doc2)中,子级具有id = 1111,那么solr可能会检查 doc2的>版本。这可能是因为solr仍以平面结构索引所有文档,并且在进行实时获取时不考虑父子关系。

解决方案是使父文档和子文档的ID彼此不同。

已报告该错误:https://issues.apache.org/jira/browse/SOLR-13785