SolrCloud配置+Spring Boot应用

一、业务场景

公司业务涉及到聚合搜索,所有使用了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

https://blog.csdn.net/lihongjing/article/details/82387241

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;

 最后感谢一下此篇博主作者https://blog.csdn.net/yougoule/article/details/78445759,大部分配置内容都是从这学来的。

猜你喜欢

转载自blog.csdn.net/lihongjing/article/details/86594992