什么是 SolrCloud
SolrCloud(solr 云)是 Solr 提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用 SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用 SolrCloud 来满足这些需求。
SolrCloud 是基于 Solr 和 Zookeeper 的分布式搜索方案,它的主要思想是使用
Zookeeper 作为集群的配置信息中心。
它有几个特色功能:
1)集中式的配置信息
2)自动容错
3)近实时搜索
4)查询时自动负载均衡
SolrCloud 系统架构![这里写图片描述](//img-blog.csdn.net/20180315105329863?watermark/2/text/Ly9ibG9nLmNzZG4ubmV0L25ld19MY2M=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
【1】物理结构
三个 Solr 实例( 每个实例包括两个 Core),组成一个 SolrCloud。
【2】逻辑结构
索引集合包括两个 Shard(shard1 和 shard2),shard1 和 shard2 分别由三个 Core
组成,其中一个 Leader 两个 Replication,Leader 是由 zookeeper 选举产生,zookeeper 控制每个 shard 上三个 Core 的索引数据一致,解决高可用问题。
用户发起索引请求分别从 shard1 和 shard2 上获取,解决高并发问题。
Collection
Collection 在 SolrCloud 集群中是一个逻辑意义上的完整的索引结构。它常常被划分为一个或多个 Shard(分片),它们使用相同的配置信息。
比如:针对商品信息搜索可以创建一个 collection。
collection=shard1+shard2+….+shardX
Core
每个 Core 是 Solr 中一个独立运行单位,提供 索引和搜索服务。一个 shard 需要由一个Core 或多个 Core 组成。由于 collection 由多个 shard 组成所以 collection 一般由多个core 组成。
Master 或 或 Slave
Master 是 master-slave 结构中的主结点(通常说主服务器),Slave 是 master-slave 结构
中的从结点(通常说从服务器或备服务器)。同一个 Shard 下 master 和 slave 存储的数据是一致的,这是为了达到高可用目的。
Shard
Collection 的逻辑分片。每个 Shard 被化成一个或者多个 replication,通过选举确定哪个是Leader。
搭建 SolrCloud
Zookeeper 作为集群的管理工具
1、集群管理:容错、负载均衡。
2、配置文件的集中管理
3、集群的入口
需要实现 zookeeper 高可用,需要搭建 zookeeper 集群。建议是奇数节点。需要三个zookeeper 服务器。
搭建 solr 集群需要 7 台服务器(搭建伪分布式,建议虚拟机的内存 1G 以上):
需要三个 zookeeper 节点
需要四个 tomcat 节点
准备工作
环境准备
CentOS-6.5-i386-bin-DVD1.iso
jdk-7u72-linux-i586.tar.gz
apache-tomcat-7.0.47.tar.gz
zookeeper-3.4.6.tar.gz
solr-4.10.3.tgz
步骤:
(1)搭建 Zookeeper 集群(我们在上一小节已经完成)
(2)将已经部署完 solr 的 tomcat 的上传到 linux
(3)在 linux 中创建文件夹 /usr/local/solr-cloud 创建 4 个 tomcat 实例
[root@localhost ~]# mkdir /usr/local/solr-cloud
[root@localhost ~]# cp -r tomcat-solr /usr/local/solr-cloud/tomcat-1
[root@localhost ~]# cp -r tomcat-solr /usr/local/solr-cloud/tomcat-2
[root@localhost ~]# cp -r tomcat-solr /usr/local/solr-cloud/tomcat-3
[root@localhost ~]# cp -r tomcat-solr /usr/local/solr-cloud/tomcat-4
(4)将本地的 solrhome 上传到 linux
(5)在 linux 中创建文件夹 /usr/local/solrhomes ,将 solrhome 复制 4 份
(6)修改每个 solr 的 web.xml 文件, 关联 solrhome
solr/home
/usr/local/solrhomes/solrhome-1
java.lang.String
(7)修改每个 tomcat 的原运行端口 8085 8080 8009 ,分别为
8185 8180 8109
8285 8280 8209
8385 8380 8309
8485 8480 8409
配置集群
(1)修改每个 tomcat 实例 bin 目录下的 catalina.sh 文件
把此配置添加到 catalina.sh 中( 第 234 行 ) :
JAVA_OPTS=”-DzkHost=192.168.25.140:2181,192.168.25.140:2182,192.168.25.140:2183”
JAVA_OPTS ,顾名思义,是用来设置 JVM 相关运行参数的变量 . 此配置用于在 tomcat 启动时
找到 zookeeper 集群。
(2)配置 solrCloud 相关的配置。每个 solrhome 下都有一个 solr.xml,把其中的 ip 及端
口号配置好(是对应的 tomcat 的 IP 和端口)。
solrhomes/solrhome-1/solr.xml
192.168.25.140
8180
{zkClientTimeout:30000}
{hostContext:solr}
{genericCoreNodeNames:true}
solrhomes/solrhome-3/solr.xml
192.168.25.140
8380
{zkClientTimeout:30000}
{hostContext:solr}
{genericCoreNodeNames:true}
(3)让 zookeeper 统一管理配置文件。需要把 solrhome 下 collection1/conf 目录上传到
zookeeper。上传任意 solrhome 中的配置文件即可。
我们需要使用 solr 给我们提供的工具上传配置文件:
solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh
将 solr-4.10.3 压缩包上传到 linux,解压,然后进入 solr-4.10.3/example/scripts/cloud-scripts
目录 ,执行下列命令
./zkcli.sh -zkhost 192.168.25.140:2181,192.168.25.140:2182,192.168.25.140:2183 -cmd upconfig
-confdir /usr/local/solrhomes/solrhome-1/collection1/conf -confname myconf
参数解释
-zkhost :指定 zookeeper 地址列表
-cmd :指定命令。upconfig 为上传配置的命令
-confdir : 配置文件所在目录
-confname : 配置名称
启动集群
(1)启动每个 tomcat 实例。要保证 zookeeper 集群是启动状态。
(2)访问集群
地址栏输入 http://192.168.25.140:8180/solr ,可以看到 Solr 集群版的界面
SpringDataSolr 连接 SolrCloud
在 SolrJ 中提供一个叫做 CloudSolrServer 的类,它是 SolrServer 的子类,用于连接 solrCloud
它的构造参数就是 zookeeper 的地址列表,另外它要求要指定 defaultCollection 属性(默认的 collection 名称)
我们现在修改 springDataSolrDemo 工程的配置文件 ,把原来的 solr-server 注销,替换为CloudSolrServer .指定构造参数为地址列表,设置默认 collection 名称
solr 服务器地址
<solr:solr-server id="solrServer" url="http://192.168.25.129:8080/solr" />
<bean id="solrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
<constructor-arg
value="192.168.25.140:2181,192.168.25.140:2182,192.168.25.140:2183" />
<property name="defaultCollection" value="collection1"></property>
</bean>
分片配置
(1)创建新的 Collection 进行分片处理。
在浏览器输入以下地址,可以按照我们的要求 创建新的 Collection
http://192.168.25.140:8180/solr/admin/collections?action=CREATE&name= collection2 &nu
mShards=2&replicationFactor=2
参数:
name :将被创建的集合的名字
numShard s:集合创建时需要创建逻辑碎片的个数
replicationFactor :分片的副本数。
看到这个提示表示成功
(2)删除不用的 Collection。执行以下命令
http://192.168.25.140:8480/solr/admin/collections?action=DELETE&name=collection1
模拟集群异常测试
(1)停止第一个 tomcat 节点,看查询是否能正常工作 – 能!因为还有从节点
(2)停止第三个 tomcat 节点,看看查询能够正常工作 – 不能,因为整个一片数据全没了,无法正常工作。
(3)恢复第三个 tomcat 节点,看看能否正常工作。恢复时间会比较长,大概 2 分半到 3 分钟之间。请耐心等待。