主要参考以下文章
(此链接下是:多IP下的solr集群)
https://www.cnblogs.com/frankdeng/p/9597680.html
单机版参考:
https://www.cnblogs.com/frankdeng/p/9615253.html

本人是单IP下的solr集群,本人主要是根据以上第一个链接进行操作,并添加自己的一些操作,可能有些地方不严谨。

1. 安装环境,集群部署

Zookeeper集群安装参考:https://blog.csdn.net/qq_41430431/article/details/105210324
1.启动zookeeper集群 zkServer.sh start
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2. 配置Solr

1.解压安装包,运行安装脚本
下载地址:http://archive.apache.org/dist/lucene/solr/
本人使用版本: solr-7.4.0.tgz

2.解压

 tar zxvf solr-7.4.0.tgz 

上一个命令将install_solr_service.sh脚本从存档中提取到当前目录中,如果在Red Hat上安装,请确保在运行Solr安装脚本()之前安装了lsof,sudo yum install lsof。安装脚本必须以root身份运行:下一个命令时运行服务安装脚本。
3.创建脚本

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

报错找不到JAVA_HOME,原因:如果使用bash,建议将其放入/etc/bashrc(基于RH)或/etc/bash.bashrc(基于Debian)
4.安装多个solr服务
存放位置:(可以自己选择)

mkdir /usr/local/solrCloud/solr01
mkdir /usr/local/solrCloud/solr02
mkdir /usr/local/solrCloud/solr03
mkdir /usr/local/solrCloud/solr04

切换root用户再次执行安装成功,默认情况下,脚本将分发存档解压缩/opt,配置Solr以将文件写入/var/solr,并以solr用户身份运行Solr ,也可以指定路径,安装信息如下

bash ./install_solr_service.sh solr-7.4.0.tgz -i /usr/local/solrCloud/solr01(创建存放文件夹)  -d /usr/local/solrCloud/solr01/solrhome -u solr -s solr01 -p 8991(该端口为你启动solr页面的端口)

说明:
在这里插入图片描述
结果:

Customize Solr startup configuration in /etc/default/solr01.in.sh
su: warning: cannot change directory to /opt/module/solr/solrhome: No such file or directory
*** [WARN] *** Your open file limit is currently 1024.  
 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
*** [WARN] ***  Your Max Processes Limit is currently 1024. 
 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
Waiting up to 180 seconds to see Solr running on port 8991 [-]  
Started Solr server on port 8991 (pid=5931). Happy searching!
                                                                                                         su: warning: cannot change directory to /opt/module/solr/solrhome: No such file or directory

Found 1 Solr nodes: 

Solr process 5931 running on port 8991
INFO  - 2020-04-01 01:10:32.585; org.apache.solr.util.configuration.SSLCredentialProviderFactory; Processing SSL Credential Provider chain: env;sysprop
{
  "solr_home":"/usr/local/solrCloud/solr01/solrhome/data",
  "version":"7.4.0 9060ac689c270b02143f375de0348b7f626adebc - jpountz - 2018-06-18 16:55:13",
  "startTime":"2020-03-31T17:10:11.856Z",
  "uptime":"0 days, 0 hours, 0 minutes, 22 seconds",
  "memory":"27.5 MB (%5.6) of 490.7 MB"}

语句:

bash ./install_solr_service.sh solr-7.4.0.tgz -i /usr/local/solrCloud/solr01  -d /usr/local/solrCloud/solr01/solrhome -u solr -s solr01 -p 8991
bash ./install_solr_service.sh solr-7.4.0.tgz -i /usr/local/solrCloud/solr02  -d /usr/local/solrCloud/solr02/solrhome -u solr -s solr02 -p 8992
bash ./install_solr_service.sh solr-7.4.0.tgz -i /usr/local/solrCloud/solr03  -d /usr/local/solrCloud/solr03/solrhome -u solr -s solr03 -p 8993
bash ./install_solr_service.sh solr-7.4.0.tgz -i /usr/local/solrCloud/solr04  -d /usr/local/solrCloud/solr04/solrhome -u solr -s solr04 -p 8994

启动停止验证服务命令

#位置:/usr/local/solrCloud
#在root用户下操作
service solr0*(1-4) start|stop|status

5.修改对应jetty服务的端口8983/8984
(在solr5以前solr的启动都有tomcat作为容器,但是从solr5以后solr内部集成jetty服务器,可以通过bin目录中脚本直接启动。就是从solr5以后跟solr4最大的区别是被发布成一个独立的应用。)

语句:

#位置:/usr/local/solrCloud
vim solr01/solrhome/data/solr.xml

说明:

  • hostPort:8992(上面提到的端口号,为你启动solr页面的端口)
  • host:公网IP->(测试结果成功),127.0.0.1(测试结果成功)
    在这里插入图片描述
3. 配置zk启动优先级(可跳过,对应9)

solr集群需要zk来管理节点,目前solr是开机自启动,然后自己手工再启动zookeeper,solr是不能访问的,要求zookeeper集群先于solr集群启动,因此在设置zookeeper集群开机启动前要先查看solr开机启动的优先级 ls /etc/rc3.d/
在这里插入图片描述
"S50solr"分析:
S:代表启动
50:代表启动的顺序,值越小越先启动
solr:服务名字,就是/etc/init.d中的文件名
因zookeeper要先于solr启动,所以它的启动顺序对应的值应该小于50

编写脚本设置zookeeper开机启动

[root@iZ8vb9yvssadxzcmZ ~]# vi /etc/init.d/zookeeper01 

#!/bin/bash
#chkconfig:2345 20 90
#description:zookeeper
#processname:zookeeper
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_161
export ZOO_LOG_DIR=/usr/local/solrCloud/zookeeper01/log
case $1 in
        start) su root /usr/local/solrCloud/zookeeper01/bin/zkServer.sh start;;
        stop) su root /usr/local/solrCloud/zookeeper01/bin/zkServer.sh stop;;
        status) su root /usr/local/solrCloud/zookeeper01/bin/zkServer.sh status;;
        restart) su root /usr/local/solrCloud/zookeeper01/bin/zkServer.sh restart;;
        *) echo "require start|stop|status|restart" ;;
esac

本人创建了3个zookeeper脚本,因为本人对于这个执行不是很懂,不确认可不可以三个都放一起
在这里插入图片描述
其中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,设置为开机启动

#位置:/etc/init.d/
chmod +x /etc/init.d/zookeeper0*
service zookeeper0* start
chkconfig --add zookeeper0*

结果

[root@iZ8vb9yvssadxzcmZ ~]# ls /etc/rc3.d/*zoo*
/etc/rc3.d/S20zookeeper01  /etc/rc3.d/S20zookeeper02  /etc/rc3.d/S20zookeeper03
[root@iZ8vb9yvssadxzcmZ ~]# ls /etc/rc0.d/*zoo*
/etc/rc0.d/K90zookeeper01  /etc/rc0.d/K90zookeeper02  /etc/rc0.d/K90zookeeper03
4. 关联solr集群与zk集群(先关闭solr集群)

1.设置zookeeper集群关联solr集群,更新Solr的包含文件(solr.in.sh或solr.in.cmd),这样就不必在启动Solr时输入zk连接地址。


①/etc/hosts如下:(本人之前配置如下:测试结果是成功的)
::1     localhost       localhost.localdomain   localhost6      localhost6.localdomain6
127.0.0.1       localhost       localhost.localdomain   localhost4      localhost4.localdomain4
私网:dd8vqweiojxd48mZ dd8vqweiojxd48mZ 

之后的所有
IP:私网


②/etc/hosts如下:(后来修改hosts,原因:dubbo发布和消费服务)
::1     localhost       localhost.localdomain   localhost6      localhost6.localdomain6
127.0.0.1       localhost       localhost.localdomain   localhost4      localhost4.localdomain4
公网:dd8vqweiojxd48mZ dd8vqweiojxd48mZ 

之后的所有
IP:127.0.0.1或者公网IP都可以


③如果是虚拟机:
之后的所有
IP:虚拟机IP地址


vi /etc/default/solr0*(1-4).in.sh
#端口号为zookeeper集群中的端口号(2191,2192,2193)
`根据以上不同颜色描述,填写你的IP`
ZK_HOST="私网IP:2191,私网IP:2192,私网IP:2193/solr"
SOLR_HOST="私网IP"

2.首次连接需要创建节点管理目录

#位置/usr/local/solrCloud
`根据以上不同颜色描述,填写你的IP`
./solr01/solr01/bin/solr  zk mkroot /solr -z 私网IP:2191,私网IP:2192,私网IP:2193

以上主要在zookeeper内创建solr节点,你也可以直接在zookeeper集群内的zkCli.sh内使用’create /solr null ’


如果想要删除上一句所产生节点之间的联系:

解决此问题:
在这里插入图片描述
1)进入zookeeper内的zkCli.sh

[root@iZ8vaqqqwe8mZ solrCloud]# ./zookeeper01/bin/zkCli.sh -server 私网IP:2191(zookeeper集群内的端口号)

2)删除显示数据中的solr
位置:
在这里插入图片描述
语句:

[zk: 127.0.0.1:2191(CONNECTED) 2] rmr /solr

原如下:
在这里插入图片描述
修改后
在这里插入图片描述

3.使用Solr的ZooKeeper CLI上传solr配置信息到zk节点

`根据以上不同颜色描述,填写你的IP`
/root/solr-7.4.0/server/scripts/cloud-scripts/zkcli.sh(solr-7.4.0解压位置内的路径) -zkhost 私网IP:2191,私网IP:2192,私网IP:2193(zookeeper集群的端口号) -cmd upconfig -confdir   /usr/local/solrCloud/solr01/solr01/server/solr/configsets/_default/conf(上传文件路径)  -confname  myconf(自定义文件名)

4.查看配置文件是否上传成功,zk客户端查看zkCli.sh

结果如下:

`./zookeeper01/bin/zkCli.sh,默认为127.0.0.1:2181`
[root@iZ8vb9yzkwwasdger8mZ solrCloud]# ./zookeeper01/bin/zkCli.sh -server 私网IP:2191(zookeeper集群内的端口号)
WatchedEvent state:SyncConnected type:None path:null
[zk: 私网IP:2191(CONNECTED) 0] ls /configs/myconf
[protwords.txt, managed-schema, solrconfig.xml, synonyms.txt, stopwords.txt, lang, params.json] 
[zk: 私网IP:2191(CONNECTED) 1] ls /solr/configs/_default
[protwords.txt, managed-schema, solrconfig.xml, synonyms.txt, stopwords.txt, lang, params.json]

`./zookeeper01/bin/zkCli.sh,默认为127.0.0.1:2181`
[root@iZ8vb9yzkwwasdger8mZ solrCloud]# ./zookeeper01/bin/zkCli.sh -server 127.0.0.1或者公网IP:2191(zookeeper集群内的端口号)

在这里插入图片描述在这里插入图片描述

5.防火墙

1)添加端口:
firewall-cmd --zone=public --add-port=899*/tcp --permanent(8991、8992、8993、8994开启4个,对应之前使用install_solr_service.sh的端口号)
2)重启防火墙
systemctl reload firewalld.service
3)查看防火墙
firewall-cmd --zone=public --list-ports
出现: 8991/tcp 8992/tcp 8993/tcp 8994/tcp

开放安全组
在这里插入图片描述

6 .配置solr集群的分片规则

1.记得启动solr集群
2.service solr01 status
结果如下
在这里插入图片描述

创建core与collection,分片规则可以自定义,也可以自动分配
方法一:

./solr/bin/solr create -c collection1 -n collection1 -shards 2 -replicationFactor 2 -p 8983 -force

参数说明:

-c 要创建的核心或集合的名称(必需)。

-n 配置名称,默认与核心或集合的名称相同。

-p 发送create命令的本地Solr实例的端口; 默认情况下,脚本会尝试通过查找正在运行的Solr实例来检测端口。

-s 要么 -shards 将集合拆分为的分片数,默认为1; 仅适用于Solr在SolrCloud模式下运行的情况。

-rf 要么 -replicationFactor 集合中每个文档的副本数。默认值为1(无复制)。

-force 如果尝试以“root”用户身份运行create,则脚本将退出并显示运行Solr或针对Solr的操作作为“root”的警告可能会导致问题。可以使用-force参数覆盖此警告。

-d 配置目录。默认为_default。

方案二(本人使用这个)

更新
http://公网IP:8991/solr/admin/collections?action=RELOAD&name=collection1

删除
http://公网IP:8991/solr/admin/collections?action=DELETE&name=collection1

添加
http://公网IP:8991/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2

状态
http://公网IP:8991/solr/admin/collections?action=CLUSTERSTATUS
7.Web界面查看solr集群状态

(以下所有马赛克,为公网IP,不管是私网还是公网,测试结果都是如下图一致的)
在这里插入图片描述

在这里插入图片描述

8.安装IK中文分词器

解压ik中文分词安装包

[root@iZ8vb9yzkwwasdger8mZ ~]# 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/ikanalyzer-solr5
cp ik-analyzer-solr5-5.x.jar solr-analyzer-ik-5.1.0.jar /usr/local/solrCloud/solr01/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/lib/
cp ik-analyzer-solr5-5.x.jar solr-analyzer-ik-5.1.0.jar /usr/local/solrCloud/solr02/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/lib/
cp ik-analyzer-solr5-5.x.jar solr-analyzer-ik-5.1.0.jar /usr/local/solrCloud/solr03/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/lib/
cp ik-analyzer-solr5-5.x.jar solr-analyzer-ik-5.1.0.jar /usr/local/solrCloud/solr04/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/ikanalyzer-solr5
#创建目录
mkdir -p  /usr/local/solrCloud/solr01/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/classes 
mkdir -p  /usr/local/solrCloud/solr02/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/classes 
mkdir -p  /usr/local/solrCloud/solr03/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/classes 
mkdir -p  /usr/local/solrCloud/solr04/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/classes 
#复制数据
cp ext.dic IKAnalyzer.cfg.xml stopword.dic /usr/local/solrCloud/solr01/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/classes 
cp ext.dic IKAnalyzer.cfg.xml stopword.dic /usr/local/solrCloud/solr02/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/classes 
cp ext.dic IKAnalyzer.cfg.xml stopword.dic /usr/local/solrCloud/solr03/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/classes 
cp ext.dic IKAnalyzer.cfg.xml stopword.dic /usr/local/solrCloud/solr04/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/classes 

3)更改在solr-7.4.0/server/solr/configsets/_default/conf/managed-schema配置文件,末尾添加以下保存

[root@iZ8vb9yzkwwasdger8mZ ~]# vi /usr/local/solrCloud/solr0*(1-4)/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节点

`根据以上不同颜色描述,填写你的IP`
/root/solr-7.4.0/server/scripts/cloud-scripts/zkcli.sh(solr-7.4.0解压位置内的路径) -zkhost 私网IP:2191,私网IP:2192,私网IP:2193(zookeeper集群的端口号) -cmd upconfig -confdir   /usr/local/solrCloud/solr01/solr01/server/solr/configsets/_default/conf(上传文件路径)  -confname  myconf(自定义文件名)

5)重启服务测试中文分词
在这里插入图片描述

9.设置禁止开机启动项(可跳过,对应3)
显示开机可以自动启动的服务
chkconfig --list
添加开机自动启动服务
chkconfig --add *** 
删除开机自动启动服务
chkconfig --del ***

去除之前的开机启动:

chkconfig --del solr01
chkconfig --del solr02
chkconfig --del solr03
chkconfig --del solr04
chkconfig --del zookeeper01
chkconfig --del zookeeper02
chkconfig --del zookeeper03

之后手动启动

[root@iZ8vb9yzkwwasdger8mZ solrCloud]# vim start-solr.sh
service solr01 start
service solr02 start
service solr03 start
service solr04 start
[root@iZ8vb9yzkwwasdger8mZ solrCloud]# chmod u+x start-solr.sh

至于zookeeper的启动、停止脚本是一个道理的。

出错小知识

1.加载成功的只有一个,之后一直是加载超时,无法加载成功,具体出错代码(忘记复制了 - 。-,现在找不到了。。)

其中一个错误:
在这里插入图片描述

起因:
由于之前不会配置,可能加载出现了一些错误,或者什么端口没有关闭彻底,每次都出现上述问题。

测试:
我使用没有操作过的虚拟机centos6测试了一下,一次性成功。

方案一: 可以研究一下install_solr_service.sh,分析一下,就是有点麻烦。。。

方案二: 重启服务器。(推荐试一下,本人使用这个)

方案三: 服务器启动,重新配置。(无奈之举)

方法:
1)重置数据

#清空之前加载的数据
rm -rf /etc/default/solr0*
rm -rf /etc/init.d/solr*
rm -rf /etc/rc3.d/*solor*
rm -rf /usr/local/solrCloud/solr0*

#重新创建文件夹
mkdir /usr/local/solrCloud/solr01
mkdir /usr/local/solrCloud/solr02
mkdir /usr/local/solrCloud/solr03
mkdir /usr/local/solrCloud/solr04

2)之后我重新启动服务器,重新执行一下的代码就成功了

bash ./install_solr_service.sh solr-7.4.0.tgz -i /usr/local/solrCloud/solr01  -d /usr/local/solrCloud/solr01/solrhome -u solr -s solr01 -p 8991
bash ./install_solr_service.sh solr-7.4.0.tgz -i /usr/local/solrCloud/solr02  -d /usr/local/solrCloud/solr02/solrhome -u solr -s solr02 -p 8992
bash ./install_solr_service.sh solr-7.4.0.tgz -i /usr/local/solrCloud/solr03  -d /usr/local/solrCloud/solr03/solrhome -u solr -s solr03 -p 8993
bash ./install_solr_service.sh solr-7.4.0.tgz -i /usr/local/solrCloud/solr04  -d /usr/local/solrCloud/solr04/solrhome -u solr -s solr04 -p 8994

2.没有text_ik

方法:
重启solr,测试一下不行。服务进入zookeeper集群下的zkCli.sh,删除/solr/configs/_default,再删除/configs/myconf,重新上传数据,重启一下服务器。

rmr /solr/configs/_default
rmr /configs/myconf
[zk: 私网IP:2191(CONNECTED) 0] ls /solr/configs/_default
[protwords.txt, managed-schema, solrconfig.xml, synonyms.txt, stopwords.txt, lang, params.json]

结果:
在这里插入图片描述
3.运行solr错误,
Caused by: javax.servlet.UnavailableException: Error processing the request. CoreContainer is either not initialized or shutting down.
在这里插入图片描述

错误点:
以下数据为空
在这里插入图片描述
方法:本人先关闭solr集群,然后删除以上图片的文件夹,在上图位置使用’create /solr null’,重新创建文件夹,重新启动solr集群。如果还是不行,最好重新启动服务器,因为我大多数问题,都是重新启动服务器成功的。

出现问题:
1.如问题1
2.solr集群中连接成功的节点只有3个,当我重新启动失败的节点,在ps aux|grep solr0内最上面的一个节点会被挤下去,结果成功的节点还是3个,重复多次都是一样,通过重启服务器之后,就可以成功节点为4个。

说明:由于本人采用分布式部署项目,运用到solr、activemq、redis、zookeeper等,并且购买的服务器配置可能不足,操作一个启动之后,另一个会莫名关闭;如果关闭一个,就可以启动正常。我试过修改端口,结果还是一样。可以通过 cat -f /var/log/messages查看内存数据,我内存太小了,导致自动kill一些程序。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐