CloudSolrClient中<autocommit>功能失效及自动提交异常问题求助(本地与预发布环境配置一致但行为不同)
帮你排查Solr集群与单机环境自动提交行为不一致的问题
看起来你遇到了挺头疼的问题:本地单机Solr照着配置5秒后就能看到新增的文档,但预发布的SolrCloud环境(用CloudSolrClient+ZooKeeper)却没动静,连自动提交删记录都不好使,而且两边的solrconfig.xml明明是一样的。我给你列几个实际排查的方向,都是平时遇到这类问题的常见点:
1. 先确认CloudSolrClient的提交是否真的到了集群
你本地用的是HttpSolrClient直接连单个节点,预发布换成了CloudSolrClient,这一步最容易出问题:
- 先检查你的
CloudSolrClient初始化代码,ZooKeeper地址是不是填错了?有没有指定正确的collection(也就是usersession)? - 调用
Solr.add(doclist)的时候,有没有悄悄抛出异常?比如网络不通、集群节点挂了?建议在代码里加个日志或者捕获下异常,确认提交请求真的发出去了,不是石沉大海
2. 别光看本地配置,要查ZooKeeper里的实际生效配置
你说两边配置一致,但SolrCloud的配置是存在ZooKeeper里的,很可能你改了本地文件却没同步到集群:
- 用Solr自带的zkcli工具(
zkcli.sh或者zkcli.bat)去查集群里的真实配置,命令大概是这样:
对比里面的./zkcli.sh -zkhost 你的ZK地址:端口 -cmd get /configs/usersession/solrconfig.xml<autoCommit>和<autoSoftCommit>是不是和你预期的一样 - 也可以直接在Solr管理UI里看,每个节点的
Core Admin点进去,看usersession的Config标签,确认生效的配置到底是什么
3. 查日志确认autoCommit有没有真的触发
自动提交没生效,大概率是没按时触发,去预发布的Solr节点日志里搜autoCommit相关内容:
- 找有没有
Starting autoCommit、Completed autoCommit这类日志,看看是不是每5秒跑一次 - 如果完全找不到相关日志,那可能是
solr.autoCommit.maxTime被覆盖了!比如启动Solr的时候加了JVM参数-Dsolr.autoCommit.maxTime改成了其他值,或者ZK里的全局solr.xml配置覆盖了core级的设置
4. 注意openSearcher=false的坑
你的配置里autoCommit的openSearcher是false,这个设置的意思是:提交只把数据写磁盘,但不刷新搜索器——理论上这时候新数据是查不到的啊!那你本地为什么能看到?这里肯定有问题:
- 是不是本地和预发布的Solr版本不一样?不同版本对这个参数的处理可能有差异,比如有些单机版本会默认刷新搜索器,而集群版本严格遵循配置?
- 再仔细核对下本地的
solrconfig.xml,是不是真的openSearcher=false?会不会你本地改了没保存?或者有没有测试的时候不小心手动调用了Solr.commit()?
5. 排查TTL字段的影响(虽然概率低,但别漏)
你给文档加了time_to_live_s字段,值是+30000SECONDS,虽然3万秒是8个多小时,不至于刚提交就过期,但还是要确认:
- 预发布环境的
solrconfig.xml里有没有配置TTLUpdateProcessorFactory?没开的话TTL不生效,但开了的话会不会有其他问题? - 检查下预发布服务器的时钟和本地是不是一致?万一时钟快了好几个小时,那文档可能刚提交就过期了(这个概率低,但排查的时候可以顺手看一眼)
6. 删除操作的问题和集群状态挂钩
你说自动提交删不了记录,这和集群的同步有关:
- 删除操作是不是也用的
CloudSolrClient?有没有调用删除后没等自动提交?或者删除的时候有没有报错? - 去Solr管理UI的
Cloud标签看看集群状态,是不是所有节点都是活跃的?如果有节点挂了,删除操作可能没同步到所有节点,导致看起来没删成
7. 最后确认版本一致性
一定要确认本地和预发布的Solr版本完全一致!不同版本在自动提交、SolrCloud的提交机制上可能有差异,甚至有些版本的集群模式有特定的bug导致autoCommit不触发
内容的提问来源于stack exchange,提问作者shan




