前言
SolrCloud是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。
SolrCloud需要Solr基于Zookeeper部署,Zookeeper是一个集群管理软件,由于SolrCloud需要由多台服务器组成,由zookeeper来进行协调管理。
注 : 由于本文中涉及到了Solr的单机部署及ZK集群的搭建,请参照本人之前写好的几篇文章,这里不再过多介绍。
环境准备
- Linux (三台)
- solr
- zookeeper-3.4.9.tar.gz
Solr 单节点部署
将我们在上文中(Apache Solr 简介及使用)部署好的 apache-tomcat-7.0.77(webapps已经内置solr) 与 solr_home (索引库) 打包成solr.zip,将solr.zip上传到Linux服务器中的任意一台即可。
#解压zip包时需要使用unzip,如果没有安装可以执行以下命令
yum -y install unzip
1> 安装solr
unzip solr.zip
mv solr /usr/
2> 修改tomcat中的solr索引库位置
cd /usr/solr/apache-tomcat-7.0.77/webapps/solr/WEB-INF/
vim web.xml
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/usr/solr/solr-home</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
3> 启动tomcat
注: 要给tomcat/bin里所有脚本可执行权限
cd /usr/solr/apache-tomcat-7.0.77/bin/
chmod 777 *
./startup.sh
4> 访问solr -> http://Hadoop1:8080/solr/
看到如下页面说明访问成功。
成功后务必将tomcat关掉,才能进行下面的集群搭建!!!
成功后务必将tomcat关掉,才能进行下面的集群搭建!!!
成功后务必将tomcat关掉,才能进行下面的集群搭建!!!
./shutdown.sh
5> 由于我们在上文中配置了多个索引库,现在我们要删除其他的索引库,还原原始状态
cd /usr/solr/solr-home
//删除多余的索引库,只保留一个collection1即可
rm -rf collection2
//删除collection1索引库中产生的data
cd /usr/solr/solr-home/collection1
rm -rf data
Solr 集群
1> 我们需要将上文中准备好的 solr-4.10.2.zip 上传到服务器
#解压
unzip solr-4.10.2.zip
#将solr安装包复制到/usr/solr/下
mv solr-4.10.2 /usr/solr/
2> 下面是将solr托管给zookeeper,执行的是zkcli.sh命令
这个命令在solr安装包solr-4.10.2/example/scripts/cloud-scripts文件夹里
#开始执行上传
cd /usr/solr/solr-4.10.2/example/scripts/cloud-scripts
//注意: 以下命令是一行
./zkcli.sh -zkhost Hadoop1:2181,Hadoop2:2181,Hadoop3:2181 -cmd upconfig -confdir /usr/solr/solr-home/collection1/conf -confname solrconf
注意要修改上面的host地址,-confdir指的是索引库conf文件夹的地址
-confdir实际上是要将两个重要文件托管给zk管理 : schema.xml,solrconfig.xml
当执行完以上的命令之后,如果看到类似下图样子,说明执行成功
以下命令主要用于查看zookeeper中是否存在solr的配置文件: 可以不执行跳过
cd cd /usr/zookeeper/zookeeper-3.4.9/bin/
./zkCli.sh
ls /configs/solrconf
3> 修改索引库solr-home中的solr.xml
cd /usr/solr/solr-home
vim solr.xml
4> 修改tomcat的Catalina.sh配置文件
cd /usr/solr/apache-tomcat-7.0.77/bin
vim catalina.sh
//添加如下内容 注意: 这是一行内容, 复制时一起复制即可
export "JAVA_OPTS=-DzkHost=Hadoop1:2181,Hadoop2:2181,Hadoop3:2181"
5> 将solr目录发送到其他两台linux上,首先看一下/usr/solr下的内容
cd /usr
# 将整个solr目录发送到其他服务器
scp -r solr root@Hadoop2:$PWD
scp -r solr root@Hadoop3:$PWD
6> 分别启动三台机器的tomcat
cd /usr/solr/apache-tomcat-7.0.77/bin/
./startup.sh
此时我们就可以访问solr集群了 http://hadoop1:8080/solr
我们发现访问时多了一个新服务 Cloud,Cloud代表的是当前集群节点状态
此时,我们的solr集群就启动成功了
SolrCloud管理命令
1> 创建新集群(创建一个索引库)
#注意:这是一行Http请求,空间问题,分成了三行
http://Hadoop1:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2
&replicationFactor=2&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请求后,会返回如下信息,说明创建新索引库成功
重新查看solr管理界面的Cloud信息
2> 删除Core索引库
http://Hadoop1:8080/solr/admin/collections?action=DELETE&name=collection1
与上面创建时一样,返回success时说明删除成功,发现只有collection2了
3> 查询所有Core
http://Hadoop1:8080/solr/admin/collections?action=LIST
4> 分裂shard
分裂: 就是将某个分片分成两个分片
注: 一旦分裂后, 虽然原来的分片还可以提供服务, 但是已经不再保存数据, 会将数据保存到新的分裂后的分片
#注意:这是一行Http请求,空间问题,分成了两行
http://Hadoop1:8080/solr/admin/collections?
action=SPLITSHARD&collection=collection2&shard=shard1
参数说明:
shard: 指定要分裂的分片
5> 删除某个分片
注: 删除的分片必须是已经被分裂的, 或者是已经无法提供服务的
#注意:这是一行Http请求,空间问题,分成了两行
http://Hadoop1:8080/solr/admin/collections?
action=DELETESHARD&shard=shard1&collection=collection2
删除之后就没有collection2中的shard1了
Solr Cloud 在Java中的使用
导入相关的pom依赖
<dependencies>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.2</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging-api</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
1> 创建索引
@Test
public void createIndexToSolrCloud() throws IOException, SolrServerException {
//1. 创建连接solrCloud的服务对象
//String zkHost: 需要传递zookeeper集群的地址
String zkHost="Hadoop1:2181,Hadoop2:2181,Hadoop3:2181";
CloudSolrServer cloudSolrServer = new CloudSolrServer(zkHost);
//1.1 设置连接那个solr的索引库
cloudSolrServer.setDefaultCollection("collection2");
//1.2 可选的参数
//设置连接zookeeper的时间
cloudSolrServer.setZkClientTimeout(5000);
//设置获取和solr的连接的时间
cloudSolrServer.setZkConnectTimeout(5000);
//3. 执行获取连接
cloudSolrServer.connect();
//4. 添加索引操作
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id","1");
doc.addField("title","你好,solrCloud");
cloudSolrServer.add(doc);
//5. 执行提交
cloudSolrServer.commit();
}
2> 删除索引
//删除索引
@Test
public void deleteIndexToSolrCloud() throws IOException, SolrServerException {
//1. 创建连接solrCloud的服务对象
//String zkHost: 需要传递zookeeper集群的地址
String zkHost="Hadoop1:2181,Hadoop2:2181,Hadoop3:2181";
CloudSolrServer cloudSolrServer = new CloudSolrServer(zkHost);
//1.1 设置连接那个solr的索引库
cloudSolrServer.setDefaultCollection("collection2");
//1.2 可选的参数
//设置连接zookeeper的时间
cloudSolrServer.setZkClientTimeout(5000);
//设置获取和solr的连接的时间
cloudSolrServer.setZkConnectTimeout(5000);
//3. 执行获取连接
cloudSolrServer.connect();
//4. 添加索引操作
cloudSolrServer.deleteById("1");
//5. 执行提交
cloudSolrServer.commit();
}
3> 查询索引
//查询索引
@Test
public void queryIndexToSolrCloud() throws IOException, SolrServerException {
//1. 创建连接solrCloud的服务对象
//String zkHost: 需要传递zookeeper集群的地址
String zkHost="Hadoop1:2181,Hadoop2:2181,Hadoop3:2181";
CloudSolrServer cloudSolrServer = new CloudSolrServer(zkHost);
//1.1 设置连接那个solr的索引库
cloudSolrServer.setDefaultCollection("collection2");
//1.2 可选的参数
//设置连接zookeeper的时间
cloudSolrServer.setZkClientTimeout(5000);
//设置获取和solr的连接的时间
cloudSolrServer.setZkConnectTimeout(5000);
//3. 执行获取连接
cloudSolrServer.connect();
//4. 添加索引操作
SolrQuery query = new SolrQuery("*:*");
QueryResponse response = cloudSolrServer.query(query);
SolrDocumentList documentList = response.getResults();
for (SolrDocument doc : documentList) {
Object id = doc.get("id");
Object title = doc.get("title");
System.out.println(id+" "+title);
}
}
至此,Solr 的集群就介绍完了~