SlrCloud(solr集群)是Solr提供的分布式搜索方案。当你需要大规模,容错,分布式索引和检索能力时使用SolrCloud。当索引量很大,搜索请求并发很高时,同样需要使用SolrCloud来满足这些需求。不过当一个系统的索引数据量少的时候是没有必要使用SolrCloud的。
SolrCloud为了降低单机的处理压力,需要由多台服务器共同来完成索引和搜索任务。实现的思路是将索引数据进行Shard(分片)拆分,每个分片由多台的服务器共同完成,当一个索引或搜索请求过来时会分别从不同的Shard的服务器中操作索引。
SolrCloud需要Solr基于Zookeeper部署,Zookeeper是一个集群管理软件,由于SolrCloud需要由多台服务器组成,由zookeeper来进行协调管理。
整体部署的结构图:
ZooKeeper是一个分布式的,开放源码(apache)的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase、dubbox、kafka的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
准备工作:
三台虚拟机: 安装好 jdk1.8 64位即可
修改三台虚拟机的hosts文件:
vi /etc/hosts
添加如下内容:
192.168.72.141 node1
192.168.72.142 node2
192.168.72.143 node3
注意: 添加时, 前面ip地址一定是自己的三台linux的ip地址 后面的名字可以自行创建
cd /export/software/
tar -zxvf zookeeper-3.4.9.tar.gz -C /export/servers/
cd /export/servers/
cd /export/servers/zookeeper-3.4.9/conf
mv zoo_sample.cfg zoo.cfg //进入zookeeper-3.4.9/conf目录,将zoo_sample.cfg文件名称改为zoo.cfg
vi zoo.cfg
修改后, 在配置文件的底部, 添加如下内容
server.1=node1:2887:3887
server.2=node2:2887:3887
server.3=node3:2887:3887
更改后配置文件整体内容如下:(如果担心修改错误, 可以直接将zoo.cfg中的内容全部删除, 复制以下内容即可)
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/export/data/zk
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
#zookeeper集群配置
server.1=node1:2887:3887
server.2=node2:2887:3887
server.3=node3:2887:3887
处理完成后保存退出即可
cd /export/servers/
scp -r zookeeper-3.4.9/ root@node2:$PWD //将zookeeper复制到node2的同级目录下
scp -r zookeeper-3.4.9/ root@node3:$PWD //将zookeeper复制到node3的同级目录下
发送完成后,在其他两台主机查看, 是否已经成功接收到
cd /export/servers
ll
node1:执行的命令
mkdir -p /export/data/zk
echo "1" > /export/data/zk/myid
cat /export/data/zk/myid //此命令用于查看此文件有没有正确写入 1
node2:执行的命令
mkdir -p /export/data/zk
echo "2" > /export/data/zk/myid
cat /export/data/zk/myid //此命令用于查看此文件有没有正确写入 2
node3:执行的命令
mkdir -p /export/data/zk
echo "3" > /export/data/zk/myid
cat /export/data/zk/myid //此命令用于查看此文件有没有正确写入 3
cd /export/servers/zookeeper-3.4.9/bin/
./zkServer.sh start
node1: 为follower
node2: 为leader
node3: 为follower
初始化集群: 采取投票机制, 选举过半即为leader
当下一次在重新启动时, 又会恢复选举,此时谁的数据多, 谁为leader, 如果数据都一样, 那么看id谁最大,同时一般选举过半,就会产生leader
cd /export/software/
//复制单机版solr服务对应的tomcat和solr-home的压缩包到该目录下
yum -y install unzip
unzip solr.zip
mv solr /export/servers/
cd /export/servers/solr/apache-tomcat-7.0.77/bin
vi catalina.sh //注意此时修改的.sh的文件 为非.bat
添加如下内容:(此处后期还会进行修改, 目前只是为了测试单机版本能否在linux中运行)
export "JAVA_OPTS=-Dsolr.solr.home=/export/servers/solr/solr-home"
添加后保存退出即可
注意: 由于是解压的是zip文件, tomcat中的.sh文件都没有任何的执行缺陷, 需要进行赋权限:
chmod 777 /export/servers/solr/apache-tomcat-7.0.77/bin/*
启动tomcat:
cd /export/servers/solr/apache-tomcat-7.0.77/bin/
./startup.sh
看到此页面,说明单机版本配置成功
成功后:将tomcat务必关机操作
./shutdown.sh
务必执行以上命令, 关闭tomcat
//删除多余的索引库, 只保留一个collection1即可
rm -rf collection1/data/ //清空collection1中的数据
1. 需要先上传solr的安装包
cd /export/software/ //上传到该目录
2. 解压solr的安装包
unzip solr-4.10.2.zip
3. 将solr安装包复制到/export/servers下
mv solr-4.10.2 /export/servers/
4. 开始执行上传
cd /export/servers/solr-4.10.2/example/scripts/cloud-scripts/
//注意: 以下命令是一行
./zkcli.sh -zkhost node1:2181,node2:2181,node3:2181 -cmd upconfig -confdir /export/servers/solr/solr-home/collection1/conf/ -confname solrconf
以下命令主要用于查看zookeeper中是否存在solr的配置文件: 可以不执行跳过
cd /export/servers/zookeeper-3.4.9/bin
./zkCli.sh
ls /configs/solrconf
solr.xml是solr集群管理文件
cd /export/servers/solr/solr-home/
vi solr.xml
cd /export/servers/solr/apache-tomcat-7.0.77/bin/
vi catalina.sh
*** 修改如下内容
export "JAVA_OPTS=-Dsolr.solr.home=/export/servers/solr/solr-home //原来的内容
//以下为替换后的内容 注意: 这是一行内容, 复制时一起复制即可
export "JAVA_OPTS=-Dsolr.solr.home=/export/servers/solr/solr-home -DzkHost=node1:2181,node2:2181,node3:2181"
cd /export/servers/
scp -r solr root@node2:$PWD
scp -r solr root@node3:$PWD
cd /export/servers/solr/apache-tomcat-7.0.77/bin/
./startup.sh
启动solrCloud需要先启动solrCloud依赖的所有zookeeper服务器,再启动每台solr服务器。
http://192.168.72.141:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=3&maxShardsPerNode=8&property.schema=schema.xml&property.config=solrconfig.xml
接口参数说明:
action: 表示执行的操作 CREATE 创建
name: 新集群的名称
numShards: 分片数
replicationFactor: 每个分片的节点数
maxShardsPerNode: 设置每个分片的最大节点数, 默认为1
property.schema: 指定使用的schema文件 (注意, 此文件必须在zookeeper上存在)
property.config: 指定使用的solrConfig文件 (注意, 此文件必须在zookeeper上存在)
http://192.168.72.141:8080/solr/admin/collections?action=DELETE&name=collection1
http://192.168.72.141:8080/solr/admin/collections?action=LIST
http://172.168.72.141:8080/solr/admin/cores?action=STATUS&core=collection1
分裂: 就是将某个分片分成两个分片
注意: 一旦分裂后, 虽然原来的分片还可以提供服务, 但是已经不再保存数据, 会将数据保存到新的分裂后的分片
http://192.168.72.141:8080/solr/admin/collections?action=SPLITSHARD&collection=collection1&shard=shard1
参数说明:
shard: 指定要分裂的分片
注意: 删除的分片必须是已经被分裂的, 或者是已经无法提供服务的
http://192.168.72.141:8080/solr/admin/collections?action=DELETESHARD&shard=shard2&collection=collection2
5使用java连接集群, 完成基本的索引库操作
<dependencies>
<dependency>
<groupId>org.apache.solrgroupId>
<artifactId>solr-solrjartifactId>
<version>4.10.2version>
dependency>
<dependency>
<groupId>commons-logginggroupId>
<artifactId>commons-logging-apiartifactId>
<version>1.1version>
dependency>
dependencies>
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
import java.io.IOException;
public class SolrCloud {
public static CloudSolrServer SolrCloudUtil(String collection){
//创建连接solrCloud的连接对象 需要传递zookeeper集群的地址
CloudSolrServer cloudSolrServer=new CloudSolrServer("192.168.72.141:2181,192.168.72.142:2181,192.168.72.143:2181");
cloudSolrServer.setDefaultCollection(collection);
//设置连接zookeeper的时间
cloudSolrServer.setZkClientTimeout(5000);
//设置获取和solr的连接的时间
cloudSolrServer.setZkConnectTimeout(5000);
//执行获取连接
cloudSolrServer.connect();
return cloudSolrServer;
}
/**
* 创建索引
*/
@Test
public void createIndexToSolrCloud() throws IOException, SolrServerException {
CloudSolrServer cloudSolrServer = SolrCloudUtil("collection1");
//添加索引操作
SolrInputDocument document=new SolrInputDocument();
document.addField("id","1");
document.addField("title","solrCloud");
cloudSolrServer.add(document);
//执行提交
cloudSolrServer.commit();
}
/**
* 查询索引
*/
@Test
public void queryIndexToSolrCloud() throws IOException, SolrServerException {
CloudSolrServer cloudSolrServer = SolrCloudUtil("collection1");
//添加索引操作
SolrQuery solrQuery=new SolrQuery("*:*");//查询所有
QueryResponse response = cloudSolrServer.query(solrQuery);
SolrDocumentList results = response.getResults();
for (SolrDocument doc : results) {
System.out.println(doc.get("id")+"----"+doc.get("title"));
}
}
/**
* 删除索引
*/
@Test
public void deleteIndexToSolrCloud() throws IOException, SolrServerException {
CloudSolrServer cloudSolrServer = SolrCloudUtil("collection1");
cloudSolrServer.deleteById("1");
cloudSolrServer.commit();
}
}