学习前提:
已掌握Solr单机版的搭建以及使用。未掌握的请参考Solr单机版教程;
SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud满足这些需求。
SolrCloud不同于redis集群自带集群,SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。
它有几个特色功能:
1)集中式的配置信息
2)自动容错
3)近实时搜索
4)查询时自动负载均衡
SolrCloud为了降低单机的处理压力,需要由多台服务器共同来完成索引和搜索任务。实现的思路是将索引数据进行Shard(分片)拆分,每个分片由多台的服务器共同完成,当一个索引或搜索请求过来时会分别从不同的Shard的服务器中操作索引。
SolrCloud需要Solr基与zookeeper部署,Zookeeper是一个集群管理软件,由于SolrCloud需要由多台服务器组成,由zookeeper来进行协调管理。
下图是一个SolrCloud应用的例子:
物理结构:
三个Solr实例( 每个实例包括两个Core),组成一个SolrCloud。
逻辑结构:
索引集合包括两个Shard(shard1和shard2),shard1和shard2分别由三个Core组成,其中一个Leader两个Replication,Leader是由zookeeper选举产生,zookeeper控制每个shard上三个Core的索引数据一致,解决高可用问题。用户发起索引请求分别从shard1和shard2上获取,解决高并发问题。
core:
每个Core是Solr中一个独立运行单位,提供 索引和搜索服务。一个shard需要由一个Core或多个Core组成。由于collection由多个shard组成所以collection一般由多个core组成。
Master&Slave:
Master是master-slave构中的主结点(通常说主服务器),Slave是master-slave结构中的从结点(通常说从服务器或备服务器)。同一个Shard下master和slave存储的数据是一致的,这是为了达到高可用目的
因为没有很强劲的电脑,开不了8、9台虚拟机,所以我这里采用伪集群的方式进行安装,如果是真正的生成环境,将伪集群的ip改下就可以了,步骤是一样的。
SolrCloud结构图如下:
OS:CentOS 7
JDK:jdk 1.8.0
Tomcat:tomcat 7
zookeeper:zookeeper 3.4.6
solr:solr 4.10.3
安装包在对应的官网上都能下载到,jdk和tomcat的安装很简单,在这里就不说了。
第一步:解压zookeeper,tar -zxvf zookeeper-3.4.6.tar.gz然后将解压得到的zookeeper-3.4.6拷贝到/usr/local/solrcloud下,复制三份分别并将目录名改为zookeeper01、zookeeper02、zookeeper03
第二步:进入zookeeper01文件夹,创建data目录。并在data目录中创建一个myid文件内容为“1”(echo 1 >>data/myid)。然后分别进入02和03文件夹,进行同样的操作,把1换成2和3:
第三步:进入zookeeper01/conf文件夹,复制一份zoo_sample.cfg命名为zoo.cfg
cp zoo_sample.cfg zoo.cfg,在三个zookeeper中都执行这个操作
第四步:修改zoo.cfg。
修改:
dataDir=/usr/local/solrcloud/zookeeper1/data
clientPort=2181(zookeeper02中为2182、zookeeper03中为2183)
这个是客户端连接zookeeper的端口,即zookeeper提供服务的端口
在文件最后添加:
server.1=192.168.25.150:2881:3881
server.2=192.168.25.150:2882:3882
server.3=192.168.25.150:2883:3883
含义:zookeeper节点列表
server.节点id(myid文件) = 节点ip : zookeeper节点之间进行通信的端口 : 节点之间投票选举的端口
第五步:启动三个zookeeper
/usr/local/solrcloud/zookeeper1/bin/zkServer.shstart
/usr/local/solrcloud/zookeeper2/bin/zkServer.shstart
/usr/local/solrcloud/zookeeper3/bin/zkServer.shstart
或者创建批处理文件:
chmod u+x start-all-zookeeper.sh
执行:
查看集群状态:
/usr/local/solrcloud/zookeeper1/bin/zkServer.shstatus
/usr/local/solrcloud/zookeeper2/bin/zkServer.shstatus
/usr/local/solrcloud/zookeeper3/bin/zkServer.shstatus
一个leader,两个follower
第六步:关闭防火墙,或者开启zookeeper用到的端口,我这里选择的是关闭防火墙,因为端口实在是太多了。
CentOS 7关闭防火墙:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
------------------------------------至此 zookeeper集群搭建完成------------------------------------
第一步:新建目录/usr/local/solr-cloud然后复制四分tomcat,并将配置好的单机版solr复制到四台tomcat中(单机版的solr配置参考前面的连接文章):
第二步:修改tomcat的server.xml,vim tomcat01/conf/server.xml 修改内容:
另外三台分别修改为:8205 8280 8209 | 8305 8380 8309 | 8405 8480 8409
第三步:为每一份solr复制一份solrhome,命名为solrhome01 - solrhome04
截至目前,/usr/local/solr-cloud的目录结构:
三台zookeeper组成zookeeper集群;
四台tomcat上面部署了四分solr;
四个solrhome对应了四分silr;
第四步:修改每一份solr的web.xml,指向正确的solrhome地址:
/usr/local/solr-cloud/tomcat01/webapps/solr/WEB-INF/web.xml
第五步:修改每一份的solrhome配置:solrhome0*/solr.xml
第六步:让每一台solr和zookeeper关联:
修改每一份solr的tomcat的bin目录下的catalina.sh文件,加入DzkHost指定zookeeper服务器地址,将zookeeper地址列表作为参数传过去:
JAVA_OPTS="-DzkHost=192.168.25.130:2181,192.168.25.130:2182,192.168.25.130:2183"
注:JAVA_OPTS赋值的位置一定要放在引用该变量之前,可以使用vim查找功能查找到JAVA_OPTS的定义位置,然后添加
第七步:使用zookeeper统一管理solr配置文件:
使用zookeeper统一管理solr的配置文件(主要是schema.xml、solrconfig.xml),solrCloud各各节点使用zookeeper管理的配置文件,由于这里是直接复制的之前单机版配置好的solrhome(添加了一个中文分词器,定义了业务域)所以配置文件就不需要再修改了,直接交给zookeeper管理就好了。
进入/root/solr-4.10.3/example/scripts/cloud-scripts/目录下:
执行命令:./zkcli.sh -zkhost 192.168.25.130:2181,192.168.25.130:2182,192.168.25.130:2183 -cmd upconfig -confdir /usr/local/solr-cloud/solrhome01/collection1/conf -confname myconf
上传任意一个solrhome下的配置文件即可。-zkhost:指定zookeeper的地址列表;upconfig :上传配置文件;-confdir :指定配置文件所在目录;-confname:指定上传到zookeeper后的目录名。
登录zookeeper服务器检查配置文件是否上传成功:
/usr/local/solr-cloud/zookeeper01/bin
./zKCli.sh -server 192.168.25.130:2182
到这里,solr集群就搭建完成了,然后启动所有的solr服务,即启动四台tomcat(启动前需启动zookeeper集群),批处理文件:
查看启动状态:
访问集群中的任意一台solr均可,可以看到相较于单机版,多了一个Cloud:
上图中的collection1集群只有一片,可以通过下边的方法配置新的集群,分为2片。
集群中有四个solr节点创建新集群collection2,将集群分为两片,每片两个副本(一主一被):
http://192.168.25.130:8180/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
删除不使用的collection:
http://192.168.25.130:8180/solr/admin/collections?action=DELETE&name=collection1 执行后原来的collection1删除:
------------------------------solrCloud集群搭建及配置完成------------------------------
在java中操作solrCloud和操作solr一样,都是通过solrJ,只不过初始化solrServer对象时有点不同:
简单示例:
@Test
public void testAddDocument() throws Exception {
// zkHost:zookeeper的地址列表
String zkHost = "192.168.25.130:2181,192.168.25.130:2182,192.168.25.130:2183";
// 创建一个集群的连接,应该使用CloudSolrServer创建
CloudSolrServer solrServer = new CloudSolrServer(zkHost);
// 设置一个defaultCollection属性
solrServer.setDefaultCollection("collection2");
// 创建一个文档对象
SolrInputDocument document = new SolrInputDocument();
// 向文档中添加域
document.setField("id", "solrCloud01");
document.setField("item_title", "测试商品01");
document.setField("item_price", 123);
// 把文件内容写入索引库
solrServer.add(document);
// 提交
solrServer.commit();
}
测试结果:
如果要在Spring中使用集群版本solr,配置如下:
该配置和单机版的配置同时只能存在一份,不然会报不唯一异常!
然后在代码中通过:
@Autowired
private SolrServer solrServer;
自动注入即可使用,注入后的使用方法和单机版的是一样的,Solr单机版教程。