CentOS7.5搭建Solr7.4.0集群服务
一.Solr集群概念
solr单机版搭建参考: https://www.cnblogs.com/frankdeng/p/9615253.html
1.概念
SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。
2.结构
SolrCloud为了降低单机的处理压力,需要由多台服务器共同来完成索引和搜索任务。实现的思路是将索引数据进行Shard(分片)拆分,每个分片由多台的服务器共同完成,当一个索引或搜索请求过来时会分别从不同的Shard的服务器中操作索引。SolrCloud需要Solr基于Zookeeper部署,Zookeeper是一个集群管理软件,由于SolrCloud需要由多台服务器组成,由zookeeper来进行协调管理。
二.Solr集群安装
这里把solr当成独立服务安装,官方参考文档:http://lucene.apache.org/solr/guide/7_4/taking-solr-to-production.html#taking-solr-to-production
1. 安装环境,集群部署
系统 | 节点名称 | IP |
Java |
zookeeper |
Solr |
---|---|---|---|---|---|
CentOS7.5 | node21 | 192.168.100.21 | √ | √ | 8983/8984 |
CentOS7.5 | node22 | 192.168.100.22 | √ | √ | 8983/8984 |
CentOS7.5 | node23 | 192.168.100.23 | √ | √ |
Zookeeper集群安装参考:https://www.cnblogs.com/frankdeng/p/9018177.html ,启动zookeeper集群 zkServer.sh start
2. 解压安装包,运行安装脚本
[admin@node21 software]$ tar zxvf solr-7.4.0.tgz
[admin@node21 software]$ tar xzf solr-7.4.0.tgz solr-7.4.0/bin/install_solr_service.sh --strip-components=2
上一个命令将install_solr_service.sh
脚本从存档中提取到当前目录中,如果在Red Hat上安装,请确保在运行Solr安装脚本()之前安装了lsof,sudo yum install lsof
。安装脚本必须以root身份运行:下一个命令时运行服务安装脚本。
[admin@node21 software]$ sudo bash ./install_solr_service.sh solr-7.4.0.tgz -i /opt/module/solr -d /opt/module/solr/solrhome -u solr -s solr -p 8983
报错找不到JAVA_HOME,原因:如果使用bash,建议将其放入/etc/bashrc
(基于RH)或/etc/bash.bashrc
(基于Debian)
[root@node21 software]# bash ./install_solr_service.sh solr-7.4.0.tgz -i /opt/module/solr -d /opt/module/solr/solrhome -u solr -s solr -p 8983
切换root用户再次执行安装成功,默认情况下,脚本将分发存档解压缩/opt
,配置Solr以将文件写入/var/solr
,并以solr
用户身份运行Solr ,也可以指定路径,安装信息如下
[root@node21 software]# bash ./install_solr_service.sh solr-7.4.0.tgz -i /opt/module/solr -d /opt/module/solr/solrhome -u solr -s solr -p 8983 We recommend installing the 'lsof' command for more stable start/stop of Solr id: solr: no such user Creating new user: solr Extracting solr-7.4.0.tgz to /opt/module/solr Installing symlink /opt/module/solr/solr -> /opt/module/solr/solr-7.4.0 ... Installing /etc/init.d/solr script ... Installing /etc/default/solr.in.sh ... Service solr installed. Customize Solr startup configuration in /etc/default/solr.in.sh *** [WARN] *** Your Max Processes Limit is currently 4096. It should be set to 65000 to avoid operational disruption. If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh NOTE: Please install lsof as this script needs it to determine if Solr is listening on port 8983. Started Solr server on port 8983 (pid=2147). Happy searching! Found 1 Solr nodes: Solr process 2147 running on port 8983 INFO - 2018-09-07 11:39:26.210; org.apache.solr.util.configuration.SSLCredentialProviderFactory; Processing SSL Credential Provider chain: env;sysprop { "solr_home":"/opt/module/solr/data/data", "version":"7.4.0 9060ac689c270b02143f375de0348b7f626adebc - jpountz - 2018-06-18 16:55:13", "startTime":"2018-09-07T15:39:11.678Z", "uptime":"0 days, 0 hours, 0 minutes, 19 seconds", "memory":"25.3 MB (%5.2) of 490.7 MB"} [root@node21 software]#
3.安装多个solr服务
node21上再实例化一个solr2,端口8984
[root@node21 software]# mkdir /opt/module/solr2 [root@node21 software]# bash ./install_solr_service.sh solr-7.4.0.tgz -i /opt/module/solr2 -d /opt/module/solr2/solrhome -u solr -s solr2 -p 8984
安装脚本,安装包拷贝一份到node22上,实例化solr 8983,solr2 8984两个服务。
[root@node21 software]# scp -r install_solr_service.sh solr-7.4.0.tgz root@node22:`pwd` [root@node22 software]# mkdir /opt/module/solr [root@node22 software]# bash ./install_solr_service.sh solr-7.4.0.tgz -i /opt/module/solr -d /opt/module/solr/solrhome -u solr -s solr -p 8983 [root@node22 software]# mkdir /opt/module/solr2 [root@node22 software]# bash ./install_solr_service.sh solr-7.4.0.tgz -i /opt/module/solr2 -d /opt/module/solr2/solrhome -u solr -s solr2 -p 8984
启动停止验证服务命令
#在root用户下操作
service solr start|stop|status
service solr2 start|stop|ststus
修改对应jetty服务的端口8983/8984
[root@node21 solr]# vi /opt/module/solr/solrhome/data/solr.xml [root@node21 solr]# vi /opt/module/solr2/solrhome/data/solr.xml [root@node22 solr]# vi /opt/module/solr/solrhome/data/solr.xml [root@node22 solr]# vi /opt/module/solr2/solrhome/data/solr.xml
4. 配置zk启动优先级
solr集群需要zk来管理节点,目前solr是开机自启动,然后自己手工再启动zookeeper,solr是不能访问的,要求zookeeper集群先于solr集群启动,因此在设置zookeeper集群开机启动前要先查看solr开机启动的优先级 ls /etc/rc3.d/*solr*
"S50solr"分析:
S:代表启动
50:代表启动的顺序,值越小越先启动
solr:服务名字,就是/etc/init.d中的文件名
因zookeeper要先于solr启动,所以它的启动顺序对应的值应该小于50
编写脚本设置zookeeper开机启动
[root@node21 software]# vi /etc/init.d/zookeeper #!/bin/bash #chkconfig:2345 20 90 #description:zookeeper #processname:zookeeper export JAVA_HOME=/opt/module/jdk1.8 export ZOO_LOG_DIR=/opt/module/zookeeper-3.4.12/logs case $1 in start) su root /opt/module/zookeeper-3.4.12/bin/zkServer.sh start;; stop) su root /opt/module/zookeeper-3.4.12/bin/zkServer.sh stop;; status) su root /opt/module/zookeeper-3.4.12/bin/zkServer.sh status;; restart) su root /opt/module/zookeeper-3.4.12/bin/zkServer.sh restart;; *) echo "require start|stop|status|restart" ;; esac
其中chkconfig:2345 20 90非常重要
2345:为主机运行的级别,表示主机运行在2、3、4、5个级别时都会启动zookeeper,而0 、1、6级别时停止zookeeper
20:开机启动的优先级,要比solr的50大
90:关机停止的顺序
一般设置时,先启动,则后停止,注意不要把启动值设置得太小,否则可能一些系统核心服务还没有启动起来,导致你的应用无法启动
JAVA_HOME是必须的
ZOO_LOG_DIR是可选的,用于保存zookeeper启动时的日志文件,我把它指定到了自定义目录,否则你得使用root用户启动zookeeper或者给root用户根目录的写权限授予给zookeeper的启动用户
赋权限给脚本,启动zookeeper,设置为开机启动
[root@node21 software]# chmod +x /etc/init.d/zookeeper
[root@node21 software]# service zookeeper start
[root@node21 software]# chkconfig --add zookeeper
然后去/etc/rc3.d中查看zookeeper的启动顺序,查看zookeeper的停止顺序
[root@node21 software]# ls /etc/rc3.d/*zoo* /etc/rc3.d/S20zookeeper [root@node21 software]# ls /etc/rc0.d/*zoo* /etc/rc0.d/K90zookeeper
5. 关联solr集群与zk集群
1)设置zookeeper集群关联solr集群,更新Solr的包含文件(solr.in.sh
或solr.in.cmd),这样就不必在启动Solr时输入zk连接地址。
[root@node21 solr]# vi /etc/default/solr.in.sh vi /etc/default/solr2.in.sh [root@node22 solr]# vi /etc/default/solr.in.sh vi /etc/default/solr2.in.sh 修改如下信息(对应主机host注意更改): ZK_HOST="node21:2181,node22:2181,node23:2181/solr" SOLR_HOST="192.168.100.21"
首次连接需要创建节点管理目录
[root@node21 solr]# ./solr/bin/solr zk mkroot /solr -z node21:2181,node22:2181,node23:2181
2)使用Solr的ZooKeeper CLI上传solr配置信息到zk节点
[root@node21 module]# sh solr/solr-7.4.0/server/scripts/cloud-scripts/zkcli.sh -zkhost node21:2181,node22:2181,node23:2181 -cmd upconfig -confdir /opt/module/solr/solr- 7.4.0/server/solr/configsets/_default/conf -confname myconf
查看配置文件是否上传成功,zk客户端查看zkCli.sh
[zk: localhost:2181(CONNECTED) 13] ls /configs/myconf [protwords.txt, managed-schema, solrconfig.xml, synonyms.txt, stopwords.txt, lang, params.json] [zk: localhost:2181(CONNECTED) 14] ls /solr/configs/_default [managed-schema, protwords.txt, solrconfig.xml, synonyms.txt, stopwords.txt, lang, params.json]
6.配置solr集群的分片规则
创建core与collection,分片规则可以自定义,也可以自动分配,我这里采取自动分配
[root@node21 solr]# ./solr/bin/solr create -c collection1 -n collection1 -shards 2 -replicationFactor 2 -p 8983 -force [root@node22 solr2]# ./solr2/bin/solr create -c collection2 -n collection2 -shards 2 -replicationFactor 2 -p 8984 -force
参数说明:
-c <name>
要创建的核心或集合的名称(必需)。
-n <configName>
配置名称,默认与核心或集合的名称相同。
-p <port>
发送create命令的本地Solr实例的端口; 默认情况下,脚本会尝试通过查找正在运行的Solr实例来检测端口。
-s <shards>
要么 -shards
将集合拆分为的分片数,默认为1; 仅适用于Solr在SolrCloud模式下运行的情况。
-rf <replicas>
要么 -replicationFactor
集合中每个文档的副本数。默认值为1(无复制)。
-force
如果尝试以“root”用户身份运行create,则脚本将退出并显示运行Solr或针对Solr的操作作为“root”的警告可能会导致问题。可以使用-force参数覆盖此警告。
-d <confdir>
配置目录。默认为_default
。
7. Web界面查看solr集群状态
solr默认端口,查看地址:http://192.168.100.21:8983/solr/#/
zk客户端查看solr集群信息
jps查看服务进程
删除core与collection
[root@node21 solr]# ./solr/bin/solr delete -c collection1 INFO - 2018-09-09 07:59:04.479; org.apache.solr.util.configuration.SSLCredentialProviderFactory; Processing SSL Credential Provider chain: env;sysprop { "responseHeader":{ "status":0, "QTime":1560}, "success":{ "192.168.100.21:8983_solr":{"responseHeader":{ "status":0, "QTime":305}}, "192.168.100.21:8984_solr":{"responseHeader":{ "status":0, "QTime":305}}, "192.168.100.22:8983_solr":{"responseHeader":{ "status":0, "QTime":353}}, "192.168.100.22:8984_solr":{"responseHeader":{ "status":0, "QTime":421}}}} Deleted collection 'collection1' using command: http://192.168.100.21:8984/solr/admin/collections?action=DELETE&name=collection1
8. 安装IK中文分词器
解压ik中文分词安装包
[root@node21 software]# ls ikanalyzer-solr5/ ext.dic IKAnalyzer.cfg.xml ik-analyzer-solr5-5.x.jar solr-analyzer-ik-5.1.0.jar stopword.dic
1)将IK分词器 JAR 包拷贝到各solr安装节点solr-7.4.0/server/solr-webapp/webapp/WEB-INF/lib/下
[root@node21 ikanalyzer-solr5]# cp ik-analyzer-solr5-5.x.jar solr-analyzer-ik-5.1.0.jar /opt/module/solr/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/lib/
2)将词典 配置文件拷贝到各solr节点solr-7.4.0/server/solr-webapp/webapp/WEB-INF/classes下
[root@node21 ikanalyzer-solr5]# mkdir -p /opt/module/solr/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/classes [root@node21 ikanalyzer-solr5]# cp ext.dic IKAnalyzer.cfg.xml stopword.dic /opt/module/solr/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/classes
3)更改在
solr-7.4.0/server/solr/configsets/_default/conf/managed-schema配置文件,末尾添加以下保存
[root@node21 software]# vi /opt/module/solr/solr-7.4.0/server/solr/configsets/_default/conf/managed-schema <!--IK中文分词器--> <fieldType name="text_ik" class="solr.TextField"> <analyzer type="index" useSmart="false" class="org.wltea.analyzer.lucene.IKAnalyzer" /> <analyzer type="query" useSmart="true" class="org.wltea.analyzer.lucene.IKAnalyzer" /> </fieldType>
4)更新配置文件到zk节点
[root@node21 module]# sh /opt/module/solr/solr-7.4.0/server/scripts/cloud-scripts/zkcli.sh -zkhost node21:2181,node22:2181,node23:2181 -cmd upconfig -confdir /opt/modu le/solr/solr-7.4.0/server/solr/configsets/_default/conf -confname myconf
5)重启服务测试中文分词
root@node21 solr]# ./solr/bin/solr create -c collection3 -n collection3 -shards 2 -replicationFactor 2 -p 8983 -force
三.设置禁止开机启动项
测试完毕之后,我这里设置solr与zookeeper服务禁止开机启动,
显示开机可以自动启动的服务 [root@node21 ~]# chkconfig --list 添加开机自动启动***服务 [root@node21 ~]# chkconfig --add *** 删除开机自动启动***服务 [root@node21 ~]# chkconfig --del ***
查看
[root@node21 ~]# chkconfig --list Note: This output shows SysV services only and does not include native systemd services. SysV configuration data might be overridden by native systemd configuration. If you want to list systemd services use 'systemctl list-unit-files'. To see services enabled on particular target use 'systemctl list-dependencies [target]'. netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off network 0:off 1:off 2:on 3:on 4:on 5:on 6:off redis_6379 0:off 1:off 2:on 3:on 4:on 5:on 6:off solr 0:off 1:off 2:on 3:on 4:on 5:on 6:off solr2 0:off 1:off 2:on 3:on 4:on 5:on 6:off zookeeper 0:off 1:off 2:on 3:on 4:on 5:on 6:off xinetd based services: chargen-dgram: off chargen-stream: off daytime-dgram: off daytime-stream: off discard-dgram: off discard-stream: off echo-dgram: off echo-stream: off tcpmux-server: off time-dgram: off time-stream: off
之后手动启动
[root@node23 ~]# service zookeeper start [root@node23 ~]# service solr start [root@node23 ~]# service solr2 start