SolrCloud(solr云)是Solr提供的分布式搜索方案。
Solr在4.0版本之后才提供solrcloud集群方案,在此之前,solr有master-slave方案.
Solr的master-slave集群功能是具有高可用及读写分离特性。读写分离指的是master负责写操作,而slave负责读操作,并且备份master中的索引信息.master-slave机制不支持负载均衡。
Solrcloud没有读写分离,但是solrcloud中,可以进行负载均衡及高可用的配置.
当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。
当索引量很大,搜索请求并发很高时,同样需要使用solrCloud来满足这些需求。
不过当一个系统的索引数据量少的时候是不需要使用SolrCloud的。
SolrCloud是基于Solr和Zookeeper的分布式搜索方案。它的主要思想是:使用Zookeeper作为SolrCloud集群的配置信息中心,统一管理solrcloud的配置,比如solrconfig.xml和schema.xml。
(1)、集中式的配置信息
(2)、自动容错
(3)、近实时搜索
(4)、查询时自动负载均衡
1、solrcloud为了降低单机的处理压力,需要由多台服务器共同来完成索引和搜索任务。实现的思路是将索引数据进行Shard分片,每个分片由多台服务器共同完成,当一个索引或搜索请求过来时会分别从不同的Shard的服务器中操作索引。
2、solrcloud是基于solr 和 zookeeper部署,zookeeper是一个集群管理软件,solrCloud需要由多台solr服务器组成,然后由zookeeper来进行协调管理。
3、solrCloud应用图例:图例总结:solrcloud的架构分为逻辑结构和物理结构。
物理结构:(需要进行安装)
Solrcloud集群是由多台安装solr服务的Linux服务器组成.每台solr服务器中可以安装多个solr服务(也就是core,一个solr服务对应一个solrcore,对应一个solrhome,对应一个tomcat)。
从物理结构来看,solrcloud需要三台solr服务器,每台服务器包括两个solrcore实例,共同组成一个solrcloud。
逻辑结构:(需要配置)
Solrcloud集群从逻辑上可以看成是一个collection(solrcloud的完整索引集合)。由于solrcloud是分布式的,所以collection从逻辑上需要被分成多个部分(shard)。每个shard中包含多个solr服务(core),同一个shard中多个solr服务之间是有不同角色的,分别是一主多从。
同一个shard中有多个solr服务的好处:负载均衡\高可用。
不同shard中包含不同的solr服务,它的好处: 可以比较好的进行扩容
从逻辑结构来说,整个solrcloud就看成一个大的solrcore,也就是一个collection。而一个collection被分成两个shard分片(shard1和shard2)。shard1和shard2又分别由三个solrcore组成,其中一个Leader两个Replication。Leader是由zookeeper选举产生,zookeeper控制每个shard上三个Core的索引数据一致,解决高可用问题。
用户发起索引请求分别从shard1和shard2上获取,解决高并发问题。
Collection:
Collection在Solrcloud集群中是一个逻辑意义上的完整的索引结构。它常常被划分为一个或多个shard分片,这些shard分片使用相同的配置信息。
比如:针对商品信息搜索可以创建一个collection。collection=shard1+shard2+....+shardX
Shard:
Shard是Collection的逻辑分片。每个Shard被化成一个或者多个replication,通过选举确定哪个是Leader。
Core:
每个Core都是Solr中一个独立运行单位,提供索引和搜索服务。一个shard需要由一个Core或多个Core组成。由于collection由多个shard组成,一个shard由多个core组成,所以也可以说collection一般由多个core组成。
Master 或 Slave:
Master是master-slave结构中的主结点(通常说主服务器),Slave是master-slave结构中的从结点(通常说从服务器或备服务器)。同一个Shard下master和slave存储的数据是一致的,这是为了达到高可用目的。
(1)、solrcloud是通过zookeeper统一管理配置文件(solrconfig.xml、schema.xml等),所以搭建solrcloud之前,需要先搭建zookeeper。
(2)、由于solrcloud一般都是解决大数据量、大并发的搜索服务,所以搭建solrcloud,对zookeeper也需要搭建集群。
本教程的 solrcloud 是搭建在一台机器中,指定不同的端口。而真实生产环境搭建solrcloud时,只需要修改ip地址即可。
需要三台zookeeper、分别是zk1、zk2、zk3,对应的端口分别为2281、2282、2283
安装jdk,zookeeper是使用java开发的。
注意:客户端端口、通信端口、选举端口,在同一台机器搭建集群时,需要与集群中其他zookeeper服务的端口区分。
[root@localhost conf]# mv zoo_sample.cfg zoo.cfg
数据目录需要手动创建出来
# 配置数据目录
dataDir=/usr/local/solrCloud/zk1/data
# the port at which the clients will connect
# 配置zookeeper的端口号,默认端口号是2181,可以修改
clientPort=2281
#集群中每台机器都是以下配置
#2881系列端口是zookeeper通信端口
#3881系列端口是zookeeper投票选举端口
server.1=192.168.200.134:2881:3881
server.2=192.168.200.134:2882:3882
server.3=192.168.200.134:2883:3883
[root@localhost solrCloud]# cp zk1 zk2 -r
[root@localhost solrCloud]# cp zk1 zk3 -r
[root@localhost solrCloud]# vim start-zk.sh
/usr/local/solrCloud/zk1/bin/zkServer.sh restart
/usr/local/solrCloud/zk2/bin/zkServer.sh restart
/usr/local/solrCloud/zk3/bin/zkServer.sh restart
[root@localhost solrCloud]# chmod u+x start-zk.sh
solrcloud由zookeeper统一管理solr的配置文件(主要是schema.xml、solrconfig.xml),solrcloud各个solrcore节点都使用zookeeper管理的统一配置文件。
注意:solrcloud启动之前,需要先启动zookeeper集群。
[root@localhost solrCloud]# cp ../solr/solrHome/ ./solrHome8280 -r
[root@localhost solrCloud]# cp ../solr/solrHome/ ./solrHome8380 -r
[root@localhost solrCloud]# cp ../solr/solrHome/ ./solrHome8480 -r
[root@localhost solrCloud]# cp ../solr/solrHome/ ./solrHome8580 -r
[root@localhost solrCloud]# cp ../solr/apache-tomcat-7.0.47 ./tomcat8280 -r
[root@localhost solrCloud]# cp ../solr/apache-tomcat-7.0.47 ./tomcat8380 -r
[root@localhost solrCloud]# cp ../solr/apache-tomcat-7.0.47 ./tomcat8480 -r
[root@localhost solrCloud]# cp ../solr/apache-tomcat-7.0.47 ./tomcat8580 -r
JAVA_OPTS="-DzkHost=192.168.200.134:2281,192.168.200.134:2282,192.168.200.134:2283"
使用/usr/local/solr-4.10.3/example/scripts/cloud-scripts下的zkcli.sh命令将/usr/local/solrcloud/solrhome8280/collection1/conf目录上传到zookeeper进行配置。
进入solr-4.10.3/example/scripts/cloud-scripts/目录下,执行以下命令
./zkcli.sh -zkhost 192.168.200.134:2281,192.168.200.134:2282,192.168.200.134:2283
-cmd upconfig -confdir /usr/local/solrCloud/solrHome8280/collection1/conf -confname myconf
使用zookeeper自带的zkCli.sh命令连接zookeeper集群,查看上传的配置文件。
[root@localhost bin]# ./zkCli.sh -server 192.168.200.134:2281
需求:创建新的集群,名称为collection2,集群中有四个solr节点,将集群分为两片,每片两个副本。
使用以下命令,在浏览器中执行
http://192.168.200.134:8280/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
浏览器使用以下命令
http://192.168.200.134:8280/solr/admin/collections?action=DELETE&name=collection1
package test;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SolrTest {
@Test
public void testCloud() throws Exception {
String zkHost = "192.168.200.134:2281,192.168.200.134:2282,192.168.200.134:2283";
// 创建CloudSolrServer对象
CloudSolrServer solrServer = new CloudSolrServer(zkHost);
// 设置SolrServer的默认Collection名称
solrServer.setDefaultCollection("collection2");
// 调用solrServer的api方法完成索引库操作
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "c001");
doc.addField("name", "测试solr连接");
solrServer.add(doc);
solrServer.commit();
}
/**
* 与spring整合测试
*/
@Test
public void testSpringSolr() throws Exception {
// 获取solrServer对象
ApplicationContext app = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-solr.xml");
SolrServer solrServer = app.getBean(SolrServer.class);
// 调用solrServer的api方法完成索引库操作
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "c003");
doc.addField("name", "测试solr连接3");
solrServer.add(doc);
solrServer.commit();
}
}