Solr部署:生产环境部署完整指南与最佳实践
本文提供了在*nix平台(如Ubuntu)上设置Solr生产环境运行的详细指南。我们将详细介绍在Linux主机上设置单个Solr实例的过程,然后提供在同一主机上支持多个Solr节点运行的技巧。
服务安装脚本概述
Solr包含一个服务安装脚本(bin/install_solr_service.sh
),帮助您在Linux上将Solr安装为服务。目前,该脚本仅支持CentOS、Debian、Red Hat、SUSE和Ubuntu Linux发行版。
预安装规划
在运行脚本之前,需要确定设置的几个参数:
- Solr安装位置
- 拥有Solr文件和进程的系统用户
目录结构规划
我们建议将活动Solr文件(如日志和索引文件)与Solr发行包中包含的文件分开,因为这使得升级Solr更容易,也被认为是系统管理员应遵循的良好实践。
Solr安装目录
默认情况下,服务安装脚本将发行版归档提取到/opt
目录。您可以使用运行安装脚本时的-i
选项更改此位置。脚本还将创建到Solr版本化目录的符号链接。
例如,如果您运行Solr 9.7.0的安装脚本,将使用以下目录结构:
1 | /opt/solr-9.7.0 |
使用符号链接的好处:
- 隔离脚本对特定Solr版本的依赖性
- 升级时只需更新符号链接指向新版本
- 简化版本管理和回滚操作
可写文件分离目录
您还应该将可写Solr文件分离到不同的目录;默认情况下,安装脚本使用/var/solr
,但您可以使用-d
选项覆盖此位置。
分离架构的优势:
/opt/solr
中的文件保持不变- 所有在Solr运行时发生变化的文件都存储在
/var/solr
下 - 便于备份和恢复操作
- 简化权限管理
创建Solr用户
出于安全原因,不建议以root
用户运行Solr,bin/solr start
命令会拒绝这样做。因此,您应该确定将拥有所有Solr文件和运行Solr进程的系统用户名。
用户配置选项
- 默认用户:安装脚本将创建
solr
用户 - 自定义用户:使用
-u
选项覆盖设置 - 组织要求:如果组织对创建新用户账户有特定要求,应在运行脚本前创建用户
安装脚本将使Solr用户成为/opt/solr
和/var/solr
目录的所有者。
运行Solr安装脚本
下载和提取安装脚本
1 | # 提取安装脚本 |
安装依赖(Red Hat系统)
如果在Red Hat上安装,请确保在运行Solr安装脚本前安装lsof:
1 | sudo yum install lsof |
执行安装脚本
安装脚本必须以root权限运行:
1 | # 基本安装 |
安装选项说明
选项 | 说明 | 默认值 |
---|---|---|
-i |
安装目录 | /opt |
-d |
数据目录 | /var/solr |
-u |
系统用户 | solr |
-s |
服务名称 | solr |
-p |
端口号 | 8983 |
-n |
不立即启动服务 | 立即启动 |
查看所有可用选项:
1 | sudo bash ./install_solr_service.sh --help |
验证安装
脚本完成后,Solr将作为服务安装并在服务器后台运行(端口8983)。验证安装:
1 | sudo service solr status |
安装脚本执行步骤详解
Solr Home目录
Solr home目录(不要与Solr安装目录混淆)是Solr管理包含索引文件的核心目录的位置。
- 默认位置:
/var/solr/data
- 自定义位置:使用
-d
选项时为指定位置的data
子目录 - 重要文件:如果不在ZooKeeper中存储
solr.xml
,home目录必须包含solr.xml
文件
环境覆盖包含文件
服务安装脚本创建特定环境的包含文件,用于覆盖bin/solr
脚本使用的默认值。
包含文件路径:
- 默认路径:
/etc/default/solr.in.sh
- 自定义服务:
/etc/default/{服务名}.in.sh
最小配置要求:
1 | SOLR_PID_DIR=/var/solr |
关键变量说明:
SOLR_PID_DIR
:控制脚本写入包含Solr服务器进程ID文件的目录SOLR_HOME
:Solr home目录位置
日志设置
Solr使用Apache Log4J进行日志记录。安装脚本将/opt/solr/server/resources/log4j2.xml
复制到/var/solr/log4j2.xml
。
验证日志配置:
1 | # 检查包含文件中的日志设置 |
标准日志配置:
1 | LOG4J_PROPS=/var/solr/log4j2.xml |
init.d脚本
安装脚本创建一个基本的init.d脚本来帮助您开始使用。
脚本位置:
- 默认:
/etc/init.d/solr
- 自定义服务:
/etc/init.d/{服务名}
关键变量设置:
1 | SOLR_INSTALL_DIR=/opt/solr |
支持的命令:
1 | service solr start # 启动服务 |
进度检查
在继续下一步之前,请验证以下命令能正常工作:
1 | sudo service solr restart |
正常状态输出示例:
1 | Solr process PID running on port 8983 |
如果status
命令不成功,请查看/var/solr/logs/solr.log
中的错误信息。
生产环境细调配置
ConcurrentMergeScheduler动态默认值
合并调度器在solrconfig.xml
中配置,默认为ConcurrentMergeScheduler
。此调度器使用多个线程在后台合并Lucene段。
默认设置
- maxThreadCount:设置为4或JVM可用处理器数的一半(取较大值)
- maxMergeCount:设置为
maxThreadCount+5
机械硬盘优化建议
如果使用机械硬盘,最好在SolrConfig.xml的IndexConfig部分明确设置maxThreadCount
和maxMergeCount
值,以使用适合您硬件的值。
内存和GC设置
堆内存配置
默认情况下,bin/solr
脚本将最大Java堆大小设置为512M(-Xmx512m),这对于Solr入门来说是合适的。对于生产环境,您需要根据搜索应用程序的内存要求增加最大堆大小;生产服务器通常使用8到16GB的值。
设置堆内存:
1 | # 在包含文件中设置 |
重要提示:除非您知道需要,否则不要分配非常大的Java堆。有关详细信息,请参阅选择内存堆设置。
垃圾收集优化
Solr控制脚本附带一组预配置的Garbage First垃圾收集设置,这些设置已被证明适用于许多不同的工作负载。但是,这些设置可能不适用于您对Solr的特定使用。
自定义GC设置:
1 | # 在包含文件中设置GC调优参数 |
推荐参考资料:
内存不足处理
bin/solr
脚本使用-XX:+CrashOnOutOfMemoryError
JVM选项在OutOfMemoryError
异常时使Solr崩溃。这种行为是推荐的。在SolrCloud模式下,ZooKeeper将立即收到节点遇到不可恢复错误的通知。
SolrCloud生产配置
ZooKeeper集群配置
要在SolrCloud模式下运行Solr,需要在包含文件中设置ZK_HOST
变量指向您的ZooKeeper集群。生产环境不支持运行嵌入式ZooKeeper。
基本ZooKeeper配置:
1 | # 三个ZooKeeper主机示例 |
设置ZK_HOST
变量后,Solr将以”cloud”模式启动。
ZooKeeper chroot
如果您使用的ZooKeeper实例被其他系统共享,建议使用ZooKeeper的chroot支持隔离SolrCloud znode树。
chroot配置示例:
1 | ZK_HOST=zk1,zk2,zk3/solr |
首次使用chroot前的准备:
1 | # 创建根路径 |
未知核心删除
当Solr从文件系统加载核心时,它会检查ZooKeeper中的相应集群状态。如果没有相应条目存在,核心将被跳过并记录警告。
自动删除孤立文件:
1 | SOLR_DELETE_UNKNOWN_CORES=true |
Solr主机名配置
使用包含文件中的SOLR_HOST
变量设置Solr服务器的主机名:
1 | SOLR_HOST=solr1.example.com |
设置Solr服务器的主机名是推荐的,特别是在SolrCloud模式下运行时,因为这决定了节点在ZooKeeper注册时的地址。
管理界面环境横幅
为了防止意外对错误的集群进行更改,您可以在管理界面中配置视觉指示,显示您当前是否使用生产环境。
配置环境标识:
1 | # 在solr.in.sh中设置 |
允许的值:dev
、test
、stage
或prod
自定义标签和颜色示例:
prod
(默认标签是’Production’,默认颜色是红色调)test,label=Functional+test
(覆盖标签,保持默认黄色)dev,label=MyDev,color=blue
(覆盖标签和颜色)stage,color=#ff8888
(自定义颜色代码)
solrconfig.xml设置覆盖
Solr允许使用启动时传递的Java系统属性覆盖配置属性,使用-Dproperty=value
语法。
配置文件中的可覆盖属性示例:
1 | <autoSoftCommit> |
覆盖示例:
1 | # 直接启动时覆盖 |
Ulimit设置(*nix操作系统)
重要设置检查
查看当前ulimit设置:
1 | ulimit -a |
关键设置建议
以下四个设置特别重要,应设置得很高,如果可能的话设置为无限:
设置 | 命令 | 推荐最小值 | 说明 |
---|---|---|---|
最大进程数 | ulimit -u |
65,000 | 进程限制 |
文件句柄数 | ulimit -n |
65,000 | 所有副本的文件句柄 |
虚拟内存 | ulimit -v |
unlimited | 用于MMapping索引 |
最大内存大小 | ulimit -m |
unlimited | MMap使用 |
系统级设置:
1 | # 如果系统支持,也应设置为无限 |
永久设置
我们强烈建议永久提高这些设置。具体过程因操作系统而异。一些系统需要编辑配置文件并重启服务器。
警告:每次升级内核或操作系统时检查这些限制。这些操作可能将它们重置为默认值。
警告:如果超过这些限制,Solr报告的问题会因负责超过限制的特定操作而异。已报告的错误包括”too many open files”、”connection error”和”max processes exceeded”,以及SolrCloud恢复失败。
避免交换(*nix操作系统)
运行像Solr这样的Java应用程序时,让操作系统将内存交换到磁盘是非常糟糕的情况。我们通常更喜欢硬崩溃,以便其他健康的Solr节点可以接管,而不是让Solr节点交换,导致糟糕的性能、超时和不稳定的系统。
禁用交换
临时禁用:
1 | sudo swapoff -a |
永久禁用:确保您有足够的物理RAM,然后查阅Linux系统文档了解禁用交换的正确程序。
降低交换积极性
检查当前设置:
1 | cat /proc/sys/vm/swappiness |
永久更改:编辑/etc/sysctl.conf
文件:
1 | vm.swappiness = 1 |
临时更改:
1 | echo 1 > /proc/sys/vm/swappiness |
安全考虑
网络绑定安全
管理员应该仔细考虑其安全设置,这是迁移到生产环境的重要步骤。虽然Solr提供了开箱即用的安全功能,但正确的网络配置至关重要:
- 防火墙保护:强烈建议始终使用防火墙保护Solr
- 最小暴露:不应不必要地将Solr暴露给外部世界
- 接口限制:建议Solr仅监听严格必需的网络接口
默认安全配置:
1 | # 默认只监听回环接口 |
嵌入式ZooKeeper配置:
1 | SOLR_ZK_EMBEDDED_HOST="0.0.0.0" |
运行多个Solr节点
何时考虑多节点
bin/solr
脚本能够在一台机器上运行多个实例,但对于典型安装,这不是推荐的设置。每个额外实例都需要额外的CPU和内存资源。单个实例很容易处理多个索引。
例外情况
对于每个建议,都有例外。上述建议的例外主要适用于讨论极端可扩展性的情况:
运行多个Solr节点的最佳理由:
- 减少极大堆的需求:当Java堆变得非常大时,可能导致极长的垃圾收集暂停
- 避免32GB限制:Java在32GB以下可以使用压缩指针,超过时需要更大的指针
临界点指导:
- 堆大小达到16-32GB时,可能是考虑拆分节点的时候
- 如果需要超过31GB的堆,考虑多节点通常比单节点>32GB堆性能更好
多节点配置要求
如果您的用例需要多个实例,至少需要:
- 独立的Solr home目录:每个要运行的节点
- 不同物理磁盘:理想情况下,避免多个节点在访问磁盘文件时相互竞争
- 不同包含文件:每个节点需要不同的包含文件
- 独立的init.d脚本:如果使用
/etc/init.d/solr
脚本
多节点安装示例
安装第二个服务:
1 | sudo bash ./install_solr_service.sh solr-9.7.0.tgz -s solr2 -p 8984 |
上述命令将:
- 添加名为
solr2
的服务,运行在端口8984 - 使用
/var/solr2
存储可写文件 - 仍由
solr
用户拥有和运行 - 使用
/opt
中的Solr发行版文件
验证第二个服务:
1 | sudo service solr2 restart |
生产环境最佳实践总结
1. 硬件配置建议
CPU配置
- 最小配置:4核心处理器
- 推荐配置:8核心以上
- 高负载环境:16核心以上
内存配置
- 最小配置:8GB RAM
- 推荐配置:16GB-32GB RAM
- 堆内存设置:通常为系统内存的50%-75%
存储配置
- 推荐:SSD存储用于索引文件
- 备选:高性能机械磁盘(15K RPM)
- RAID配置:RAID 10用于性能和冗余
2. 操作系统优化
文件系统建议
1 | # 推荐的挂载选项(ext4) |
网络优化
1 | # 增加网络缓冲区大小 |
3. 监控配置
JMX监控
1 | # 启用JMX |
健康检查脚本
1 |
|
4. 备份和恢复策略
自动备份脚本
1 |
|
5. 升级策略
零停机升级步骤
- 备份当前配置和数据
- 在测试环境验证新版本
- 逐个节点滚动升级
- 验证集群健康状态
- 回滚方案准备
通过遵循本指南,您应该能够成功地在生产环境中部署和管理Apache Solr,确保高性能、高可用性和安全性。记住,生产部署是一个持续的过程,需要定期监控、调优和维护。