SolrCloud 8.1.1单向CDCR复制失败:版本冲突(409)问题求助
我来帮你分析并解决这个Solr 8.1.1单向CDCR的同步问题,你遇到的两个现象(持续转发0条更新、新增索引时409版本冲突)其实是关联的,咱们一步步来搞定:
一、先搞定“持续转发0条更新”的基础问题
这个现象说明CDCR的复制器要么没检测到源集合的更新日志,要么没正确连接到目标集合的状态追踪系统,先从配置和状态重置入手:
确认CDCR核心配置准确
打开源集合的solrconfig.xml,检查CDCR处理器的配置,确保目标集群ZK地址和集合名完全正确:<requestHandler name="/cdcr" class="solr.CdcrHandler"> <lst name="targets"> <lst name="search1"> <str name="zkHost">目标集群的ZK完整地址(比如zk1:2181,zk2:2181/solr)</str> <str name="collection">search1</str> </lst> </lst> <str name="replicateAfter">commit</str> <str name="conflictResolver">version</str> <!-- 这个配置后面还要调整 --> </requestHandler>别小看拼写错误,很多时候问题就出在这。
重置CDCR的同步 checkpoint
CDCR会记录上次同步的检查点,如果这个检查点异常,就会导致它“认为”没有新更新需要同步。用API重置一下:curl -X POST http://你的源Solr节点IP:8983/solr/源集合名称/cdcr?action=RESET重置完重启CDCR:
curl -X POST http://你的源Solr节点IP:8983/solr/源集合名称/cdcr?action=START
二、解决409版本冲突(actual=-1)的问题
这个错误的意思是:目标集合里根本找不到THREE_INDEXING_01这个文档,但CDCR却拿着一个非-1的版本号去尝试更新它,自然就冲突了。这大概率是因为初始时源和目标集合的文档数据没对齐,或者冲突解决策略不对。
先做全量同步,对齐源和目标的文档
在开增量同步前,必须先把源集合的现有数据全量同步到目标,确保两边文档完全一致:- 先停掉源集合的CDCR:
curl -X POST http://你的源Solr节点IP:8983/solr/源集合名称/cdcr?action=STOP - 导出源集合的所有数据:
(如果数据量很大,可以分批导出,或者用Solr的DataImportHandler更高效)curl "http://你的源Solr节点IP:8983/solr/源集合名称/select?q=*:*&rows=1000000&wt=json" > source_full_data.json - 把导出的数据导入目标集合:
curl -X POST -H "Content-Type: application/json" http://目标Solr节点IP:8983/solr/search1/update --data-binary "@source_full_data.json" - 提交目标集合的更新,确保数据落地:
curl -X POST http://目标Solr节点IP:8983/solr/search1/update?commit=true
- 先停掉源集合的CDCR:
调整CDCR的冲突解决策略
既然是新增文档时出的错,说明原来的version冲突 resolver 不合适——它会检查目标文档的版本,而新增的文档在目标里根本不存在,自然版本不匹配。改成overwrite策略,让CDCR在目标没有该文档时直接创建:
修改源集合solrconfig.xml里的CDCR配置:<requestHandler name="/cdcr" class="solr.CdcrHandler"> <!-- 其他配置不变 --> <str name="conflictResolver">overwrite</str> </requestHandler>修改完重启源Solr节点,再重新启动CDCR。
检查目标集合的
_version_字段配置
目标集合的_version_字段必须正确配置,否则无法生成或识别文档版本号,就会出现actual=-1的情况。打开目标集合的managed-schema(或schema.xml),确认这个字段的配置:<field name="_version_" type="long" indexed="true" stored="true"/>如果配置不对,调整后重启目标Solr节点。
三、验证修复效果
- 启动CDCR后,观察源节点的日志,要是有新的更新,应该能看到“Forwarded X updates”(X大于0),而不是一直0条。
- 向源集合新增一条测试文档,比如:
然后提交:curl -X POST -H "Content-Type: application/json" http://源Solr节点IP:8983/solr/源集合名称/update --data '[{"id":"test_cdcr_01","title":"Test CDCR Sync"}]'
再去目标集合查询这个文档,看看是否同步成功,同时检查日志有没有再出现409错误。curl -X POST http://源Solr节点IP:8983/solr/源集合名称/update?commit=true
内容的提问来源于stack exchange,提问作者S Jayesh

