一、业务场景
公司业务涉及到聚合搜索,所有使用了solr作为索引工具,solr中索引数据并不多,大概百万级。
初始架构设计采用solr Master-Slave模式,master负责索引的创建,多slave通过nginx负载负责查询,但是web架构采用了spring cloud,多节点共用一个配置中心的配置文件,导致无法区分master slave,所以开始研究solrCloud的部署方式。
二、环境搭建
1、安装包
jdk-8u151-linux-x64,apache-tomcat-8.5.30,solr-6.6.3,zookeeper-3.4.10
2、环境准备
三台服务器
192.168.2.219 192.168.2.220 192.168.2.221
三台机器分别启动一个zookeeper服务,219启动一个tomcat作为solr服务,220启动两个tomcat作为solr服务,221启动一个tomcat作为solr服务,因为机器有限,solr服务随机选择了机器搭建。
3、jdk安装
详见另一篇文章,如果在linux下安装jdk
4、zookeeper集群搭建
- 上传zookeeper-3.4.10.tar.gz到三台服务器,并分别解压到自定义的路径,作者解压到/lhjsoft下,解压后得到zookeeper-3.4.10文件夹
- 分别在三台机器copy zookeeper到安装路径
219操作:cp -r /lhjsoft/zookeeper-3.4.10 /usr/local/solr-cloud/zookeeper219
220操作:cp -r /lhjsoft/zookeeper-3.4.10 /usr/local/solr-cloud/zookeeper220
221操作:cp -r /lhjsoft/zookeeper-3.4.10 /usr/local/solr-cloud/zookeeper221
- 设置zookeeper节点
219操作:
cd /usr/local/solr-cloud/zookeeper219
mkdir data
echo 1 > data/myid
220操作:
cd /usr/local/solr-cloud/zookeeper220
mkdir data
echo 2 > data/myid
221操作:
cd /usr/local/solr-cloud/zookeeper221
mkdir data
echo 3 > data/myid
- 配置zookeeper
219操作:
cd /usr/local/solr-cloud/zookeeper219/conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改zoo.cfg
#修改dataDir,指向data目录
dataDir=/usr/local/solr-cloud/zookeeper219/data/
#solr的通讯端口(集群中不能重复)
clientPort=3182
#在文件末尾添加以下配置
server.1=192.168.2.219:4887:5887
server.2=192.168.2.220:4887:5887
server.3=192.168.2.221:4887:5887#第一个端口为通讯端口,第二个为投票选举端口
220操作:
cd /usr/local/solr-cloud/zookeeper220/conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改zoo.cfg
dataDir=/usr/local/solr-cloud/zookeeper220/data/
clientPort=3182
server.1=192.168.2.219:4887:5887
server.2=192.168.2.220:4887:5887
server.3=192.168.2.221:4887:5887
221操作:
cd /usr/local/solr-cloud/zookeeper221/conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改zoo.cfg
dataDir=/usr/local/solr-cloud/zookeeper221/data/
clientPort=3182
server.1=192.168.2.219:4887:5887
server.2=192.168.2.220:4887:5887
server.3=192.168.2.221:4887:5887
- 启动zookeeper
219操作:
cd /usr/local/solr-cloud/zookeeper219/bin
./zkServer.sh start
#查看状态
./zkServer.sh status
220操作:
cd /usr/local/solr-cloud/zookeeper220/bin
./zkServer.sh start
#查看状态
./zkServer.sh status
221操作:
cd /usr/local/solr-cloud/zookeeper221/bin
./zkServer.sh start
#查看状态
./zkServer.sh status
5、solr搭建
- 上传apache-tomcat-8.5.31.zip到三台服务器,并分别解压到自定义的路径,作者解压到/lhjsoft下,解压后得到apache-tomcat-8.5.31文件夹
- 分别在三台机器copy tomcat到安装路径
219操作:cp -r /lhjsoft/apache-tomcat-8.5.31 /usr/local/solr-cloud/tomcat219
220操作:cp -r /lhjsoft/apache-tomcat-8.5.31 /usr/local/solr-cloud/tomcat220
220操作:cp -r /lhjsoft/apache-tomcat-8.5.31 /usr/local/solr-cloud/tomcat2202
221操作:cp -r /lhjsoft/apache-tomcat-8.5.31 /usr/local/solr-cloud/tomcat221
- 设置tomcat端口号,修改server.xml配置文件
219操作:
vim /usr/local/solr-cloud/tomcat219/conf/server.xml
#第22行
<Server port="9105" shutdown="SHUTDOWN">#第69行
<Connector port="9180" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />#第116行
<Connector port="9109" protocol="AJP/1.3" redirectPort="8443" />
220操作:
vim /usr/local/solr-cloud/tomcat220/conf/server.xml
#第22行
<Server port="9105" shutdown="SHUTDOWN">#第69行
<Connector port="9180" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />#第116行
<Connector port="9109" protocol="AJP/1.3" redirectPort="8443" />vim /usr/local/solr-cloud/tomcat2202/conf/server.xml
#第22行
<Server port="8105" shutdown="SHUTDOWN">#第69行
<Connector port="8180" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />#第116行
<Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />
221操作:
vim /usr/local/solr-cloud/tomcat221/conf/server.xml
#第22行
<Server port="9105" shutdown="SHUTDOWN">#第69行
<Connector port="9180" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />#第116行
<Connector port="9109" protocol="AJP/1.3" redirectPort="8443" />
- 部署solr,将solr项目放在tomcat目录下,作者之前已做好solr单机版,所以现将单机版的solr项目和solrhome copy到tomcat下
219操作:
cp -r /lhjsoft/apache-tomcat-solr/webapps/solr/ /usr/local/solr-cloud/tomcat219/webapps/
cp -r /lhjsoft/apache-tomcat-solr/webapps/solrhome/ /usr/local/solr-cloud/tomcat219/webapps/
220操作:
cp -r /lhjsoft/apache-tomcat-solr/webapps/solr/ /usr/local/solr-cloud/tomcat220/webapps/
cp -r /lhjsoft/apache-tomcat-solr/webapps/solrhome/ /usr/local/solr-cloud/tomcat220/webapps/
cp -r /lhjsoft/apache-tomcat-solr/webapps/solr/ /usr/local/solr-cloud/tomcat2202/webapps/
cp -r /lhjsoft/apache-tomcat-solr/webapps/solrhome/ /usr/local/solr-cloud/tomcat2202/webapps/
221操作:
cp -r /lhjsoft/apache-tomcat-solr/webapps/solr/ /usr/local/solr-cloud/tomcat221/webapps/
cp -r /lhjsoft/apache-tomcat-solr/webapps/solrhome/ /usr/local/solr-cloud/tomcat221/webapps/
- 配置solrcloud,修改solr下的solr文件
219操作
vim /usr/local/solr-cloud/tomcat219/webapps/solrhome/solr.xml
#第32行;host参数对应tomcat219的ip地址
<str name="host">192.168.2.219</str>
#第33行;hostPort参数对应tomcat219的端口号
<int name="hostPort">9180</int>
220操作
vim /usr/local/solr-cloud/tomcat220/webapps/solrhome/solr.xml
#第32行;host参数对应tomcat220的ip地址
<str name="host">192.168.2.220</str>
#第33行;hostPort参数对应tomcat220的端口号
<int name="hostPort">9180</int>
vim /usr/local/solr-cloud/tomcat2201/webapps/solrhome/solr.xml
#第32行;host参数对应tomcat2201的ip地址
<str name="host">192.168.2.220</str>
#第33行;hostPort参数对应tomcat2201的端口号
<int name="hostPort">8180</int>
221操作
vim /usr/local/solr-cloud/tomcat221/webapps/solrhome/solr.xml
#第32行;host参数对应tomcat221的ip地址
<str name="host">192.168.2.221</str>
#第33行;hostPort参数对应tomcat221的端口号
<int name="hostPort">9180</int>
- 配置solr服务的solrhome地址
219操作:
vim /usr/local/solr-cloud/tomcat219/webapps/solr/WEB-INF/web.xml
#第42行;solrhome的地址
<env-entry-value>/usr/local/solr-cloud/tomcat219/webapps/solrhome/</env-entry-value>
220操作:
vim /usr/local/solr-cloud/tomcat220/webapps/solr/WEB-INF/web.xml
#第42行;solrhome的地址
<env-entry-value>/usr/local/solr-cloud/tomcat220/webapps/solrhome/</env-entry-value>
vim /usr/local/solr-cloud/tomcat2202/webapps/solr/WEB-INF/web.xml
#第42行;solrhome的地址
<env-entry-value>/usr/local/solr-cloud/tomcat2202/webapps/solrhome/</env-entry-value>
221操作:
vim /usr/local/solr-cloud/tomcat221/webapps/solr/WEB-INF/web.xml
#第42行;solrhome的地址
<env-entry-value>/usr/local/solr-cloud/tomcat221/webapps/solrhome/</env-entry-value>
6、tomcat关联zookeeper,修改tomcat/bin下的catalina.sh文件
219操作:
vim /usr/local/solr-cloud/tomcat219/webapps/solr/bin/catalina.sh
#第288行(不用动);
#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"#在第288行下面添加一行JAVA_OPTS的配置
JAVA_OPTS="-DzkHost=192.168.2.219:3182,192.168.2.220:3182,192.168.2.221:3182"
#解释:上面的三个ip为三个zookeeper的ip+solr的通讯端口(clientPort)
220操作:
vim /usr/local/solr-cloud/tomcat220/webapps/solr/bin/catalina.sh
#第288行(不用动);
#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"#在第288行下面添加一行JAVA_OPTS的配置
JAVA_OPTS="-DzkHost=192.168.2.219:3182,192.168.2.220:3182,192.168.2.221:3182"
#解释:上面的三个ip为三个zookeeper的ip+solr的通讯端口(clientPort)vim /usr/local/solr-cloud/tomcat2202/webapps/solr/bin/catalina.sh
#第288行(不用动);
#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"#在第288行下面添加一行JAVA_OPTS的配置
JAVA_OPTS="-DzkHost=192.168.2.219:3182,192.168.2.220:3182,192.168.2.221:3182"
#解释:上面的三个ip为三个zookeeper的ip+solr的通讯端口(clientPort)
221操作:
vim /usr/local/solr-cloud/tomcat221/webapps/solr/bin/catalina.sh
#第288行(不用动);
#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"#在第288行下面添加一行JAVA_OPTS的配置
JAVA_OPTS="-DzkHost=192.168.2.219:3182,192.168.2.220:3182,192.168.2.221:3182"
#解释:上面的三个ip为三个zookeeper的ip+solr的通讯端口(clientPort)
7、solr关联zookeeper,上传solr配置到zookeeper,从其中一台机器上操作即可
- 上传配置
cd /lhjsoft/solr-6.6.3/server/scripts/cloud-scripts/
./zkcli.sh -zkhost 192.168.2.219:3182,192.168.2.220:3182,192.168.2.221:3182 -cmd upconfig -confdir /lhjsoft/apache-tomcat-solr/webapps/solrhome/core_ys/conf/ -confname myconf
- 查看上传是否成功
cd /usr/local/solr-cloud/zookeeper219/bin/
./zkCli.sh -server 192.168.2.219:3182
ls /configs/myconf
8、分别在三台机器上启动部署的四个tomcat
./startup.sh
9、查看solrcloud的启动情况
http://192.168.2.219:9180/solr/index.html#/~cloud
10、设置solrcloud分片
关于solrcloud的分片问题,作者也不是太了解,大家可以搜索相关博文或者官网查看,但是作者压测了一下不同分片情况下的吞吐量,在数据不是特别多的情况下,单机solr > 一片集群 > 多片集群,这其中影响效率的部分大概是在zookeeper的转发和solr分片查询的组合数据上。
大部分教程是通过solr提供的api接口来分片,其实在图形化界面就可以操作
11、springboot使用solrcloud
- 因作者使用spring cloud,所以配置都放在配置中心,与spring boot区别不大,先贴一下solr配置
spring:
data:
solr:
default-collection: collection
repositories:
enabled: true
zk-host: 192.168.2.221:3182,192.168.2.220:3182,192.168.2.219:3182
- 注入CloudSolrClient,千万注意!这个东西要手动注入,约定大于配置方式可以注入的是SolrClient,不是CloudSolrClient
@Configuration
public class SearchConfig {
//solr集群地址(zk地址)
@Value("${spring.data.solr.zk-host}")
public String ZK_HOST;
//默认的collection
@Value("${spring.data.solr.default-collection}")
public String DEFAULT_COLLECTION;
/**
* 注入cloudSolrClient
* @return
*/
@Bean
public CloudSolrClient solrClient() {
CloudSolrClient solrClient = new CloudSolrClient(ZK_HOST);
//设置默认collection
solrClient.setDefaultCollection(DEFAULT_COLLECTION);
return solrClient;
}
}
- 在需要的位置使用solrClient,就可以愉快的使用了,CloudSolrClient和SolrClient的方法基本相同,从单机版solr升级成solrCloud,之前写好的工具类没有做任何修改,但是CloudSolrClient要set一下默认的defaultCollection
@Autowired private CloudSolrClient solrClient;
最后感谢一下此篇博主作者,大部分配置内容都是从这学来的。