跨数据中心Solr(8.11.1)连接ZooKeeper(3.6.2)遇连接重置问题
跨双数据中心Solr(8.11.1)+ZooKeeper(3.6.2)集群连接异常排查
环境与配置
- ZK集群共5节点:4个部署在欧盟数据中心,1个(ZK5)部署在北美数据中心
- Solr节点共4个,全部位于欧盟数据中心
- 初始配置中,Solr的
ZK_HOST仅指向欧盟的4个ZK节点
问题现象
- 初始配置状态:Solr与ZK运行正常,ZK可承受最多2个节点故障(符合官方预期),但Solr的ZK状态页提示未连接到集群所有节点
- 添加ZK5到
ZK_HOST后:Solr状态页显示连接错误、无ZK信息,日志报java.net.SocketException: Connection reset;关闭ZK5后状态页恢复正常 - 连通性验证:所有Solr节点可Ping通所有ZK节点,且能通过Telnet连接ZK客户端端口2181,排除防火墙和ZK进程异常问题
- 后续调整测试:将3个ZK节点部署在同区域的两个数据中心(1个在甲DC,2个在乙DC),整体运行正常但仍间歇性出现连接重置错误
问题分析与解决方案
核心原因分析
1. 跨数据中心网络特性与默认TCP参数不匹配
跨DC网络存在较高延迟、丢包或链路抖动,而ZK与Solr默认的TCP连接参数(超时、保活机制、会话时长)未针对跨DC场景优化。Ping和Telnet仅能验证短连接可用性,而ZK与Solr之间的长连接对网络稳定性要求更高,易因跨DC网络波动触发连接重置。
2. ZK集群节点分布与Solr连接策略冲突
初始配置中Solr仅连接4个欧盟ZK节点,无法感知完整的5节点集群拓扑,因此状态页提示未连接所有节点。添加跨DC的ZK5后,Solr尝试建立长连接时,跨DC网络的不稳定直接引发连接重置异常。
3. 同区域双DC间歇性问题根源
同区域双DC虽延迟较低,但仍存在链路瞬时波动,ZK默认的连接重试、超时参数未适配该场景,导致间歇性连接重置。
具体解决方案
1. 优化ZK与Solr的TCP及连接参数
- ZK端(修改
zoo.cfg):- 增大心跳间隔:
tickTime=2000 - 延长初始化同步超时:
initLimit=10 - 增大集群同步超时阈值:
syncLimit=5 - 启用TCP保活维持长连接:
tcpKeepAlive=true - 延长会话超时范围:
minSessionTimeout=60000、maxSessionTimeout=120000
- 增大心跳间隔:
- Solr端(修改
solr.in.sh/solr.in.cmd):- 增大ZK客户端连接超时:
ZK_CLIENT_TIMEOUT=60000 - 延长连接建立超时:
ZK_CONNECTION_TIMEOUT=30000
- 增大ZK客户端连接超时:
2. 调整ZK集群节点分布,满足跨DC容错要求
要实现单个数据中心离线后集群仍可用,ZK节点分布需保证单个DC的节点数不超过集群总节点数的一半。针对5节点集群,最优分布为2个欧盟DC节点+3个北美DC节点(或反过来),这样任意单个DC离线后,剩余节点数仍大于半数,保证集群可用性。同时Solr的ZK_HOST需配置所有ZK节点,确保感知完整集群拓扑。
3. 配置Solr的ZK客户端重试策略
修改solr.xml,添加ZK客户端重试参数,提升跨DC连接稳定性:
<solrcloud> <zkClientConfig> <param name="connectionTimeout" value="30000" /> <param name="sessionTimeout" value="60000" /> <param name="maxRetries" value="10" /> <param name="retryIntervalMs" value="2000" /> </zkClientConfig> </solrcloud>
4. 统一跨DC节点的MTU设置
跨DC网络可能存在MTU不匹配,导致大数据包被丢弃引发连接重置。检查所有ZK和Solr节点的MTU值,统一设置为适合跨DC的大小(如1400字节),避免数据包分片。
5. 启用ZK详细日志定位问题
修改ZK的log4j.properties,将日志级别调整为DEBUG,查看与Solr连接的详细过程,定位连接建立、会话维持或数据同步阶段的具体异常点,针对性优化。
内容的提问来源于stack exchange,提问作者vvs
相关产品推荐
相关产品推荐

