# SolrCloud


<!--more-->


## 1. 简介

SolrCloud 是Solr提供的分布式搜索方案，当索引量很大，搜索请求并发很高，这时需要使用SolrCloud来满足这些需求。当一个系统的索引数据量少的时候是不需要使用SolrCloud的。

SolrCloud是基于Solr和Zookeeper的分布式搜索方案。它的主要思想是使用Zookeeper作为SolrCloud集群的配置信息中心，统一管理solrcloud的配置，比如solrconfifig.xml和managed-schema

使用场景:

```
当你需要容错，分布式索引和分布式检索能力时使用SolrCloud。 
当索引量很大，搜索请求并发很高时，同样需要使用SolrCloud来满足这些需求。
```

特点:

```
集中式的配置信息 
自动容错 
近实时搜索 
查询时自动负载均衡
```

## 2. 结构 

![示意图](https://img.zhaojq.top/20260727091724929.png "示意图")

- 物理结构

  3个solr实例(每个实例包括两个core), 组成一个solrCloud

  >core：
  >
  >每个Core是Solr中一个独立运行单位，提供 索引和搜索服务。

- 逻辑结构

  索引集合包括两个Shard（shard1和shard2），shard1和shard2分别由三个Core组成，其中一个Leader两个Replication，Leader是由zookeeper选举产生，zookeeper控制每个shard上三个Core的索引数据一致，解决高可用问题。用户发起索引请求分别从shard1和shard2上获取，解决高并发问题。

  ```
  Master&Slave：
  	Master是master-slave构中的主结点（通常说主服务器），Slave是master-slave结构中的从结 点（通常说从服务器或备服务器）。 
  Shard: 
  	一个shard需要由一个Core或多个Core组成。Collection的逻辑分片。每个Shard被化成一个或者多 个replication，通过选举确定哪个是Leader。索引集合包括两个Shard（shard1和shard2）， shard1和shard2分别由三个Core组成，其中一个Leader两个Replication，Leader是由zookeeper选 举产生，zookeeper控制每个shard上三个Core的索引数据一致，解决高可用问题。用户发起索引请求分 别从shard1和shard2上获取，解决高并发问题。 
  collection: 
  	多个shard组成所以collection一般由多个core组成。 Collection在SolrCloud集群中是一个逻辑意义上的完整的索引结构。它常常被划分为一个或多个 Shard（分片），它们使用相同的配置信息。 比如：针对商品信息搜索可以创建一个collection。 collection=shard1+shard2+....+shardX
  ```

## 3. 环境搭建

- 系统搭建结构图

  solrcloud是基于solr和zookeeper部署，zookeeper是一个集群管理软件，solrcloud需要由多台solr服务器组成，然后由zookeeper来进行协调管理

  ![示意图](https://img.zhaojq.top/20260727091725119.png "示意图")

- zk集群搭建

  参考:zookeeper分类部分

- solr集群搭建

  - 先搭建一个单机版

    ```sh
    1.上传tomcat 和 solr 压缩包 到/usr/local/solr-cloud 下,tomcat中建立solr工程 
    	tar -xvf apache-tomcat-8.5.55.tar.gz 
    	mv apache-tomcat-8.5.55 tomcat 
    	tar -xvf solr-7.7.3.tgz 
    	cp /usr/local/solr-cloud/solr-7.7.3/server/solr-webapp/webapp -rf /usr/local/solr-cloud/tomcat/webapps/solr 
    2.拷贝jar包 
    	cd /usr/local/solr-cloud/solr-7.7.3/server/lib 
    	cp ext/* /usr/local/solr-cloud/tomcat/webapps/solr/WEB-INF/lib/ 
    	cp metrics-* /usr/local/solr-cloud/tomcat/webapps/solr/WEB-INF/lib/ 
    3.配置solrhome 
    	首先创建solrhome存储Solr索引文件 
    	mkdir -p /usr/local/solr-cloud/solrhome 
    	复制solr-7.7.3/server/solr目录下所有内容到solrhome 
    	cd /usr/local/solr-cloud/solr-7.7.3/server/solr 
    	cp -r * /usr/local/solr-cloud/solrhome/ 
    4.需要修改solr的web.xml文件 把solrhome关联起来 和 去掉安全认证。 
    	<env-entry>
        	<env-entry-name>solr/home</env-entry-name> 
        	<env-entry-value>/usr/local/solr-cloud/solrhome</env-entry-value> 
        	<env-entry-type>java.lang.String</env-entry-type> 
        </env-entry> 
        <!-- <security-constraint> ...... --> 
    5.启动tomcat测试 
    	./tomcat/bin/startup.sh 
    	systemctl stop firewalld
    ```

  - 创建四个tomcat实例。每个tomcat运行在不同的端口。8180、8280、8380、8480

    ```sh
    分别修改tomcat中的端口
    vim tomcat01/conf/server.xml
    
    把原来的8005 换成 8105 之前的 8009换成 8109 之前的 8080 换成 8180 其它的tomcat 也类似修改
    ```

    ```xml
    <Server port="8105" shutdown="SHUTDOWN"> </Server> 
    <Connector port="8180" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 
    <Connector port="8109" protocol="AJP/1.3" redirectPort="8443" />
    ```

  - 建立classes文件夹 拷贝日志配置文件。

    ```sh
    mkdir tomcat01/webapps/solr/WEB-INF/classes 
    cp /usr/local/solr-cloud/solr-7.7.3/server/resources/log* /usr/local/solr- cloud/tomcat01/webapps/solr/WEB-INF/classes
    ```

    其它的tomcat中的操作 参考上面的修改即可

  - 把单机版solrhome 复制为solrhome1 solrhome2 solrhome3 solrhome4。 

    ```sh
    cp solrhome -rf solrhome1 
    cp solrhome -rf solrhome2 
    cp solrhome -rf solrhome3 
    cp solrhome -rf solrhome4
    ```

  - 配置solrCloud相关的配置。每个solrhome下都有一个solr.xml，把其中的ip及端口号配置好.

    这里重点是 hostPort 要和tomcat 对应 如果是多台机器 ip 设置不同即可

    ```xml
    vi solrhome1/solr.xml 其它的solrhome/solr.xml 依次修改
    <solrcloud> 
        <str name="host">192.168.211.137</str> 
        <int name="hostPort">8180</int> 
        <str name="hostContext">${hostContext:solr}</str> 
    </solrcloud>
    ```

  - 让zookeeper统一管理配置文件。需要把`solrhome/confifigsets/sample_techproducts_confifigs/conf`目录上传到zookeeper。上传任意solrhome中的配置文件即可。要保证zookeeper集群是启动状态。

    使用工具上传配置文件：solr-7.7.3/server/scripts/cloud-scripts/zkcli.sh

    ```sh
    cd /usr/local/solr-cloud/solr-7.7.3/server/scripts/cloud-scripts
    
    ./zkcli.sh -zkhost 192.168.211.137:2181,192.168.211.137:2182,192.168.211.137:2183 -cmd upconfig - confdir /usr/local/solr-cloud/solrhome1/configsets/sample_techproducts_configs/conf -confname myconf
    ```

  - 查看zookeeper上的配置文件

    ```sh
    #使用zookeeper目录下的bin/zkCli.sh命令查看zookeeper上的配置文件
     ./zkCli.sh
     ls /
     ls /configs
     ls /configs/myconf
    ```

  - 修改tomcat/bin目录下的catalina.sh 文件，关联solr和zookeeper/ 把此配置添加到配置文件中：

    ```properties
    #vi中搜索 umask
    JAVA_OPTS="-DzkHost=192.168.211.137:2181,192.168.211.137:2182,192.168.211.137:2183"
    ```

  - 检查每个tomcat中项目的web.xml 看是否已经对应到对应的solrhome 检查没有问题可以启动全部tomcat

    ```
    solr/home
    /usr/local/solr-cloud/solrhome1
    java.lang.String
    ```

    启动每个tomcat实例。

    ```sh
    chmod -R 777 tomcat01/bin 
    chmod -R 777 tomcat02/bin 
    chmod -R 777 tomcat03/bin 
    chmod -R 777 tomcat04/bin
    
    ./tomcat_start.sh
    ```

  - 访问集群

    查看里面的 cloud 菜单，随意连接一台

  - 创建新的Collection进行分片处理

    点击页面的Collections按钮，然后就能添加了

## 4. Springboot 访问solrCloud

见示例代码: [springboot-solrcloud](https://gitee.com/ixinglan/solr-demo.git)






