solr学习(6.1)solrcloud集群的搭建

来源:互联网 发布:网络打印机 编辑:程序博客网 时间:2024/05/29 18:35

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. 逻辑结构

索引集合包括两个Shardshard1shard2),shard1shard2分别由三个Core组成,其中一个Leader两个ReplicationLeader是由zookeeper选举产生,zookeeper控制每个shard上三个Core的索引数据一致,解决高可用问题。

用户发起索引请求分别从shard1shard2上获取,解决高并发问题。

 

2.2.1. collection

CollectionSolrCloud集群中是一个逻辑意义上的完整的索引结构。它常常被划分为一个或多个Shard(分片),它们使用相同的配置信息。

比如:针对商品信息搜索可以创建一个collection

 collection=shard1+shard2+....+shardX

 

2.2.2. Core

每个CoreSolr中一个独立运行单位,提供 索引和搜索服务。一个shard需要由一个Core或多个Core组成。由于collection由多个shard组成所以collection一般由多个core组成。

2.2.3. MasterSlave

Mastermaster-slave结构中的主结点(通常说主服务器),Slavemaster-slave结构中的从结点(通常说从服务器或备服务器)。同一个Shardmasterslave存储的数据是一致的,这是为了达到高可用目的。

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: 没有到主机的路由

notRoute

应该是防火墙配置改了未生效,于是重新启动了3台机器防火墙 service iptables restart, 
下面是我重新启动后抛出的异常 
异常信息: 
Cannot open channel to 1 at election address h1/192.168.2.101:3881 java.net.ConnectException: 拒绝连接
 
拒绝连接


解决异常

一开始认为是等待其他机器开启,但启动其他两台后一直出现该问题,所以花了半个小时查原因,后来检查没发现配置问题,但3台机器的hosts文件中有如下内容,决定尝试删掉后重启,果然正常启动 
hostsException 
127.0.0.1 localhost h1 localhost4 localhost4.localdomain4 
::1 localhost h1 localhost6 localhost6.localdomain6


再次重启成功

下图这里开始启动出错的原因是集群环境正等待着另外几台机器,否则一台也没办法进行选举等操作,第二台机器起来后就恢复正常了。 
success

查看状态



 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对象。

第五步:向文档对象中添加域

第六步:把文档对象写入索引库。

第七步:提交。

[java] view plain copy
 print?
  1. @Test  
  2.     public void testSolrCloudAddDocument() throws Exception {  
  3.         // 第一步:把solrJ相关的jar包添加到工程中。  
  4.         // 第二步:创建一个SolrServer对象,需要使用CloudSolrServer子类。构造方法的参数是zookeeper的地址列表。  
  5.         //参数是zookeeper的地址列表,使用逗号分隔  
  6.         CloudSolrServer solrServer = new CloudSolrServer("192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183");  
  7.         // 第三步:需要设置DefaultCollection属性。  
  8.         solrServer.setDefaultCollection("collection2");  
  9.         // 第四步:创建一SolrInputDocument对象。  
  10.         SolrInputDocument document = new SolrInputDocument();  
  11.         // 第五步:向文档对象中添加域  
  12.         document.addField("item_title""测试商品");  
  13.         document.addField("item_price""100");  
  14.         document.addField("id""test001");  
  15.         // 第六步:把文档对象写入索引库。  
  16.         solrServer.add(document);  
  17.         // 第七步:提交。  
  18.         solrServer.commit();  
  19.   
  20.     }  


5.2. 查询文档 

创建一个CloudSolrServer对象,其他处理和单机版一致。

四、spring集成


6. 把搜索功能切换到集群版

[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans4.2.xsd  
  7.     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context4.2.xsd  
  8.     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  
  9.     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util4.2.xsd">  
  10.   
  11.     <!-- 单机版solr服务配置 -->  
  12.     <!-- <bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">  
  13.         <constructor-arg name="baseURL" value="http://192.168.25.154:8080/solr"></constructor-arg>  
  14.     </bean> -->  
  15.     <!-- 集群版solr服务 -->  
  16.     <bean id="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">  
  17.         <constructor-arg name="zkHost" value="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"></constructor-arg>     
  18.         <property name="defaultCollection" value="collection2"></property>  
  19.     </bean>  
  20. </beans>  

java代码使用方法不变,因为SolrServer是CloudSolrServer的父类


原创粉丝点击