SolrCloud是基于Solr和Zookeeper的分布式搜索方案,也是Solr5 的核心组件之一,它的主要思想是使用Zookeeper作为集群的配置信息中心。它有几个特色功能:
1)集中式的配置信息
2)自动容错
3)近实时搜索
4)查询时自动负载均衡 。
基本可以用下面这幅图来概述,这是一个拥有4个Solr节点的集群,索引分布在三个Shard里面,每个Shard包含三个Solr节点,一个是Leader节点,另外两个是Replica节点,此外集群中有一个负责维护集群状态信息的Overseer节点,它是一个总控制器。集群的所有状态信息都放在Zookeeper集群中统一维护。从图中还可以看到,任何一个节点都可以接收索引更新的请求,然后再将这个请求转发到文档所应该属于的那个Shard的Leader节点,Leader节点更新结束完成,最后将版本号和文档转发给同属于一个Shard的replicas节点。
具体节点信息我们在后续进入Zookeeper管理节点查看。
黑色是主节点
使用工具 zookeeper-3.5.1-alpha.tar.gz
一、创建目录结构如下
二、修改 zookeeper
1、复制 solrCloud\service1\zookeeper-3.5.1-alpha\conf 下的zoo_sample.cfg 重命名为:zoo.cfg 编辑内容如下
initLimit=5
syncLimit=2
clientPort=2181
tickTime=2000
dataDir= D:\\MayBe\\solrCloud\\service1\\data
dataLogDir= D:\\MayBe\\solrCloud\\service1\\datalog
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
配置里不要有空格
initLimit=集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。
syncLimit= 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数。
clientPort= 端口
tickTime= Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔。
dataDir= 数据目录地址
dataLogDir= 数据日志地址
server.1=集群信息(服务器编号,服务器地址,LF通信端口,选举端口)
每个service都重复此操作,不同的service设置不同的clientPort和对应的dataDir,dataLogDir
2、 在data目录新建myid文件(该文件没有后缀文件类型),并写入值(文件中写入一个数字,每台zk不能重复,代表zk的唯一性,在zoo.cfg 中需要配置到)
3、 启动zk分别进入 D:\MayBe\solrcloud\service1\zookeeper-3.5.1-alpha\bin,D:\MayBe\solrcloud\service2\zookeeper-3.5.1-alpha\bin,D:\MayBe\solrcloud\service3\zookeeper-3.5.1-alpha\bin 双击 zkServer.cmd启动,启动过程中由于集群未完全正常启动,会报连接错误,可以暂时不管。 zkServer.sh status(查看状态)
4、安装tomcat:从之前的复制过来,tomcat1-4都要复制
5、编辑每个tomcat中solr项目的web.xml文件, 找到env-entry节点,编辑为以下内容
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>D:\MayBe\solrCloud\solr_home1</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
(solr的用户目录,用于存储索引等,每个tomcat需要不一样的路径:home1-4)
6、添加solr_home 内容
7、修改tomcat的\conf下的server.xml
tomcat1
<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8081" protocol="HTTP/1.1"
<Connector port="8009" protocol="AJP/1.3"
tomcat2
<Server port="8006" shutdown="SHUTDOWN">
<Connector port="8082" protocol="HTTP/1.1"
<Connector port="8010" protocol="AJP/1.3"
tomcat3
<Server port="8007" shutdown="SHUTDOWN">
<Connector port="8083" protocol="HTTP/1.1"
<Connector port="8011" protocol="AJP/1.3"
tomcat4
<Server port="8008" shutdown="SHUTDOWN">
<Connector port="8084" protocol="HTTP/1.1"
<Connector port="8012" protocol="AJP/1.3"
8、修改solr.xml
修改成你当前的tomcat的运行端口,每个solr_home对应的tomcat端口不一样,当然是在伪集群的情况下,如果你是多台机器的话请忽略
修改solr_home1 下的solr.xml
solr_home1
<int name="hostPort">${jetty.port:8081}</int>
solr_home2
<int name="hostPort">${jetty.port:8082}</int>
solr_home3
<int name="hostPort">${jetty.port:8083}</int>
solr_home4
<int name="hostPort">${jetty.port:8084}</int>
9、新建配置文件目录(用于zk的集群配置管理)
我是直接在solr_home1中新建一个collection1文件夹,如下:
..\solr_home1\collection1(此文件夹只需要建一个,不需要在每个机器上建,他会通过zk分发到各个机器)
将solr原包中../solr/server/solr/configsets/basic_configs/* 拷贝到 ../solr_home1/collection1/ 下。
10、修改tomcat的文件catalina.bat文件
一台添加:
set JAVA_OPTS=-Dsolr.solr.home=D:/MayBe/solrcloud/solr_home1 -Dbootstrap_confdir=D:/MayBe/solrcloud/solr_home1/collection1/conf -
Dcollection.configName=myconf -DnumShards=3 -DzkHost=localhost:2181,localhost:2182,localhost:2183
DnumShards=3 分片
其它添加: set JAVA_OPTS=-Dsolr.solr.home=D:/MayBe/solrcloud/solr_home2 -DzkHost=localhost:2181,localhost:2182,localhost:2183
solr_home位置修改成对应的
11、 依次启动tomcat
12、测试访问集群
http://localhost:8081/solr/index.html
13、创建一个solr的collection
http://localhost:8081/solr/admin/collections?action=CREATE&name=core1&numShards=3&replicationFactor=3&maxShardsPerNode=3&collection.configName=myconf
numShards=分片数
replicationFactor=复制分片个数
maxShardsPerNode= 最大分片数
14、查看solrCloud
15、solrj 进行solrCloud 添加索引
package com.solr.solrCloud;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
public class CloudSolrServer {
public static CloudSolrClient server = null;
public static CloudSolrClient getServer() {
final String zkHost = "localhost:2181,localhost:2182,localhost:2183";
final String defaultCollection = "core1";
final int zkClientTimeout = 20000;//zk客户端超时时间
final int zkConnectTimeout = 1000;//zk连接超时时间
server = new CloudSolrClient(zkHost);
System.out.println("The Cloud SolrServer Instance has benn created!");
server.setDefaultCollection(defaultCollection);
server.setZkClientTimeout(zkClientTimeout);
server.setZkConnectTimeout(zkConnectTimeout);
server.connect();
return server;
}
public static void main(String[] args) {
}
}
package com.solr.solrCloud;
import java.util.ArrayList;
import java.util.Collection;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.common.SolrInputDocument;
public class CloudSolrTest {
public static void addIndex() throws Exception {
CloudSolrClient server = CloudSolrServer.getServer();
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField("id", 1);
doc1.addField("name_s", "中国人");
SolrInputDocument doc2 = new SolrInputDocument();
doc2.addField("id", 2);
doc2.addField("name_s", "美国人");
SolrInputDocument doc3 = new SolrInputDocument();
doc3.addField("id", 3);
doc3.addField("name_s", "中大国人");
Collection<SolrInputDocument> coll = new ArrayList<SolrInputDocument>();
coll.add(doc1);
coll.add(doc2);
coll.add(doc3);
server.add(coll);
server.commit();
}
public static void main(String[] args) throws Exception {
addIndex();
}
}
其他删改查都一样,就server连接方式不同,这里就不一一列举了
15、删除core
http://localhost:8081/solr/admin/collections?action=DELETE&name=core1