如何通过PHP连接Zookeeper集群管理的Solr Cloud集群
PHP 对接3节点Zookeeper托管的Solr 8.11 Cloud集群方案
先解答你提到的端口疑问
配置里填写Solr服务的8983端口而非Zookeeper端口是Solarium的正常设计逻辑:
Solarium 主库没有内置Zookeeper客户端,不会直接和Zookeeper集群建立连接。它只需要通过任意一个存活的Solr节点的HTTP接口,就能拉取到整个Solr Cloud集群的全量状态,包括分片分布、副本节点地址、节点存活情况、Collection配置等信息,后续的读写请求会自动路由到正确的节点,不需要手动配置所有Solr节点,也不需要对接Zookeeper。
已经废弃的solarium-cloud库的实现逻辑是自己连Zookeeper监听节点变化,这个方案因为维护成本高、稳定性差已经被官方弃用,不要在生产环境使用。
生产环境对接步骤
1. 版本要求
- 必须使用 Solarium ≥6.3 版本,低版本存在Solr Cloud路由逻辑bug,无法兼容Solr 8.11的集群状态返回格式
- 不需要安装任何额外的第三方扩展,Solarium主库已经内置完整的Solr Cloud模式支持
2. 最小可用配置
<?php require 'vendor/autoload.php'; use Solarium\Client; $config = [ 'endpoint' => [ // 仅需配置1-2个可用的Solr节点作为集群入口即可,不需要把3个节点全部写入 'solr_entry_1' => [ 'host' => 'Solr节点1内网IP', 'port' => 8983, 'path' => '/', 'collection' => '目标Collection名称', // 集群开启鉴权时才需要配置下面两行 'username' => 'solr', 'password' => '你的集群密码', ], // 建议配置第二个入口节点做高可用,避免第一个节点故障时服务不可用 'solr_entry_2' => [ 'host' => 'Solr节点2内网IP', 'port' => 8983, 'path' => '/', 'collection' => '目标Collection名称', ] ], // 核心配置:开启Solr Cloud模式 'cloud' => true, ]; $client = new Client($config); // 连通性验证:拉取集群状态 $adminRequest = $client->createAdmin(); $adminRequest->setAction('cloud'); $clusterStatus = $client->execute($adminRequest);
3. 生产环境优化建议
- PHP服务和Solr集群必须走内网通信,不要把Solr 8983端口暴露到公网
- 集群入口节点配置2个即可,配置过多入口会增加初始拉取集群状态的请求开销
- 可以把拉取到的集群拓扑信息缓存30-60秒,减少每次请求重复拉取集群状态的性能损耗,缓存时间不要超过2分钟,避免节点上下线后出现路由错误
- 所有入口节点的鉴权账号密码必须保持一致,否则会出现部分节点请求鉴权失败
常见排错点
- 出现路由错误时,先手动访问你配置的入口节点的
/solr/admin/collections?action=CLUSTERSTATUS接口,确认接口能正常返回集群状态,且PHP机器能正常访问该接口 - 不要尝试在配置里填写Zookeeper的2181端口,Solarium无法识别Zookeeper协议,会直接报连接错误
- 不要使用废弃的solarium-cloud库,该库已经停止维护超过4年,存在大量已知的路由bug、内存泄漏问题,完全达不到生产可用标准
- Solr 9.x版本的对接逻辑完全一致,仅需将Solarium版本升级到≥7.0即可
内容的提问来源于stack exchange,提问作者Elytscha Smith
相关产品推荐
相关产品推荐

