SolrCloud的搭建以及在Java中的使用(solr集群)

学习前提:

    已掌握Solr单机版的搭建以及使用。未掌握的请参考Solr单机版教程;

什么是SolrCloud

        SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud满足这些需求。

         SolrCloud不同于redis集群自带集群,SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。

它有几个特色功能:

1)集中式的配置信息

2)自动容错

3)近实时搜索

4)查询时自动负载均衡

SolrCloud结构

        SolrCloud为了降低单机的处理压力,需要由多台服务器共同来完成索引和搜索任务。实现的思路是将索引数据进行Shard(分片)拆分,每个分片由多台的服务器共同完成,当一个索引或搜索请求过来时会分别从不同的Shard的服务器中操作索引。

        SolrCloud需要Solr基与zookeeper部署,Zookeeper是一个集群管理软件,由于SolrCloud需要由多台服务器组成,由zookeeper来进行协调管理。

下图是一个SolrCloud应用的例子:

SolrCloud的搭建以及在Java中的使用(solr集群)_第1张图片

物理结构:

        三个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存储的数据是一致的,这是为了达到高可用目的

SolrCloud搭建

        因为没有很强劲的电脑,开不了8、9台虚拟机,所以我这里采用伪集群的方式进行安装,如果是真正的生成环境,将伪集群的ip改下就可以了,步骤是一样的。

SolrCloud结构图如下:

SolrCloud的搭建以及在Java中的使用(solr集群)_第2张图片

搭建环境

OS:CentOS 7

JDK:jdk 1.8.0

Tomcat:tomcat 7

zookeeper:zookeeper 3.4.6

solr:solr 4.10.3

安装包在对应的官网上都能下载到,jdk和tomcat的安装很简单,在这里就不说了。

zookeeper集群搭建

第一步:解压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:

SolrCloud的搭建以及在Java中的使用(solr集群)_第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

或者创建批处理文件:

SolrCloud的搭建以及在Java中的使用(solr集群)_第4张图片

chmod  u+x  start-all-zookeeper.sh

执行:

SolrCloud的搭建以及在Java中的使用(solr集群)_第5张图片

查看集群状态:

/usr/local/solrcloud/zookeeper1/bin/zkServer.shstatus

/usr/local/solrcloud/zookeeper2/bin/zkServer.shstatus

/usr/local/solrcloud/zookeeper3/bin/zkServer.shstatus

SolrCloud的搭建以及在Java中的使用(solr集群)_第6张图片

一个leader,两个follower

第六步:关闭防火墙,或者开启zookeeper用到的端口,我这里选择的是关闭防火墙,因为端口实在是太多了。

CentOS 7关闭防火墙:

systemctl stop firewalld.service             #停止firewall
systemctl disable firewalld.service        #禁止firewall开机启动

------------------------------------至此 zookeeper集群搭建完成------------------------------------

SolrCloud部署

第一步:新建目录/usr/local/solr-cloud然后复制四分tomcat,并将配置好的单机版solr复制到四台tomcat中(单机版的solr配置参考前面的连接文章):

SolrCloud的搭建以及在Java中的使用(solr集群)_第7张图片

第二步:修改tomcat的server.xml,vim tomcat01/conf/server.xml 修改内容:

8105"shutdown="SHUTDOWN">

8180"protocol="HTTP/1.1" connectionTimeout="20000" redirect…….

8109" protocol="AJP/1.3"redirectPort="8443" />

另外三台分别修改为:8205  8280  8209 | 8305  8380  8309 | 8405 8480  8409

第三步:为每一份solr复制一份solrhome,命名为solrhome01 - solrhome04


截至目前,/usr/local/solr-cloud的目录结构:

SolrCloud的搭建以及在Java中的使用(solr集群)_第8张图片

        三台zookeeper组成zookeeper集群;

        四台tomcat上面部署了四分solr;

        四个solrhome对应了四分silr;

第四步:修改每一份solr的web.xml,指向正确的solrhome地址:

/usr/local/solr-cloud/tomcat01/webapps/solr/WEB-INF/web.xml

SolrCloud的搭建以及在Java中的使用(solr集群)_第9张图片

第五步:修改每一份的solrhome配置:solrhome0*/solr.xml

SolrCloud的搭建以及在Java中的使用(solr集群)_第10张图片

第六步:让每一台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/目录下:

        SolrCloud的搭建以及在Java中的使用(solr集群)_第11张图片

      执行命令:./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

        SolrCloud的搭建以及在Java中的使用(solr集群)_第12张图片

        到这里,solr集群就搭建完成了,然后启动所有的solr服务,即启动四台tomcat(启动前需启动zookeeper集群),批处理文件:


查看启动状态:

SolrCloud的搭建以及在Java中的使用(solr集群)_第13张图片

访问solrCloud

访问集群中的任意一台solr均可,可以看到相较于单机版,多了一个Cloud:

SolrCloud的搭建以及在Java中的使用(solr集群)_第14张图片

solrCloud集群配置

        上图中的collection1集群只有一片,可以通过下边的方法配置新的集群,分为2片。

集群中有四个solr节点创建新集群collection2,将集群分为两片,每片两个副本(一主一被):

http://192.168.25.130:8180/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2

SolrCloud的搭建以及在Java中的使用(solr集群)_第15张图片

删除不使用的collection:

http://192.168.25.130:8180/solr/admin/collections?action=DELETE&name=collection1 执行后原来的collection1删除:

SolrCloud的搭建以及在Java中的使用(solr集群)_第16张图片

------------------------------solrCloud集群搭建及配置完成------------------------------

Java操作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();
	}

测试结果:

SolrCloud的搭建以及在Java中的使用(solr集群)_第17张图片

如果要在Spring中使用集群版本solr,配置如下:

该配置和单机版的配置同时只能存在一份,不然会报不唯一异常!



	
	

然后在代码中通过:

@Autowired

private SolrServer solrServer;

自动注入即可使用,注入后的使用方法和单机版的是一样的,Solr单机版教程。

你可能感兴趣的:(Solr)