Solr部署:生产环境部署完整指南与最佳实践

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
2
/opt/solr-9.7.0
/opt/solr -> /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
2
# 提取安装脚本
tar xzf solr-9.7.0.tgz solr-9.7.0/bin/install_solr_service.sh --strip-components=2

安装依赖(Red Hat系统)

如果在Red Hat上安装,请确保在运行Solr安装脚本前安装lsof

1
sudo yum install lsof

执行安装脚本

安装脚本必须以root权限运行:

1
2
3
4
5
# 基本安装
sudo bash ./install_solr_service.sh solr-9.7.0.tgz

# 等效的完整参数版本
sudo bash ./install_solr_service.sh solr-9.7.0.tgz -i /opt -d /var/solr -u solr -s solr -p 8983

安装选项说明

选项 说明 默认值
-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
2
SOLR_PID_DIR=/var/solr
SOLR_HOME=/var/solr/data

关键变量说明

  • SOLR_PID_DIR:控制脚本写入包含Solr服务器进程ID文件的目录
  • SOLR_HOME:Solr home目录位置

日志设置

Solr使用Apache Log4J进行日志记录。安装脚本将/opt/solr/server/resources/log4j2.xml复制到/var/solr/log4j2.xml

验证日志配置:

1
2
# 检查包含文件中的日志设置
grep -E "LOG4J_PROPS|SOLR_LOGS_DIR" /etc/default/solr.in.sh

标准日志配置

1
2
LOG4J_PROPS=/var/solr/log4j2.xml
SOLR_LOGS_DIR=/var/solr/logs

init.d脚本

安装脚本创建一个基本的init.d脚本来帮助您开始使用。

脚本位置

  • 默认:/etc/init.d/solr
  • 自定义服务:/etc/init.d/{服务名}

关键变量设置

1
2
3
SOLR_INSTALL_DIR=/opt/solr
SOLR_INCLUDE=/etc/default/solr.in.sh
RUNAS=solr

支持的命令

1
2
3
4
service solr start    # 启动服务
service solr stop # 停止服务
service solr restart # 重启服务
service solr status # 查看状态

进度检查

在继续下一步之前,请验证以下命令能正常工作:

1
2
sudo service solr restart
sudo service solr status

正常状态输出示例

1
2
3
4
5
6
7
Solr process PID running on port 8983
{
"version":"9.7.0 - ubuntu - 2024-12-17 19:36:58",
"startTime":"2024-12-19T19:25:46.853Z",
"uptime":"0 days, 0 hours, 0 minutes, 8 seconds",
"memory":"85.4 MB (%17.4) of 490.7 MB"
}

如果status命令不成功,请查看/var/solr/logs/solr.log中的错误信息。

生产环境细调配置

ConcurrentMergeScheduler动态默认值

合并调度器在solrconfig.xml中配置,默认为ConcurrentMergeScheduler。此调度器使用多个线程在后台合并Lucene段。

默认设置

  • maxThreadCount:设置为4或JVM可用处理器数的一半(取较大值)
  • maxMergeCount:设置为maxThreadCount+5

机械硬盘优化建议

如果使用机械硬盘,最好在SolrConfig.xml的IndexConfig部分明确设置maxThreadCountmaxMergeCount值,以使用适合您硬件的值。

内存和GC设置

堆内存配置

默认情况下,bin/solr脚本将最大Java堆大小设置为512M(-Xmx512m),这对于Solr入门来说是合适的。对于生产环境,您需要根据搜索应用程序的内存要求增加最大堆大小;生产服务器通常使用8到16GB的值。

设置堆内存

1
2
# 在包含文件中设置
SOLR_HEAP="8g"

重要提示:除非您知道需要,否则不要分配非常大的Java堆。有关详细信息,请参阅选择内存堆设置。

垃圾收集优化

Solr控制脚本附带一组预配置的Garbage First垃圾收集设置,这些设置已被证明适用于许多不同的工作负载。但是,这些设置可能不适用于您对Solr的特定使用。

自定义GC设置

1
2
# 在包含文件中设置GC调优参数
GC_TUNE="-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=16m"

推荐参考资料

  1. Shawn Heisey的GC指南
  2. Oracle G1GC文档

内存不足处理

bin/solr脚本使用-XX:+CrashOnOutOfMemoryError JVM选项在OutOfMemoryError异常时使Solr崩溃。这种行为是推荐的。在SolrCloud模式下,ZooKeeper将立即收到节点遇到不可恢复错误的通知。

SolrCloud生产配置

ZooKeeper集群配置

要在SolrCloud模式下运行Solr,需要在包含文件中设置ZK_HOST变量指向您的ZooKeeper集群。生产环境不支持运行嵌入式ZooKeeper。

基本ZooKeeper配置

1
2
# 三个ZooKeeper主机示例
ZK_HOST=zk1,zk2,zk3

设置ZK_HOST变量后,Solr将以”cloud”模式启动。

ZooKeeper chroot

如果您使用的ZooKeeper实例被其他系统共享,建议使用ZooKeeper的chroot支持隔离SolrCloud znode树。

chroot配置示例

1
ZK_HOST=zk1,zk2,zk3/solr

首次使用chroot前的准备

1
2
# 创建根路径
bin/solr zk mkroot /solr -z <ZK_node>:<ZK_PORT>

未知核心删除

当Solr从文件系统加载核心时,它会检查ZooKeeper中的相应集群状态。如果没有相应条目存在,核心将被跳过并记录警告。

自动删除孤立文件

1
SOLR_DELETE_UNKNOWN_CORES=true

Solr主机名配置

使用包含文件中的SOLR_HOST变量设置Solr服务器的主机名:

1
SOLR_HOST=solr1.example.com

设置Solr服务器的主机名是推荐的,特别是在SolrCloud模式下运行时,因为这决定了节点在ZooKeeper注册时的地址。

管理界面环境横幅

为了防止意外对错误的集群进行更改,您可以在管理界面中配置视觉指示,显示您当前是否使用生产环境。

配置环境标识

1
2
# 在solr.in.sh中设置
SOLR_OPTS="$SOLR_OPTS -Dsolr.environment=prod"

允许的值devteststageprod

自定义标签和颜色示例

  • prod(默认标签是’Production’,默认颜色是红色调)
  • test,label=Functional+test(覆盖标签,保持默认黄色)
  • dev,label=MyDev,color=blue(覆盖标签和颜色)
  • stage,color=#ff8888(自定义颜色代码)

solrconfig.xml设置覆盖

Solr允许使用启动时传递的Java系统属性覆盖配置属性,使用-Dproperty=value语法。

配置文件中的可覆盖属性示例

1
2
3
<autoSoftCommit>
<maxTime>${solr.autoSoftCommit.maxTime:3000}</maxTime>
</autoSoftCommit>

覆盖示例

1
2
3
4
5
# 直接启动时覆盖
bin/solr start -Dsolr.autoSoftCommit.maxTime=10000

# 生产环境推荐:在包含文件中设置
SOLR_OPTS="$SOLR_OPTS -Dsolr.autoSoftCommit.maxTime=10000"

Ulimit设置(*nix操作系统)

重要设置检查

查看当前ulimit设置:

1
ulimit -a

关键设置建议

以下四个设置特别重要,应设置得很高,如果可能的话设置为无限:

设置 命令 推荐最小值 说明
最大进程数 ulimit -u 65,000 进程限制
文件句柄数 ulimit -n 65,000 所有副本的文件句柄
虚拟内存 ulimit -v unlimited 用于MMapping索引
最大内存大小 ulimit -m unlimited MMap使用

系统级设置

1
2
# 如果系统支持,也应设置为无限
sysctl vm.max_map_count=262144

永久设置

我们强烈建议永久提高这些设置。具体过程因操作系统而异。一些系统需要编辑配置文件并重启服务器。

警告:每次升级内核或操作系统时检查这些限制。这些操作可能将它们重置为默认值。

警告:如果超过这些限制,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
2
3
4
5
# 默认只监听回环接口
SOLR_JETTY_HOST="127.0.0.1"

# 生产环境通常需要设置为
SOLR_JETTY_HOST="0.0.0.0"

嵌入式ZooKeeper配置

1
SOLR_ZK_EMBEDDED_HOST="0.0.0.0"

运行多个Solr节点

何时考虑多节点

bin/solr脚本能够在一台机器上运行多个实例,但对于典型安装,这不是推荐的设置。每个额外实例都需要额外的CPU和内存资源。单个实例很容易处理多个索引。

例外情况

对于每个建议,都有例外。上述建议的例外主要适用于讨论极端可扩展性的情况:

运行多个Solr节点的最佳理由

  • 减少极大堆的需求:当Java堆变得非常大时,可能导致极长的垃圾收集暂停
  • 避免32GB限制:Java在32GB以下可以使用压缩指针,超过时需要更大的指针

临界点指导

  • 堆大小达到16-32GB时,可能是考虑拆分节点的时候
  • 如果需要超过31GB的堆,考虑多节点通常比单节点>32GB堆性能更好

多节点配置要求

如果您的用例需要多个实例,至少需要:

  1. 独立的Solr home目录:每个要运行的节点
  2. 不同物理磁盘:理想情况下,避免多个节点在访问磁盘文件时相互竞争
  3. 不同包含文件:每个节点需要不同的包含文件
  4. 独立的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
2
sudo service solr2 restart
sudo service solr2 status

生产环境最佳实践总结

1. 硬件配置建议

CPU配置

  • 最小配置:4核心处理器
  • 推荐配置:8核心以上
  • 高负载环境:16核心以上

内存配置

  • 最小配置:8GB RAM
  • 推荐配置:16GB-32GB RAM
  • 堆内存设置:通常为系统内存的50%-75%

存储配置

  • 推荐:SSD存储用于索引文件
  • 备选:高性能机械磁盘(15K RPM)
  • RAID配置:RAID 10用于性能和冗余

2. 操作系统优化

文件系统建议

1
2
# 推荐的挂载选项(ext4)
/dev/sdb1 /var/solr ext4 defaults,noatime,nodiratime 0 2

网络优化

1
2
3
# 增加网络缓冲区大小
echo 'net.core.rmem_max = 16777216' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 16777216' >> /etc/sysctl.conf

3. 监控配置

JMX监控

1
2
3
4
5
# 启用JMX
SOLR_OPTS="$SOLR_OPTS -Dcom.sun.management.jmxremote"
SOLR_OPTS="$SOLR_OPTS -Dcom.sun.management.jmxremote.port=18983"
SOLR_OPTS="$SOLR_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
SOLR_OPTS="$SOLR_OPTS -Dcom.sun.management.jmxremote.ssl=false"

健康检查脚本

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# solr-health-check.sh
SOLR_URL="http://localhost:8983/solr/admin/info/system"
response=$(curl -s -o /dev/null -w "%{http_code}" $SOLR_URL)
if [ $response = "200" ]; then
echo "Solr is healthy"
exit 0
else
echo "Solr health check failed with response code: $response"
exit 1
fi

4. 备份和恢复策略

自动备份脚本

1
2
3
4
5
6
7
8
#!/bin/bash
# solr-backup.sh
BACKUP_DIR="/backup/solr"
DATE=$(date +%Y%m%d_%H%M%S)

for collection in $(curl -s "http://localhost:8983/solr/admin/collections?action=LIST&wt=json" | jq -r '.collections[]'); do
curl "http://localhost:8983/solr/admin/collections?action=BACKUP&name=${collection}_${DATE}&location=${BACKUP_DIR}&collection=${collection}"
done

5. 升级策略

零停机升级步骤

  1. 备份当前配置和数据
  2. 在测试环境验证新版本
  3. 逐个节点滚动升级
  4. 验证集群健康状态
  5. 回滚方案准备

通过遵循本指南,您应该能够成功地在生产环境中部署和管理Apache Solr,确保高性能、高可用性和安全性。记住,生产部署是一个持续的过程,需要定期监控、调优和维护。

© 2025 Solr Community of China All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero