SolrCloud
1. 简介
SolrCloud 是Solr提供的分布式搜索方案,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。当一个系统的索引数据量少的时候是不需要使用SolrCloud的。
SolrCloud是基于Solr和Zookeeper的分布式搜索方案。它的主要思想是使用Zookeeper作为SolrCloud集群的配置信息中心,统一管理solrcloud的配置,比如solrconfifig.xml和managed-schema
使用场景:
当你需要容错,分布式索引和分布式检索能力时使用SolrCloud。
当索引量很大,搜索请求并发很高时,同样需要使用SolrCloud来满足这些需求。
特点:
集中式的配置信息
自动容错
近实时搜索
查询时自动负载均衡
2. 结构
-
物理结构
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来进行协调管理
-
zk集群搭建
参考:zookeeper分类部分
-
solr集群搭建
-
先搭建一个单机版
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
分别修改tomcat中的端口 vim tomcat01/conf/server.xml 把原来的8005 换成 8105 之前的 8009换成 8109 之前的 8080 换成 8180 其它的tomcat 也类似修改
<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文件夹 拷贝日志配置文件。
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。
cp solrhome -rf solrhome1 cp solrhome -rf solrhome2 cp solrhome -rf solrhome3 cp solrhome -rf solrhome4
-
配置solrCloud相关的配置。每个solrhome下都有一个solr.xml,把其中的ip及端口号配置好.
这里重点是 hostPort 要和tomcat 对应 如果是多台机器 ip 设置不同即可
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
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上的配置文件
#使用zookeeper目录下的bin/zkCli.sh命令查看zookeeper上的配置文件 ./zkCli.sh ls / ls /configs ls /configs/myconf
-
修改tomcat/bin目录下的catalina.sh 文件,关联solr和zookeeper/ 把此配置添加到配置文件中:
#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实例。
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