读此文之前建议先读单机版的安装和使用:Solr(一)solr的介绍、linux安装、使用
SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。
SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。
它有几个特色功能:
1)集中式的配置信息
2)自动容错
3)近实时搜索
4)查询时自动负载均衡
solrcloud为了降低单机的处理压力,需要由多台服务器共同来完成索引和搜索任务。实现的思路是将索引数据进行Shard分片,每个分片由多台服务器共同完成,当一个索引或搜索请求过来时会分别从不同的Shard的服务器中操作索引。solrcloud是基于solr和zookeeper部署,zookeeper是一个集群管理软件,solrcloud需要由多台solr服务器组成,然后由zookeeper来进行协调管理。
SolrCloud结构图如下:
需要三个zookeeper节点
四个solr节点。
使用伪分布式实现solr集群。需要三个zookeeper实例,4个tomcat实例,可以在一台虚拟机上模拟。建议虚拟机1G以上内存。
三个zookeeper实例。Zookeeper也是java开发的所以需要安装jdk。
1、Linux系统
2、Jdk环境。
3、Zookeeper。
[root@solr ~]# mkdir /home/solrcloud
[root@solr ~]# mv zookeeper-3.4.6 /home/solrcloud/zookeeper1
[root@solr ~]# cd /home/solrcloud/
[root@solr solrcloud]# cp -r zookeeper1/ zookeeper2
[root@solr solrcloud]# cp -r zookeeper1/ zookeeper3
1、在每个zookeeper文件夹下创建一个data目录。
2、在data文件夹下创建一个文件名称为myid,文件的内容就是此zookeeper的编号1、2、3
[root@solr solrcloud]# echo 1 >> zookeeper1/data/myid
[root@solr solrcloud]# echo 2 >> zookeeper2/data/myid
[root@solr solrcloud]# echo 3 >> zookeeper3/data/myid
3、分别把zookeeper1、2、3下conf目录下的zoo_sample.cfg文件复制一份改名为zoo.cfg
[root@solr conf]# cp zoo_sample.cfg zoo.cfg
4、分别修改zookeeper1、2、3的配置文件zoo.cfg(zookeeper2的clientPort=2182,zookeeper3的clientPort=2183)
dataDir=/home/solrcloud/zookeeper1/data/
clientPort=2181
server.1=192.168.168.128:2881:3881
server.2=192.168.168.128:2882:3882
server.3=192.168.168.128:2883:3883
启动zookeeper:./zkServer.sh start
关闭:./zkServer.sh stop
查看状态:./zkServer.sh status
[root@solr solrcloud]# zookeeper1/bin/zkServer.sh start
JMX enabled by default
Using config: /home/solrcloud/zookeeper1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@solr solrcloud]# zookeeper2/bin/zkServer.sh start
JMX enabled by default
Using config: /home/solrcloud/zookeeper2/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@solr solrcloud]# zookeeper3/bin/zkServer.sh start
JMX enabled by default
Using config: /home/solrcloud/zookeeper3/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
查看状态:
[root@solr solrcloud]# zookeeper1/bin/zkServer.sh status
JMX enabled by default
Using config: /home/solrcloud/zookeeper1/bin/../conf/zoo.cfg
Mode: follower
[root@solr solrcloud]# zookeeper2/bin/zkServer.sh status
JMX enabled by default
Using config: /home/solrcloud/zookeeper2/bin/../conf/zoo.cfg
Mode: leader
[root@solr solrcloud]# zookeeper3/bin/zkServer.sh status
JMX enabled by default
Using config: /home/solrcloud/zookeeper3/bin/../conf/zoo.cfg
Mode: follower
[root@solr ~]# cp /home/solr/tomcat/ /home/solrcloud/tomcat1/ -r
[root@solr ~]# cp /home/solr/tomcat/ /home/solrcloud/tomcat2/ -r
[root@solr ~]# cp /home/solr/tomcat/ /home/solrcloud/tomcat3/ -r
[root@solr ~]# cp /home/solr/tomcat/ /home/solrcloud/tomcat4/ -r
修改tomcat2、tomcat3、tomcat4的配置文件:(要改3处地方)
[root@solr solrcloud]# vi tomcat2/conf/server.xml
[root@solr solr]# cp solrhome/ /home/solrcloud/solrhome1 -r
[root@solr solr]# cp solrhome/ /home/solrcloud/solrhome2 -r
[root@solr solr]# cp solrhome/ /home/solrcloud/solrhome3 -r
[root@solr solr]# cp solrhome/ /home/solrcloud/solrhome4 -r
修改web.xml指定solrhome的位置(其他3个tomcat实例的修改这里就不做演示)。
[root@solr solrcloud]# vi tomcat1/webapps/solr/WEB-INF/web.xml
[root@solr solrcloud]# vi shutdownAll.sh
./tomcat1/bin/shutdown.sh
./tomcat2/bin/shutdown.sh
./tomcat3/bin/shutdown.sh
./tomcat4/bin/shutdown.sh
[root@solr solrcloud]# vi startupAll.sh
./tomcat1/bin/startup.sh
./tomcat2/bin/startup.sh
./tomcat3/bin/startup.sh
./tomcat4/bin/startup.sh
给shutdownAll.sh 和 startupAll.sh执行权限
[root@solr solrcloud]# chmod 755 ./shutdownAll.sh
[root@solr solrcloud]# chmod 755 ./startupAll.sh
[root@solr solrcloud]# vi solrhome1/solr.xml
[root@solr solrcloud]# vi tomcat1/bin/catalina.sh
JAVA_OPTS="-DzkHost=192.168.168.128:2181,192.168.168.128:2182,192.168.168.128:2183"
(可以使用vim的查找功能查找到JAVA_OPTS的定义的位置,然后添加)
客户端命令位置:/root/training/solr-4.10.3/example/scripts/cloud-scripts
./zkcli.sh -zkhost 192.168.168.128:2181,192.168.168.128:2182,192.168.168.128:2183 -cmd upconfig -confdir /home/solrcloud/solrhome1/collection1/conf -confname myconf
注意:只需要上传solrhome1的就行了,因为solrhome1、2、3、4的conf的文件信息都是完全一样的。
查看配置文件是否上传成功:
[root@solr bin]# ./zkCli.sh
[zk: localhost:2181(CONNECTED) 28] ls /configs/myconf
[currency.xml, mapping-FoldToASCII.txt, protwords.txt, scripts.conf, synonyms.txt, stopwords.txt, velocity, _schema_analysis_synonyms_english.json, admin-extra.html, update-script.js, _schema_analysis_stopwords_english.json, solrconfig.xml, admin-extra.menu-top.html, elevate.xml, schema.xml, clustering, xslt, _rest_managed.json, mapping-ISOLatin1Accent.txt, spellings.txt, lang, admin-extra.menu-bottom.html]
一个主节点多个备份节点,集群只有一片。
使用以下命令创建:
http://192.168.168.128:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
http://192.168.168.128:8080/solr/admin/collections?action=DELETE&name=collection1
使用solrj操作集群环境的索引库。
public class SolrCloudTest {
@Test
public void testAddDocument() throws Exception {
//创建一个和solr集群的连接
//参数就是zookeeper的地址列表,使用逗号分隔
String zkHost = "192.168.168.128:2181,192.168.168.128:2182,192.168.168.128:2183";
CloudSolrServer solrServer = new CloudSolrServer(zkHost);
//设置默认的collection
solrServer.setDefaultCollection("collection2");
//创建一个文档对象
SolrInputDocument document = new SolrInputDocument();
//向文档中添加域
document.addField("id", 2);
document.addField("productId", 2);
document.addField("productTitle", "测试商品2");
document.addField("productValidStart", "2018-01-01");
document.addField("productValidEnd", "2018-05-05");
document.addField("merchantName", "去哪儿");
document.addField("productType", "一日游");
document.addField("countryName", "新加坡");
document.addField("merchantId", "23");
//把文档添加到索引库
solrServer.add(document);
//提交
solrServer.commit();
}
@Test
public void deleteDocument() throws SolrServerException, IOException {
//创建一个和solr集群的连接
//参数就是zookeeper的地址列表,使用逗号分隔
String zkHost = "192.168.168.128:2181,192.168.168.128:2182,192.168.168.128:2183";
CloudSolrServer solrServer = new CloudSolrServer(zkHost);
//设置默认的collection
solrServer.setDefaultCollection("collection2");
solrServer.deleteByQuery("*:*");
solrServer.commit();
}
}
resource.properties
#集群版
SOLRClOUD.SERVER.URL =192.168.168.128:2181,192.168.168.128:2182,192.168.168.128:2183
在applicationContext-solr.xml添加: