上传security.json启用认证后Solr CDCR失效,求助解决方法
我来帮你拆解这个Solr CDCR的权限问题——你在同步security.json到源端和目标端ZK后出现源端错误,大概率是CDCR所需的权限配置没到位,或者两端的安全配置存在细微不匹配。下面是一步步的排查和解决思路:
1. 确保CDCR进程拥有必要的核心权限
CDCR的源端实例需要同时具备两类权限:
- 对本地源集合的
read和update权限(用来读取待同步的数据) - 对目标端集合的
update权限(用来推送数据到目标端) - 对ZK中CDCR相关路径(比如
/solr/cdcr)和集合元数据路径的访问权限
你可以在security.json中专门创建一个CDCR专属角色(比如cdcr-role),并赋予这些权限,示例配置片段:
{ "roles": { "cdcr-role": { "permissions": [ {"name": "collection:read", "collection": "my-collection"}, {"name": "collection:update", "collection": "my-collection"}, {"name": "collection:update", "collection": "my-collection", "params": {"targetHost": "http://target-solr:8983"}} ] } } }
2. 验证两端security.json的用户凭证完全一致
源端会以指定用户身份向目标端发起请求,所以:
- 两端security.json中用于CDCR通信的用户(比如
cdcr-user)的密码必须完全相同 - 这个用户必须被分配到上面创建的
cdcr-role角色 - 检查是否有IP访问限制(比如
urlFilter配置),确保源端IP能访问目标端的Solr API
3. 核对源端solrconfig.xml的CDCR配置
打开源端集合的solrconfig.xml,确认<cdcr>节点里的认证信息和security.json中的用户匹配:
<cdcr> <str name="targetCoreUrl">http://target-solr:8983/solr/my-collection</str> <!-- 这里的用户名密码要和security.json里的cdcr-user一致 --> <str name="username">cdcr-user</str> <str name="password">your-secure-password</str> <!-- 如果启用了SSL,还要添加SSL相关配置 --> <str name="sslTrustStore">/path/to/truststore.jks</str> <str name="sslTrustStorePassword">truststore-password</str> </cdcr>
4. 检查ZK的ACL是否正确应用
上传security.json到ZK后,需要确认ZK的访问控制列表(ACL)已经生效。可以用ZK客户端工具验证:
# 查看security.json路径的ACL ./zkCli.sh -server your-zk-host:2181 getAcl /solr/security.json # 查看集合元数据路径的ACL ./zkCli.sh -server your-zk-host:2181 getAcl /solr/collections/my-collection
确保Solr的运行用户(比如solr系统用户)拥有这些路径的read和write权限,否则源端无法读取CDCR配置或集合信息。
5. 通过日志定位具体错误
源端Solr的server/logs/solr.log会记录详细的错误信息,比如:
- 如果出现
AuthenticationFailedException:说明用户密码不匹配或者用户不存在 - 如果出现
AuthorizationException:说明用户权限不足 - 如果出现ZK相关错误:说明ZK的ACL配置有问题
把日志里的具体错误片段找出来,能更快锁定问题根源。
6. 重启实例并验证配置
修改完配置后,必须重启源端和目标端的所有Solr节点,确保配置生效。之后可以用命令验证:
# 验证源端用户能否访问目标端集合 curl -u cdcr-user:your-password http://target-solr:8983/solr/my-collection/admin/ping # 查看CDCR同步状态 curl -u admin-user:admin-password http://source-solr:8983/solr/my-collection/cdcr?action=STATUS
如果ping请求返回{"status":"OK"},且CDCR状态显示正常,就说明问题解决了。
内容的提问来源于stack exchange,提问作者Dimaf
相关产品推荐
相关产品推荐

