Solr部署:ZooKeeper集群配置完整指南与最佳实践
虽然Solr捆绑了Apache ZooKeeper,但强烈建议您在生产环境中使用外部ZooKeeper设置。
使用Solr的嵌入式ZooKeeper实例适合入门,但不应在生产环境中使用,因为它不提供任何故障转移:如果承载ZooKeeper的Solr实例关闭,ZooKeeper也会关闭。任何依赖它的分片或Solr实例都无法与它或彼此通信。
解决这个问题的方案是建立外部ZooKeeper集群(ensemble),这是运行ZooKeeper的多个服务器,它们相互通信以协调集群活动。
ZooKeeper节点数量规划
节点数量原则
规划ZooKeeper节点数量时,需要记住ZooKeeper集群的主要原则是维护服务器的多数来服务请求。这个多数被称为仲裁(quorum)。
ZooKeeper管理员指南引用:
“要使ZooKeeper服务处于活动状态,必须有大多数非故障机器能够相互通信。要创建能够容忍F台机器故障的部署,您应该计划部署2×F+1台机器。”
奇数节点的重要性
为了正确维护仲裁,强烈建议在集群中使用奇数个ZooKeeper服务器,以便维护多数。
举例说明:
- 2个节点:如果1个宕机,只有50%的服务器可用,不是多数,ZooKeeper将无法服务请求
- 3个节点:如果1个宕机,有66%的服务器可用,ZooKeeper将正常继续,同时您修复宕机节点
- 5个节点:如果必要,可以在2个节点宕机的情况下继续运行
节点数量建议
节点数 | 容错能力 | 推荐场景 |
---|---|---|
3个节点 | 1个节点故障 | 一般规模集群(推荐) |
5个节点 | 2个节点故障 | 大规模集群 |
不推荐超过5个 | - | 节点间协调成本过高 |
重要原则:
- 一般情况下不建议超过5个节点
- 虽然更多节点看起来提供更好的容错性和可用性,但实际上由于节点间协调量增加会降低效率
- 除非您有真正庞大的Solr集群(1000+节点规模),否则建议坚持3个节点作为通用规则
更多关于ZooKeeper集群的信息可在ZooKeeper文档中找到。
下载Apache ZooKeeper
获取软件
设置Apache ZooKeeper的第一步是下载软件,可从ZooKeeper发布页面获取。
当前兼容版本:Solr当前使用Apache ZooKeeper v3.9
重要警告:使用外部ZooKeeper集群时,需要与Solr发行版一起分发的最新版本保持本地安装的最新状态。由于在这种情况下它是独立应用程序,不会作为标准Solr升级的一部分进行升级。
ZooKeeper安装
安装过程
安装包括将文件提取到您希望ZooKeeper存储其内部数据的特定目标目录。实际目录本身并不重要,只要您知道它在哪里即可。
解包命令:
1 | tar xvf zookeeper-3.9.0.tar.gz |
此位置是该服务器上ZooKeeper的<ZOOKEEPER_HOME>
。
重要提醒:必须在运行ZooKeeper的每个服务器上重复安装和解包ZooKeeper。
ZooKeeper集群配置
安装后,我们首先了解ZooKeeper的基本配置,然后了解将每个节点配置为集群一部分的特定参数。
初始配置
创建名为<ZOOKEEPER_HOME>/conf/zoo.cfg
的文件。您的ZooKeeper安装中包含一个示例配置文件,名为conf/zoo_sample.cfg
。如果愿意,您可以编辑并重命名该文件,而不是创建新文件。
基本配置示例
1 | tickTime=2000 |
参数详解
参数 | 必需性 | 说明 |
---|---|---|
tickTime |
必需 | ZooKeeper用于确定哪些服务器在任何给定时间启动并运行,最小会话超时定义为两个”tick”。指定每个tick的毫秒数 |
dataDir |
必需 | ZooKeeper存储集群数据的目录。首次启动ZooKeeper前此目录必须为空 |
clientPort |
必需 | Solr访问ZooKeeper的端口 |
4lw.commands.whitelist |
可选 | 允许Solr管理界面查询ZooKeeper。可选择使用* 启用所有”4字母命令”,列出的三个命令将启用管理界面 |
这些是每个ZooKeeper节点需要使用的基本参数,因此必须将此文件复制到或在每个节点上创建。
集群配置
为了完成集群配置,我们需要设置额外参数,以便每个节点知道它在集群中的身份以及其他每个节点的位置。
完整配置示例
1 | tickTime=2000 |
新增参数说明
initLimit
- 必需参数
- 说明:允许跟随者连接并同步到领导者的时间量(以tick为单位)
- 示例计算:5个tick,每个2000毫秒,服务器将等待10秒来连接和同步领导者
syncLimit
- 必需参数
- 说明:允许跟随者与ZooKeeper同步的时间量(以tick为单位)
- 行为:如果跟随者落后领导者太远,它们将被丢弃
server.X
- 必需参数
- 格式:
server.X=hostname:port1:port2
- 说明:集群中所有服务器的服务器ID(X部分)、主机名(或IP地址)和端口
- 作用:ID区分集群的每个节点,允许每个节点知道其他节点的位置
- 默认端口:ZooKeeper的默认端口是
2888:3888
myid文件配置
由于我们已将服务器ID分配给特定主机/端口,我们还必须定义此节点在列表中是哪个服务器。我们通过存储在数据目录中的myid
文件来完成此操作。
创建myid文件:
1 | # 节点1 |
自动清理配置
autopurge.snapRetainCount
- 可选参数,默认值:3
- 说明:清理旧快照和事务日志时保留的快照和相应事务日志数量
- 背景:ZooKeeper自动保留事务日志并在发生更改时写入。定期拍摄当前状态快照,此快照取代比快照更旧的事务日志。但是,ZooKeeper从不清理旧快照或旧事务日志;随着时间推移,它们将默默填满每个服务器上的可用磁盘空间
- 最小值:不能设置低于3
autopurge.purgeInterval
- 可选参数,默认值:0
- 说明:清理任务之间的时间(小时)
- 重要:默认为0,必须设置为1或更高以启用快照和事务日志的自动清理
- 建议:设置为24(一天一次)是可接受的
多节点配置示例
第二个节点配置
更新<ZOOKEEPER_HOME>/conf/zoo.cfg
文件,使其与节点1上的内容匹配:
1 | tickTime=2000 |
创建内容为”2”的myid
文件:
1 | echo "2" > /var/lib/zookeeper/myid |
第三个节点配置
配置文件与前两个节点相同,myid
文件内容为”3”:
1 | echo "3" > /var/lib/zookeeper/myid |
对于5节点集群的服务器4和5,重复此过程(这是罕见情况)。
ZooKeeper环境配置
为了在集群出现问题时便于故障排除,建议在启用日志记录和适当的JVM垃圾收集(GC)设置的情况下运行ZooKeeper。
环境配置文件
创建环境配置文件:在
<ZOOKEEPER_HOME>/conf
目录中创建名为zookeeper-env.sh
的文件(与zoo.cfg
相同位置)。此文件需要在集群的每个服务器上存在。添加配置:将以下设置添加到文件:
1 | ZOO_LOG_DIR="/path/for/log/files" |
环境变量说明
变量 | 说明 |
---|---|
ZOO_LOG_DIR |
ZooKeeper打印日志的服务器位置 |
ZOO_LOG4J_PROP |
设置日志级别和日志追加器 |
SERVER_JVMFLAGS |
垃圾收集和记录GC相关事件的参数 |
日志配置优化
查看默认设置:检查
<ZOOKEEPER_HOME>/conf/log4j.properties
中的默认设置,特别是log4j.appender.ROLLINGFILE.MaxFileSize
参数。这设置了日志文件将滚动的大小,默认为10MB。复制配置:将
zookeeper-env.sh
和对log4j.properties
的任何更改复制到集群中的每个服务器。
注意:以上说明仅适用于Linux服务器。默认的
zkServer.sh
脚本包含对zookeeper-env.sh
文件的支持,但脚本的Windows版本zkServer.cmd
不包含。要在Windows服务器上进行相同配置,需要直接在zkServer.cmd
中进行更改。
ZooKeeper启动和停止
启动ZooKeeper
使用<ZOOKEEPER_HOME>/bin/zkServer.sh
或zkServer.cmd
脚本启动集群:
Linux系统:
1 | zkServer.sh start |
Windows系统:
1 | zkServer.cmd start |
此命令需要在将运行ZooKeeper的每个服务器上运行。
提示:您应该在定义存储的目录中看到ZooKeeper日志。但是,启动后立即,您可能还看不到
zookeeper_gc.log
,因为它可能直到第一次发生垃圾收集才会出现。
关闭ZooKeeper
使用相同的脚本和”stop”命令在每个服务器上关闭ZooKeeper:
Linux系统:
1 | zkServer.sh stop |
Windows系统:
1 | zkServer.cmd stop |
集群状态检查
检查ZooKeeper节点状态:
1 | # 检查节点状态 |
Solr配置集成
启动Solr时,必须提供ZooKeeper地址,否则Solr不知道如何使用它。这可以通过两种方式完成:
- 在每次启动时定义连接字符串:在Solr集群每个节点的每次启动时提供运行ZooKeeper的服务器列表
- 编辑Solr包含文件:作为永久系统参数
ZooKeeper连接字符串
引用Solr中ZooKeeper的位置时,最好使用集群中所有服务器的地址。如果一个恰好宕机,Solr将能够自动将请求发送到列表中的另一个服务器。
重要提醒:ZooKeeper版本3.5及更高版本支持服务器地址和角色的动态重新配置。但请注意,Solr只能与静态ZooKeeper连接字符串中列出的服务器通信。
使用chroot
如果您的集群被或将被Solr之外的其他系统共享,您应该考虑定义特定于应用程序的znodes,或仅包含Solr文件的分层命名空间。
创建chroot
使用bin/solr
命令创建chroot:
1 | bin/solr zk mkroot /solr -z zk1:2181,zk2:2181,zk3:2181 |
创建znode后,它的行为类似于文件系统上的目录:Solr在ZooKeeper中存储的数据嵌套在主数据目录下,不会与使用同一ZooKeeper集群的其他系统或进程的数据混合。
使用-z参数配置
将Solr指向您创建的ZooKeeper集群是使用bin/solr
脚本时使用-z
参数的简单事项。
示例:指向ZooKeeper与chroot
1 | bin/solr start -e cloud -z zk1:2181,zk2:2181,zk3:2181/solr |
自动创建znode:如果znode不存在,可以设置ZK_CREATE_CHROOT
环境变量为true在启动时自动创建它:
1 | ZK_CREATE_CHROOT=true bin/solr start -e cloud -z zk1:2181,zk2:2181,zk3:2181/solr |
更新Solr包含文件
如果您更新覆盖bin/solr
使用的默认值的Solr包含文件(solr.in.sh
或solr.in.cmd
),则不必在bin/solr
命令中使用-z
参数。
Linux系统配置
solr.in.sh:
查找注释掉的部分:
1 | # Set the ZooKeeper connection string if using an external ZooKeeper ensemble |
移除注释并输入ZooKeeper连接字符串:
1 | # Set the ZooKeeper connection string if using an external ZooKeeper ensemble |
Windows系统配置
solr.in.cmd:
查找注释掉的部分:
1 | REM Set the ZooKeeper connection string if using an external ZooKeeper ensemble |
移除注释并输入连接字符串:
1 | REM Set the ZooKeeper connection string if using an external ZooKeeper ensemble |
增加文件大小限制
默认限制
ZooKeeper设计用于保存小文件,大小约为千字节。默认情况下,ZooKeeper的文件大小限制为1MB。尝试写入或读取大于此限制的文件将导致错误。
需要大文件的功能
一些Solr功能需要可能大于默认限制的配置资源:
- 文本分析同义词
- LTR(学习排序)
- OpenNLP命名实体识别
配置jute.maxbuffer
ZooKeeper可以通过Java系统属性jute.maxbuffer
配置以增加此限制。此配置对于ZooKeeper服务器和连接到服务器的所有客户端都是必需的,并且必须在指定的任何地方都相同。
在ZooKeeper节点上配置
必须在每个外部ZooKeeper节点上配置jute.maxbuffer
。以下任何方式都可以实现(注意只有第一个选项在Windows上有效):
- 在zoo.cfg中配置(增加到10MB以下1字节):
1 | jute.maxbuffer=0x9fffff |
- 在zookeeper-env.sh中配置(增加到50MiB):
1 | JVMFLAGS="$JVMFLAGS -Djute.maxbuffer=50000000" |
- 在zkServer.sh中配置(增加到5MiB):
1 | JVMFLAGS="$JVMFLAGS -Djute.maxbuffer=5000000" |
为ZooKeeper客户端配置
bin/solr
脚本调用充当ZooKeeper客户端的Java程序。当您使用Solr的捆绑ZooKeeper服务器而不是设置外部ZooKeeper集群时,下面描述的配置也将配置ZooKeeper服务器。
将设置添加到Solr包含文件中的SOLR_OPTS
环境变量:
Linux系统(solr.in.sh):
1 | # 增加文件大小限制到2MB |
Windows系统(solr.in.cmd):
1 | REM 增加文件大小限制到2MB |
生产环境最佳实践
1. 硬件配置建议
服务器规格
组件 | 推荐配置 | 说明 |
---|---|---|
CPU | 4核心以上 | ZooKeeper对CPU要求不高,但需要足够处理并发请求 |
内存 | 4GB-8GB | 推荐8GB,确保有足够内存缓存数据 |
存储 | SSD | 事务日志写入性能直接影响ZooKeeper性能 |
网络 | 千兆以太网 | 节点间通信需要稳定的网络连接 |
JVM配置优化
1 | # zookeeper-env.sh |
2. 存储和数据管理
数据目录配置
1 | # 为不同类型数据使用独立目录 |
存储最佳实践
1 | # 事务日志和数据快照分离 |
自动清理配置
1 | # 更保守的清理策略 |
3. 网络和安全配置
防火墙配置
1 | # 开放必要端口 |
SSL加密配置
1 | # 启用SSL(ZooKeeper 3.5+) |
4. 监控和告警
关键监控指标
1 |
|
Prometheus监控集成
1 | # 使用JMX导出器监控ZooKeeper |
5. 备份和恢复策略
数据备份脚本
1 |
|
数据恢复过程
1 |
|
6. 运维脚本集合
集群健康检查
1 |
|
自动化部署脚本
1 |
|
故障排除指南
常见问题及解决方案
1. ZooKeeper无法启动
问题症状:
1 | Unable to read additional data from server sessionid 0x0 |
排查步骤:
1 | # 检查端口占用 |
2. 集群分裂问题
问题症状:部分节点无法连接到集群
解决方案:
1 | # 检查网络连通性 |
3. 性能问题
问题症状:客户端连接缓慢或超时
优化措施:
1 | # 调整tickTime |
日志分析工具
1 |
|
总结
通过本指南,您应该能够成功配置和管理生产级别的ZooKeeper集群。关键要点包括:
- 合理规划节点数量:通常使用3或5个节点,保持奇数个节点
- 正确配置参数:包括tickTime、initLimit、syncLimit等关键参数
- 优化JVM设置:配置适当的内存和GC参数
- 建立监控体系:监控集群健康状态和性能指标
- 制定备份策略:定期备份ZooKeeper数据
- 安全配置:启用SSL加密和访问控制
记住,ZooKeeper是Solr集群的协调中心,其稳定性直接影响整个搜索服务的可用性。在生产环境中,务必遵循最佳实践,建立完善的监控和运维流程。