SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。
它有几个特色功能:
1)集中式的配置信息
2)自动容错
3)近实时搜索
4)查询时自动负载均衡
本教程实现的solr集群架构
Zookeeper集群搭建
1、集群管理:容错、负载均衡
2、配置文件的集中管理
3、集群的入口
需要实现Zookeeper高可用。需要搭建集群。建议是奇数节点。需要三个Zookeeper服务器
搭建solr集群至少需要7台服务器
这是因环境限制,演示的是搭建伪分布式(在一台虚拟机上,建议内存至少1G):
需要三个Zookeeper节点
需要四个tomcat节点
本文使用tomcat进行部署,而不使用solr自带的jetty
第一步:需要安装jdk环境
rpm -qa|grep openjdk -i 查看软件安装rpm -e --nodeps openjdk 擦除软件包tar -zxvf jdk-8u191-linux-x64.tar.gzvi /etc/profile末尾添加环境变量export JAVA_HOME=/usr/java/jdk1.8.0_191export CLASSPATH=::%JAVA_HOME%/lib/dt.jar:%JAVA_HOME%/lib/tools.jarexport PATH=$PATH:$JAVA_HOME/binsource /etc/profile 刷新环境变量java -version 安装成功
第二步:把Zookeeper的压缩包上传到服务器
apache-zookeeper-3.6.3-bin.tar.gz.r (语雀文件类型限制,需重命名去掉.r后缀)
第三步:解压缩
tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz
第四步:把Zookeeper复制三份
先创建目录/usr/local/solr-cloud
cp -r apache-zookeeper-3.6.3-bin /usr/local/solr-cloud/zookeeper01
cp -r apache-zookeeper-3.6.3-bin /usr/local/solr-cloud/zookeeper02
cp -r apache-zookeeper-3.6.3-bin /usr/local/solr-cloud/zookeeper03
第五步:在每个Zookeeper目录下创建一个data目录
mkdir /usr/local/solr-cloud/zookeeper01/data
mkdir /usr/local/solr-cloud/zookeeper02/data
mkdir /usr/local/solr-cloud/zookeeper03/data
第六步:在data目录下创建一个myid文件,文件名就叫做“myid”。内容就是每个实例的id。例如1,2,3
echo 1 >> /usr/local/solr-cloud/zookeeper01/data/myid
echo 2 >> /usr/local/solr-cloud/zookeeper02/data/myid
echo 3 >> /usr/local/solr-cloud/zookeeper03/data/myid
第七步:把conf目录下的zoo_sample.cfg文件改名为zoo.cfg
cd /usr/local/solr-cloud/zookeeper01/conf
mv zoo_sample.cfg zoo.cfg
cd /usr/local/solr-cloud/zookeeper02/conf
mv zoo_sample.cfg zoo.cfg
cd /usr/local/solr-cloud/zookeeper03/conf
mv zoo_sample.cfg zoo.cfg
第八步:修改zoo.cfg配置文件
server.1就是zk的myid=1。在实际工作中每个实例在不同的服务器上,所以后面的ip应该是不同的,作者是在一台虚拟机上演示,所以ip相同。
第九步:启动每个Zookeeper实例
vi start-zookeeper-all.sh
添加批量启动脚本内容
cd /usr/local/solr-cloud/zookeeper01/bin/
./zkServer.sh start
cd /usr/local/solr-cloud/zookeeper02/bin/
./zkServer.sh start
cd /usr/local/solr-cloud/zookeeper03/bin/
./zkServer.sh start
添加执行权限
chmod u+x start-zookeeper-all.sh
运行脚本
./start-zookeeper-all.sh
第十步:验证状态
cd zookeeper01/bin
./zkServer.sh status
依次查看,有一个leader,两个follower,顺序是随机的
搭建solr单机版
第一步:上传并解压solr
solr-8.11.1.tgz.gz.001.r(语雀文件大小限制,需重命名去掉.r后缀,多卷解压一个即可)
solr-8.11.1.tgz.gz.002.r
solr-8.11.1.tgz.gz.003.r
第二步:上传并解压tomcat,复制一份出来
apache-tomcat-9.0.24.tar.gz.r
创建solr目录,将tomcat复制重命名到/usr/local/solr/tomcat
cp -r apache-tomcat-9.0.24 /usr/local/solr/tomcat
第三步:把solr部署到tomcat下
复制并重命名solr目录里的server/solr-webapp/webapp文件夹到/usr/local/solr/tomcat/webapps/solr
cp -r solr-8.11.1/server/solr-webapp/webapp /usr/local/solr/tomcat/webapps/solr
第四步:把solr-8.11.1/server/lib/目录下的部分jar包,添加到刚才部署的solr工程中
cp solr-8.11.1/server/lib/ext/* /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
把solr-8.11.1/server/lib/metrics* 开头的5个jar复制到/usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/下
cp solr-8.11.1/server/lib/metrics* /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
第五步:把server/resources/目录下的配置文件,添加到刚才部署的solr工程中
注意要创建一个classes的目录
mkdir /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes
cp solr-8.11.1/server/resources/* /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes/
第六步:创建一个solrhome
将server/solr目录复制到之前创建的solr目录下,命名为solrhome,现在/usr/local/solr目录下就有两个文件夹了solrhome和tomcat
cp -r solr-8.11.1/server/solr/* /usr/local/solr/solrhome/
第七步:关联solr及solrhome
需要修改tomcat里solr工程的web.xml文件
cd /usr/local/solr/tomcat/webapps/solr/WEB-INF/
vi web.xml
打开注释,修改为上面自己创建的solrhome目录
然后到最下方,将这一段注释掉,不然会报403错误,完成后保存退出
第八步:启动tomcat
cd /usr/local/solr/tomcat/bin
./startup.sh
第九步:访问下服务器的solr服务 ip:8080/solr/index.html
关闭tomcat即可关闭服务
solr集群搭建
第一步:创建四个tomcat实例。每个tomcat运行在不同的端口。8180、8280、8380、8480复制tomcat到之前搭建zookeeper集群第四步时,创建的/usr/local/solr-cloud目录里,复制4个
cp -r apache-tomcat-9.0.24 /usr/local/solr-cloud/tomcat01
cp -r apache-tomcat-9.0.24 /usr/local/solr-cloud/tomcat02
cp -r apache-tomcat-9.0.24 /usr/local/solr-cloud/tomcat03
cp -r apache-tomcat-9.0.24 /usr/local/solr-cloud/tomcat04
在tomcat目录下的conf里的server.xml,修改每个tomcat的端口号,这里只演示第一个目录的,另外三个都要改,端口要互不冲突

其他三个tomcat目录里的server.xml配置的端口按照234的顺序全改了
一共要改四个文件,每个文件里改三个地方,这12个端口号要互不冲突
第二步:把单机版的solr工程复制到集群中的tomcat中
在搭建好的单机solr服务里,复制solr工程到第一步的4个tomcat目录里,一共是复制4份
cp -r /usr/local/solr/tomcat/webapps/solr/ /usr/local/solr-cloud/tomcat01/webapps/
cp -r /usr/local/solr/tomcat/webapps/solr/ /usr/local/solr-cloud/tomcat02/webapps/
cp -r /usr/local/solr/tomcat/webapps/solr/ /usr/local/solr-cloud/tomcat03/webapps/
cp -r /usr/local/solr/tomcat/webapps/solr/ /usr/local/solr-cloud/tomcat04/webapps/
第三步:为每个solr实例创建一个对应的solrhome。使用单机版的solrhome复制四份
一样在之前搭建的单机solr服务里,把solrhome复制4份出来到solr-cloud目录里
cp -r /usr/local/solr/solrhome/ /usr/local/solr-cloud/solrhome01
cp -r /usr/local/solr/solrhome/ /usr/local/solr-cloud/solrhome02
cp -r /usr/local/solr/solrhome/ /usr/local/solr-cloud/solrhome03
cp -r /usr/local/solr/solrhome/ /usr/local/solr-cloud/solrhome04
现在solr-cloud目录里是有这些目录,检查一下有没有复制错地方的:
第四步:配置solrCloud相关的配置。每个solrhome下都有一个solr.xml,把其中的ip及端口号配置好
之前搭建单机版solr服务的时候没有动过solrhome里的文件,现在搭建集群,需要进行修改
vi /usr/local/solr-cloud/solrhome01/solr.xml
需要修改4个solr.xml,这里只演示一个,另外三个目录里的类比着改,一样的,就是1234的顺序
找到这个地方,第一红框代表当前节点的ip地址,就是你部署这个solrhome01,tomcat01集群节点的服务器ip,实际工作中就会部署4个服务器,一个服务器是一个结点,部署一个solr服务
第二个红框代表当前solr服务实例的端口号,就是所在的tomcat的端口号,就是第一步在tomcat01的server.xml里配置的8180
其他三个照着改,由于作者是在一台虚拟机搭建的四个实例,所以肯定四个实例的ip是一样的,但端口号分别是8180,8280,8380,8480
vi /usr/local/solr-cloud/solrhome02/solr.xml
vi /usr/local/solr-cloud/solrhome02/solr.xml
vi /usr/local/solr-cloud/solrhome02/solr.xml
第五步:需要修改solr服务的web.xml。把solr,home关联起来
修改这个文件,和之前单机版的solr配置是一样的
vi /usr/local/solr-cloud/tomcat01/webapps/solr/WEB-INF/web.xml
找到这个,这里是作者之前搭建单机solr服务时,配置的solrhome路径
现在改成集群的solrhome01目录,使他们关联起来
其他三个tomcat里的web.xml都对应着改,solrhome02,03,04
第六步:让Zookeeper统一管理配置文件。需要把/conf目录上传到Zookeeper
现在我们每一个solr都有了自己的solrhome,现在我们要让每一个solr实例的配置文件都一样,这个配置文件需要集中管理,这个时候我们使用Zookeeper来统一管理配置文件。所以要将配置文件上传到Zookeeper中。那么上传那些配置文件呢?
cd /usr/local/solr-cloud/solrhome01/configsets/sample_techproducts_configs/conf
知道了要上传什么,那么怎么上传呢?打开最早solr解压出来的原始文件
cd solr-8.11.1/server/scripts/cloud-scripts
要注意,在执行脚本上传配置文件前,必须先去启动zookeeper集群
./zkcli.sh -zkhost 192.168.56.101:2181,192.168.56.101:2182,192.168.56.101:2183 -cmd upconfig -confdir /usr/local/solr-cloud/solrhome01/configsets/sample_techproducts_configs/conf -confname myconf
现在解释一下各个参数的含义:
-zkhost 192.168.56.101:2181,192.168.56.101:2182,192.168.56.101:2183
代表zookeeper集群的ip和端口号列表(搭建zookeeper集群的时候配置过)
-cmd upconfig
代表要执行的是上传配置文件操作
-confdir /usr/local/solr-cloud/solrhome01/configsets/sample_techproducts_configs/conf
代表的是要上传的配置文件目录
-confname myconf
代表的是你要上传的配置起的名字,搭建完后可以选择到
如果你需要修改配置的话,只用在刚才那个conf目录里改好,改好后再上传一次就行,就会覆盖原来的配置文件
第七步:修改tomcat/bin目录下的catalina.sh文件,关联solr和zookeeper
现在上传好配置文件了,可是solr和zookeeper还没有建立任何关联,他们也不知道对方在哪儿,这个时候需要修改4个tomcat的配置文件,这里只演示tomcat01,其他三个完全相同照着改
vi /usr/local/solr-cloud/tomcat01/bin/catalina.sh
打开catalina.sh文件
加上JAVA_OPTS的值(zookeeper集群的ip列表)
然后把其他三个tomcat也一改,改的位置和内容是一样的,不用变
这样每个solr实例就通过这个参数和zookeeper集群建立了联系,solr会将自己的状态发送给zookeeper,比如ip地址啊,端口号
zookeeper就可以连接到solr了,建立了通信关系
第八步:启动每个tomcat实例。要包装zookeeper集群是启动状态
现在需要启动每个tomcat,当然了,这个和启动zookeeper集群一样可以写个脚本
第九步:访问集群
然后用自己的电脑访问以下集群,之前单机版是没有红框框出来的两个东西的
如果zk status出现异常,需要修改zoo.cfg
在末尾添加 4lw.commands.whitelist=mntr,conf,ruok
vi /usr/local/solr-cloud/zookeeper01/conf/zoo.cfg
全部改完后,重启tomcat状态就正常了
