其他分享
首页 > 其他分享> > 将Solr投入生产

将Solr投入生产

作者:互联网

本节提供关于如何在*nix平台(如Ubuntu)上设置Solr以在生产中运行的指导。具体来说,我们将完成在Linux主机上运行单个Solr实例的设置过程,然后提供有关如何支持在同一主机上运行的多个Solr节点的技巧。

服务安装脚本(Service Installation Script)

Solr包括一个服务安装脚本(bin/install_Solr_service.sh),以帮助您将Solr作为一个服务安装在Linux上。目前,脚本只支持CentOS、Debian、RedHat、SUSE和UbuntuLinux发行版。在运行脚本之前,需要确定有关设置的一些参数。具体来说,您需要决定在哪里安装solr,以及哪个系统用户应该是solr文件和进程的所有者。

规划目录结构

我们建议将动态Solr文件(如日志和索引文件)与Solr分发包中包含的文件分开,因为这使升级Solr变得更容易,并且被认为是作为系统管理员遵循的一种良好做法。

SOLR安装目录

默认情况下,服务安装脚本将分发存档解压缩到/opt中。在运行安装脚本时,可以使用-i选项更改此位置。该脚本还将创建一个指向Solr版本目录的符号链接。例如,如果您运行Solr7.6.0的安装脚本,那么将使用以下目录结构:

/opt/solr-7.6.0

/opt/solr -> /opt/solr-7.6.0

使用符号链接可以避免任何脚本依赖于特定的solr版本。如果您需要升级到更高版本的solr,您只需更新符号链接指向升级版本的solr。我们将使用/opt/solr来参考本页其余部分中的solr安装目录。

可写文件的单独目录

您还应该将可写的solr文件分隔到不同的目录中;默认情况下,安装脚本使用/var/solr,但可以使用-d选项覆盖此位置。使用这种方法,/opt/solr中的文件将保持不变,而在solr运行期间更改的所有文件将在/var/solr下进行。

创建Solr用户

出于安全考虑,不建议将Solr作为root运行,并且控制脚本Start命令将拒绝这样做。因此,您应该确定将拥有所有Solr文件和正在运行的Solr进程的系统用户的用户名。默认情况下,安装脚本将创建Solr用户,但可以使用-u选项覆盖此设置。如果您的组织(公司)有创建新用户帐户的特定要求,那么您应该在运行脚本之前创建用户。安装脚本将使Solr用户成为/opt/Solr和/var/Solr目录的所有者。现在可以运行安装脚本了。

运行Solr安装脚本

要运行脚本,您需要下载最新的Solr发行版归档文件,然后执行以下操作:

tar xzf solr-7.6.0.tgz solr-7.6.0/bin/install_solr_service.sh --strip-components=2

前面的命令将install_Solr_service.sh脚本从归档文件中提取到当前目录中。如果安装在RedHat上,请确保在运行Solr安装脚本(sudo yum install lsof)之前安装了lsof。安装脚本必须作为root运行:

sudo bash ./install_solr_service.sh solr-7.6.0.tgz

默认情况下,脚本将分发存档提取到/opt中,将Solr配置为将文件写入/var/Solr,并以Solr用户的身份运行Solr。因此,以下命令产生与前面命令相同的结果:

 

sudo bash ./install_solr_service.sh solr-7.6.0.tgz -i /opt -d /var/solr -u solr -s solr -p 8983

 

可以使用传递给安装脚本的选项自定义服务名称、安装目录、端口和所有者。要查看可用的选项,只需:

sudo bash ./install_solr_service.sh -help

脚本完成后,Solr将作为服务安装,并在服务器(端口8983)的后台运行。要验证,可以执行以下操作:

 

sudo service solr status

如果不想立即启动服务,请传递-n选项。然后,您可以在以后手动启动服务,例如,在完成配置设置之后。

我们将介绍一些额外的配置设置,您可以在一瞬间对您的Solr设置进行微调。在继续之前,让我们仔细看看安装脚本执行的步骤。这将为您提供更好的概述,并有助于您在阅读本指南中的其他页面时了解有关Solr安装的重要详细信息;例如,当一个页面指向Solr Home时,您将确切知道它在您的系统上的位置。

Solr主目录(solr home)

solr主目录(不要与solr安装目录混淆)是solr使用索引文件管理核心目录的地方。默认情况下,安装脚本使用/var/solr/data位置。如果在安装脚本上使用了-d选项,那么这将更改为指定给-d选项的位置中的data子目录。花点时间检查系统上Solr主目录的内容。如果没有将solr.xml存储在ZooKeeper中,则主目录必须包含solr.xml文件。当Solr启动时,Solr控制脚本使用-Dsolr.solr.home=…传递主目录的位置系统属性。

 

环境覆盖包括文件(Environment Overrides Include File)

服务安装脚本创建一个特定于环境的包含文件,该文件覆盖bin/Solr脚本使用的默认值。使用包含文件的主要优点是它提供了一个位置,其中定义了所有特定于环境的重写。花点时间检查/etc/default/solr.in.sh文件的内容,这是安装脚本设置的默认路径。如果您在安装脚本上使用-s选项来更改服务的名称,那么文件名的第一部分将是不同的。对于名为Solr-demo的服务,该文件将命名为/etc/default/Solr-demo.in.sh。可以使用此文件重写许多设置。但是,该脚本至少需要定义Solr_PID_DIR和Solr_HOME变量,例如:

SOLR_PID_DIR=/var/solr

SOLR_HOME=/var/solr/data

SOLR_PID_DIR变量设置控制脚本将写入包含Solr服务器进程ID的文件的目录。

例如:

 

solr-8983.pid

日志设置

Solr使用ApacheLog4J进行日志记录。安装脚本将/opt/solr/server/resources/log4j2.xml复制到/var/solr/log4j2.xml。花点时间通过检查/etc/default/solr.in.sh中的下列设置来验证SolrInclude文件是否配置为将日志发送到正确的位置:

LOG4J_PROPS=/var/solr/log4j2.xml

SOLR_LOGS_DIR=/var/solr/logs

 

init.d脚本

在Linux上运行像Solr这样的服务时,通常设置一个init.d脚本,以便系统管理员可以使用服务工具(如:service solr start)来控制Solr。安装脚本创建一个非常基本的init.d脚本来帮助您入门。花点时间检查/etc/init.d/solr文件,这是安装脚本设置的默认脚本名。如果您在安装脚本上使用-s选项来更改服务的名称,那么文件名将是不同的。请注意,根据传递给安装脚本的参数为您的环境设置了以下变量:

SOLR_INSTALL_DIR=/opt/solr

SOLR_ENV=/etc/default/solr.in.sh

RUNAS=solr

 

Solr_install_DIR和Solr_ENV变量应该是不言自明的。Runas变量设置Solr进程的所有者,例如solr;如果不设置此值,脚本将以root形式运行Solr,这在生产中是不推荐的。您可以使用/etc/init.d/solr脚本以根用户身份执行以下操作来启动Solr:

service solr start

/etc/init.d/solr脚本还支持stop、restart和status命令。请记住,solr附带的init脚本非常基本,旨在向您展示如何将solr设置为服务。然而,使用更高级的工具(如Superord或Upstart)将Solr控制为Linux上的服务也是常见的做法。虽然演示如何将Solr与Superord等工具集成超出了本指南的范围,但init.d/Solr脚本应该提供足够的指导来帮助您入门。此外,安装脚本将Solr服务设置为在主机初始化时自动启动。

进度检查(Progress Check)

在下一节中,我们将介绍一些额外的环境设置,以帮助您对产品设置进行微调。然而,在我们继续前进之前,让我们回顾一下我们迄今所取得的成就。具体来说,您应该能够使用/etc/init.d/solr控制Solr。请验证以下命令与您的设置一起工作:

 

sudo service solr restart

sudo service solr status

Status命令应该提供一些有关运行Solr节点的基本信息,这些信息看起来类似于:

 

Found 1 Solr nodes:

 

Solr process 24316 running on port 8983

INFO  - 2019-02-20 17:46:47.857; org.apache.solr.util.configuration.SSLCredentialProviderFactory; Processing SSL Credential Provider chain: env;sysprop

{

  "solr_home":"/var/solr/data",

  "version":"7.7.0 8c831daf4eb41153c25ddb152501ab5bae3ea3d5 - jimczi - 2019-02-04 23:23:46",

  "startTime":"2019-02-20T09:46:38.251Z",

  "uptime":"0 days, 0 hours, 0 minutes, 10 seconds",

  "memory":"27 MB (%5.5) of 490.7 MB"}

 

如果状态命令不成功,请在/var/solr/logs/solr.log中查找错误消息。

 

微调您的生产设置

ConcurrentMergeScheduler的动态默认值

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

默认情况下,ConcurrentMergeScheduler自动检测底层磁盘驱动器是旋转的还是SSD(固态硬盘)的,并相应地为maxThreadCount和maxMergeCount设置默认值。如果磁盘驱动器被确定为旋转,则maxThreadCount设置为1,maxMergeCount设置为6。否则,maxThreadCount被设置为JVM可用处理器数量的4或1/2,无论哪个较大,maxMergeCount设置为maxThreadCount+5。

这种自动检测只在Linux上工作,即使这样也不能保证是正确的。在所有其他平台上,假设磁盘是旋转的。因此,如果自动检测失败或不正确,那么由于错误的默认值,索引性能可能会受到严重影响。

自动检测到的值由带有密钥solr.node:container.fs.coreRoot.spins的度量API公开。值为true表示检测到磁盘是旋转的或旋转的磁盘。

在solrconfig.xml的indexconfig部分显式设置maxthreadcount和maxmergecount的值更安全,以便使用适合您的硬件的值。

或者,可以在include(/etc/default/solr.in.sh)文件的SOLR_OPTS 变量中设置boolean系统属性lucene.cms.override_spins,以覆盖自动检测到的值。同样,可以将系统属性lucene.cms.override_core_count设置为用于覆盖自动检测处理器计数的CPU内核数。

 

内存和GC设置

缺省情况下,bin/solr脚本将最大Java堆大小设置为512m(-xMx512m),这对于从SOLR开始是很好的。对于生产,您要根据搜索应用程序的内存要求来增加最大堆大小;生产服务器不常见10G到20G的值。当您需要更改Solr服务器的内存设置时,请在Include文件中使用solr_java_mem变量,例如:

SOLR_JAVA_MEM="-Xms10g -Xmx10g"

 

此外,Solr控制脚本附带一组预先配置的Java垃圾收集设置,这些设置显示为与Solr协同工作,以实现多个不同的工作负载。但是,这些设置可能不适用于您对Solr的特定使用。因此,您可能需要更改GC设置,这也应该用/etc/default/solr.in.sh中的gc_tune变量完成,包括文件。有关调整内存和垃圾收集设置的详细信息,请参阅:JVM设置。

Out-of-Memory Shutdown Hook(内存不足关机钩)

如果发生OutOfMemoryError,bin/是solr脚本将注册JVM将调用的bin/oom_solr.sh脚本。oom_solr.sh脚本将向发生OutOfMemoryError的Solr进程发出kill -9。

在solrcloud模式下运行时,建议使用此行为,以便立即通知ZooKeeper节点遇到了不可恢复的错误。花点时间检查/opt/solr/bin/oom-solr.sh脚本的内容,以便您熟悉脚本在由JVM调用时将执行的操作。

使用SolrCloud进行生产

要在SolrCloud模式下运行Solr,您需要将Include文件中的ZK_host变量设置为指向Zookeeper集成。生产环境中不支持运行嵌入式Zookeeper。例如,如果您在默认客户端端口2181(ZK1、ZK2和ZK3)上托管在以下三个主机上的Zookeeper集成,则您将

ZK_HOST=zk1,zk2,zk3

 

当设置ZK_HOST变量时,Solr将以“云”模式启动。

ZooKeeper chroot

如果您使用的是由其他系统共享的zookeeper实例,则建议使用zookeeper的chroot支持来隔离SolrCloud Zode树。例如,为了确保SolrCloud创建的所有z节点都存储在/Solr下,可以将/Solr放在ZK_HOST连接字符串的末尾,例如:

ZK_HOST=zk1,zk2,zk3/solr

在第一次使用chroot之前,您需要使用Solr Control脚本在ZooKeeper 中创建根路径(Zode)。我们可以使用mkroot命令:

bin/solr zk mkroot /If you also want to bootstrap ZooKeeper with existing solr_home, you can instead use the zkcli.sh / zkcli.bat bootstrap command, which will also create the chroot path if it does not exist. See Command Line Utilities for more info.solr -z <ZK_node>:<ZK_PORT>

 

Solr主机名Solr Hostname

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

SOLR_HOST=solr1.example.com

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

重写solrconfig.xml中的设置

 

Solr允许使用-dproperties=value语法在启动时传递的Java系统属性覆盖配置属性。例如,在solrconfig.xml中,默认的自动软提交设置为:

<autoSoftCommit>

  <maxTime>${solr.autoSoftCommit.maxTime:-1}

</maxTime>

</autoSoftCommit>

通常,每当您在Solr配置文件中看到使用${solr.PROPERTY:DEFAULT_VALUE}语法的属性时,您就知道它可以使用Java系统属性被重写。例如,若要将软提交的maxTime设置为10秒,则可以使用-Dsolr.autoSoftcommittee.maxTime=10000启动Solr,如:

bin/solr start -Dsolr.autoSoftCommit.maxTime=10000

bin/solr脚本只是在启动时将以-D开头的选项传递给JVM。为了在生产中运行,我们建议在包含文件中定义的Solr_opts变量中设置这些属性。按照我们的软提交示例,在/etc/default/solr.in.sh中,您可以这样做:

SOLR_OPTS="$SOLR_OPTS -Dsolr.autoSoftCommit.maxTime=10000"

文件句柄和进程(ulimit settings)

在*nix系统上导致错误的两个常见设置是文件句柄和用户进程。

对于大型Solr安装来说太低的值,进程和文件句柄数目的默认限制是常见的。根据每个节点承载的副本数量和索引中每个副本的段数的组合,每个副本的所需数量都将增加。

通常的建议是使进程和文件处理每个至少65000,如果可能的话是无限的。在大多数*nix系统上,此命令将显示当前定义的限制。

ulimit -a

强烈建议像上面那样永久地提高文件句柄和进程限制。命令的确切形式因操作系统而异,有些系统需要编辑配置文件并重新启动服务器。在特定环境中,请咨询系统管理员以获得指导。

如果超出了这些限制,Solr报告的问题因超出限制的具体操作而异。报告了"打开的文件太多"、"连接错误"和"超出最大进程"等错误,以及SolrCloud恢复失败。由于超过这些限制会导致这种变化的症状,因此强烈建议如上所述永久地升高这些限制。

每个主机运行多个Solr节点

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

当对每项建议忽略建议时,都会有例外情况。对于上面的建议,当讨论极限可伸缩性时,这个异常通常是适用的。在一个主机上运行多个Solr节点的最佳原因是减少了对非常大堆的需求。

当Java堆变得非常大时,它可能导致非常长的垃圾收集暂停,即使在默认情况下启动脚本提供的GC调优也是如此。堆被视为“非常大”的确切点将根据Solr的使用方式而有所不同。这意味着没有硬数可以作为阈值给出,但是如果您的堆达到16G到32G,那么可能是考虑拆分节点的时候了。理想情况下,这将意味着更多的机器,但预算限制可能使这不可能。

当堆达到32 GB时,还有另一个问题。在32 GB以下,Java能够使用压缩指针,但在这一点之上,需要更大的指针,这将使用更多的内存,减缓JVM的速度。

由于潜在的垃圾收集问题和32 GB的特殊问题,如果一个实例需要一个64 GB的堆,那么如果机器设置了两个节点,每个节点都有一个31 GB的堆,那么性能可能会有很大的提高。

如果您的用例需要多个实例,那么您至少需要为每个要运行的节点提供唯一的Solr主目录;理想情况下,每个主目录应该位于不同的物理磁盘上,以便多个Solr节点在访问磁盘上的文件时不必相互竞争。

拥有不同的Solr主目录意味着每个节点需要不同的包含文件。此外,如果使用/etc/init.d/Solr脚本作为服务控制Solr,那么每个节点都需要一个单独的脚本。最简单的方法是使用服务安装脚本在同一主机上添加多个服务,例如:

sudo bash ./install_solr_service.sh solr-7.6.0.tgz -s solr2 -p 8984

上面显示的命令将使用/var/solr 2添加一个名为solr 2的服务,该服务运行在端口8984上,用于可写(也称为“活动”)文件;第二个服务器仍将由solr用户拥有和运行,并将在/opt中使用Solr分发文件。安装solr 2服务后,通过以下操作验证其工作正常:

sudo service solr2 restart

sudo service solr2 status

 

 

注:使用的过程遇见的问题:

  1. 创建solr用户问题:

  不能打开/etc/passwd文件错误,通过修改这些文件的属性解决。

chattr -i /etc/gshadow /etc/group/ /etc/shadow /etc/passwd

 

chattr -a /etc/gshadow /etc/group/ /etc/shadow /etc/passwd

  1. java环境配置:

按照网络的方式修改了环境变量;在/etc/profile增加

export JAVA_HOME=/home/soft/java-se-8u40-ri

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

之后source /etc/profile,执行service solr start 报

The currently defined JAVA_HOME (/usr/local/jdk) refers

to a location where Java could not be found.  Aborting.

Either fix the JAVA_HOME variable or remove it from the

environment so that the system PATH will be searched.

最后在vi /etc/default/solr.in.sh

设置SOLR_JAVA_HOME="/home/soft/java-se-8u40-ri"可以解决;

然后又报/opt/solr/bin/solr: line 127: /home/soft/java-se-8u40-ri/bin/java: 权限不够

错误。

之后把/home/soft/java-se-8u40-ri/bin逐层目录看看是否有x权限。分配了x(执行权限解决)。

 

标签:脚本,安装,etc,Solr,生产,设置,投入,solr
来源: https://blog.csdn.net/qq_26229005/article/details/87878207