solr学习(6.1)solrcloud集群的搭建
Solrcloud介绍:
SolrCloud(solr集群)是Solr提供的分布式搜索方案。
当你需要大规模,容错,分布式索引和检索能力时使用SolrCloud。
当索引量很大,搜索请求并发很高时,同样需要使用SolrCloud来满足这些需求。
不过当一个系统的索引数据量少的时候是没有必要使用SolrCloud的。
SolrCloud是基于Solr和Zookeeper的分布式搜索方案。它的主要思想是使用Zookeeper作为SolrCloud集群的配置信息中心,统一管理solrcloud的配置,比如solrconfig.xml和schema.xml。
Solrcloud特点功能:
1)集中式的配置信息
2)自动容错
3)近实时搜索
4)查询时自动负载均衡
2. Solr集群的系统架构
2.1. 物理结构
三个Solr实例( 每个实例包括两个Core),组成一个SolrCloud。
2.2. 逻辑结构
索引集合包括两个Shard(shard1和shard2),shard1和shard2分别由三个Core组成,其中一个Leader两个Replication,Leader是由zookeeper选举产生,zookeeper控制每个shard上三个Core的索引数据一致,解决高可用问题。
用户发起索引请求分别从shard1和shard2上获取,解决高并发问题。
2.2.1. collection
Collection在SolrCloud集群中是一个逻辑意义上的完整的索引结构。它常常被划分为一个或多个Shard(分片),它们使用相同的配置信息。
比如:针对商品信息搜索可以创建一个collection。
collection=shard1+shard2+....+shardX
2.2.2. Core
每个Core是Solr中一个独立运行单位,提供 索引和搜索服务。一个shard需要由一个Core或多个Core组成。由于collection由多个shard组成所以collection一般由多个core组成。
2.2.3. Master或Slave
Master是master-slave结构中的主结点(通常说主服务器),Slave是master-slave结构中的从结点(通常说从服务器或备服务器)。同一个Shard下master和slave存储的数据是一致的,这是为了达到高可用目的。
2.2.4. Shard
Collection的逻辑分片。每个Shard被化成一个或者多个replication,通过选举确定哪个是Leader。
2.3. 需要实现的solr集群架构
Zookeeper作为集群的管理工具。
1、集群管理:容错、负载均衡。
2、配置文件的集中管理
3、集群的入口
需要实现zookeeper 高可用。需要搭建集群。建议是奇数节点。需要三个zookeeper服务器。
搭建solr集群需要7台服务器。
搭建伪分布式:
需要三个zookeeper节点
需要四个tomcat节点。
建议虚拟机的内容1G以上。
3. 环境准备
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
Solrcloud的结构:
solrcloud为了降低单机的处理压力,需要由多台服务器共同来完成索引和搜索任务。实现的思路是将索引数据进行Shard分片,每个分片由多台服务器共同完成,当一个索引或搜索请求过来时会分别从不同的Shard的服务器中操作索引。solrcloud是基于solr和zookeeper部署,zookeeper是一个集群管理软件,solrcloud需要由多台solr服务器组成,然后由zookeeper来进行协调管理。
由于solrcloud一般都是解决大数据量、大并发的搜索服务,所以搭建solrcloud之前,首先需要搭建zookeeper注册中心集群。
1)、搭建zookeeper集群步骤:需要三台zookeeper、分别是zk1、zk2、zk3,对应的端口分别为2281、2282、2283。
第一步:安装jdk环境,因为zookeeper是使用Java语言编写的;
第二步:准备zookeeper-3.4.6.tar.gz压缩包,解压并修改目录名称为zk1
第三步:进入zk1/conf目录,将zoo_sample.cfg文件名称改为zoo.cfg
第四步:修改zoo.cfg文件,配置集群信息(俩个截图信息都是配置在zoo.cfg文件中)
server.1=192.168.25.128:2881:3881
server.2=192.168.25.128:2882:3882
server.3=192.168.25.128:2883:3883
第五步:在dataDir(对应zoo.cfg配置文件中的目录结构)目录下创建myid文件,文件内容为1,对应server.1中的1。
第六步:拷贝zk1,复制两个目录zk2、zk3。并修改zoo.cfg和myid两个文件。
第七步:编写俩个脚本文件,分别启动zookeeper集群和查看集群中各个服务的状态。
start-all-zk.sh内容如下:
/home/work/solrcloud/zookeeper1/bin/zkServer.sh start
/home/work/solrcloud/zookeeper2/bin/zkServer.sh start
/home/work/solrcloud/zookeeper3/bin/zkServer.sh start
show-zk-status.sh内容如下:
/home/work/solrcloud/zookeeper1/bin/zkServer.sh status
/home/work/solrcloud/zookeeper2/bin/zkServer.sh status
/home/work/solrcloud/zookeeper3/bin/zkServer.sh status
第八步:启动每个zookeeper实例。
启动bin/zkServer.sh start
查看zookeeper的状态:
bin/zkServer.sh status
启动zookeeper
我启动了第一台服务出了如下异常,于是我想应该是防火墙的哪个配置未生效
异常信息:
Cannot open channel to 2 at election address h2/192.168.2.102:3882 java.NET.NoRouteToHostException:
没有到主机的路由
应该是防火墙配置改了未生效,于是重新启动了3台机器防火墙 service iptables restart,
下面是我重新启动后抛出的异常
异常信息:
Cannot open channel to 1 at election address h1/192.168.2.101:3881 java.net.ConnectException:
拒绝连接
解决异常
一开始认为是等待其他机器开启,但启动其他两台后一直出现该问题,所以花了半个小时查原因,后来检查没发现配置问题,但3台机器的hosts文件中有如下内容,决定尝试删掉后重启,果然正常启动
127.0.0.1 localhost h1 localhost4 localhost4.localdomain4
::1 localhost h1 localhost6 localhost6.localdomain6
再次重启成功
下图这里开始启动出错的原因是集群环境正等待着另外几台机器,否则一台也没办法进行选举等操作,第二台机器起来后就恢复正常了。
查看状态
2)、搭建solrcloud集群步骤:
第一步:复制4个单机版solr服务对应的tomcat,并分别修改端口为:8280、8380、8480、8580。
第二步:复制4个solrhome,分别为solrhome8280、solrhome8380、solrhome8480、solrhome8580。一个solr实例对应一个solrhome。
第三步:修改每个solr服务对应的Tomcat容器中solr项目的web.xml文件中的内容(目录结构为/usr/local/solrcloud/tomcat8280/webapps/solr/WEB-INF)
第四步:修改每个solrhome下的solr.xml,指定对应solr服务的tomcat的ip和端口。
第五步:设置tomcat的启动参数,在每个tomcat目录下的bin/catalina.sh,添加以下内容:
JAVA_OPTS="-DzkHost=192.168.25.128:2181,192.168.25.128:2182,192.168.25.128:2183"
第六步:将solr配置文件上传到zookeeper中,进行统一管理,进入到/root/soft/solr-4.10.3/example/scripts/cloud-scripts目录中执行zkcli.sh命令:
./zkcli.sh -zkhost 192.168.136.135:2281,192.168.136.135:2282,192.168.136.135:2283 -cmd upconfig -confdir /usr/local/solrcloud/solrhome8280/collection1/conf -confname
myconf(每个ip地址之间用逗号分隔)
搭建SolrCloud集群
把solrhome中的配置文件上传到zookeeper集群。使用zookeeper的客户端上传。
客户端命令位置:/root/solr-4.10.3/example/scripts/cloud-scripts
执行命令./zkcli.sh -zkhost 192.168.40.138:2181,192.168.40.138:2182,192.168.40.138:2183 -cmd upconfig -confdir /usr/local/solrcloud/solrhome1/collection1/conf -confname myconf
时报错。
解决办法:
Easy fix: cd solr-4.8.0/example, Java -jar
start.jar, (let it start up), Control-C. You'll now have files under solr-4.8.0-bin/example/solr-webapp/webapp including the missing jars in solr-4.8.0-bin/example/solr-webapp/webapp/WEB-INF/lib – Mark
Bennett
上述解决办法来自http://stackoverflow.com/questions/15830090/reloading-zookeeper-solr-conf-schema-xml
即:在/root/solr-4.10.3/example目录下执行 java -jar start.jar 命令。
然后ctrl c 结束。或者是打开另一个窗口。
在
/root/solr-4.10.3/example/scripts/cloud-scripts
执行命令
./zkcli.sh -zkhost 192.168.40.138:2181,192.168.40.138:2182,192.168.40.138:2183 -cmd upconfig -confdir /usr/local/solrcloud/solrhome1/collection1/conf -confname myconf
即可完成配置文件上传。
第七步:编写脚本文件启动所有的solr服务
第八步:访问部署的solr集群中任意的端口服务
第八步:启动每个tomcat实例。要包装zookeeper集群是启动状态。
第九步:访问集群
第十步:创建新的Collection进行分片处理。
http://192.168.25.154:8180/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
第十一步:删除不用的Collection。
http://192.168.25.154:8180/solr/admin/collections?action=DELETE&name=collection1
5. 使用solrJ管理集群
5.1. 添加文档
使用步骤:
第一步:把solrJ相关的jar包添加到工程中。
第二步:创建一个SolrServer对象,需要使用CloudSolrServer子类。构造方法的参数是zookeeper的地址列表。
第三步:需要设置DefaultCollection属性。
第四步:创建一SolrInputDocument对象。
第五步:向文档对象中添加域
第六步:把文档对象写入索引库。
第七步:提交。
- @Test
- public void testSolrCloudAddDocument() throws Exception {
- // 第一步:把solrJ相关的jar包添加到工程中。
- // 第二步:创建一个SolrServer对象,需要使用CloudSolrServer子类。构造方法的参数是zookeeper的地址列表。
- //参数是zookeeper的地址列表,使用逗号分隔
- CloudSolrServer solrServer = new CloudSolrServer("192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183");
- // 第三步:需要设置DefaultCollection属性。
- solrServer.setDefaultCollection("collection2");
- // 第四步:创建一SolrInputDocument对象。
- SolrInputDocument document = new SolrInputDocument();
- // 第五步:向文档对象中添加域
- document.addField("item_title", "测试商品");
- document.addField("item_price", "100");
- document.addField("id", "test001");
- // 第六步:把文档对象写入索引库。
- solrServer.add(document);
- // 第七步:提交。
- solrServer.commit();
- }
5.2. 查询文档
创建一个CloudSolrServer对象,其他处理和单机版一致。
四、spring集成
6. 把搜索功能切换到集群版
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
- xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans4.2.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context4.2.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx4.2.xsd
- http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util4.2.xsd">
- <!-- 单机版solr服务配置 -->
- <!-- <bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
- <constructor-arg name="baseURL" value="http://192.168.25.154:8080/solr"></constructor-arg>
- </bean> -->
- <!-- 集群版solr服务 -->
- <bean id="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
- <constructor-arg name="zkHost" value="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"></constructor-arg>
- <property name="defaultCollection" value="collection2"></property>
- </bean>
- </beans>
java代码使用方法不变,因为SolrServer是CloudSolrServer的父类