什么是solrCloud
SolrCloud是solr提供的分布式搜索方案
适用情景:大规模,容错,分布式索引,检索
soLrCloud是基于solr和zookeeper的分布式搜索方案,
zookeeper的作用
使用zookeeper来管理集群:
- 监控集群中的每个节点的健康状态
- 请求来了先连zookeeper,而不是直接连solr,然后由zookeeper决定将这个请求发给哪台服务器然后哪台服务器来进行搜索
- zookeeper可以对配置文件进行集群管理,因为集群中有这么多节点,每个节点都有一套配置文件的话不统一,因此我们把配置文件提出来放到zookeeper上,让集群中所有节点都去zookeeper上读取这个配置文件
solrCloud原理
系统架构图
物理结构:
一个solr服务可以有1个或者多个core,每个core【数据库】存储不同的索引【表】,相互之间不干扰
逻辑结构:
- 一个collection代表一个完整的索引库,因为存储的内容很多,因此要分片存储,两片的内容不一样
每一片要存储到3个节点即3个core上,这3个core上内容完全一样,等于把一个片的内容复制3份放在3个core,有一个主core,2个从core
关于zookeeper集群和solr集群的节点个数
- 因为zookeeper是solr集群的入口,因此zookeeper也要实现高可用,因此才搭建zookeeper集群,而zookeeper遵循投票选举制度, 所以节点最好是奇数节点,最小的话就是3个了。
- solr集群要分片的话至少分两片,分一片的话就是主和备,就不叫分片了,而每一片至少都是一主master一备slave,实现高可用,这样就是4个core,即一个solrCloud至少7台服务器3zookeeper,4solr
开始搭建solrCloud
1 搭建zookeeper集群
1.1 在~下创建文件夹solrCloud:
mkdir solrCloud
1.2 上传zookeeper.tar包到~目录下,然后解压
tar -xzvf zookeeper-3.4.6.tar.gz
1.3 复制3份解压好的文件分别到solrCloud的zookeeper文件夹中
[root@localhost ~]# cp -r zookeeper-3.4.6 ~/solrCloud/zookeeper1
[root@localhost ~]# cp -r zookeeper-3.4.6 ~/solrCloud/zookeeper2
[root@localhost ~]# cp -r zookeeper-3.4.6 ~/solrCloud/zookeeper3
原始zookeeper文件结构
1.4 进入每个zookeeper目录,创建数据data目录,并在data目录中创建myid文件,内容为实例id,即如果为zookeeper1,则myid中内容为1,如果为zookeeper2,则myid内容为2
cd data/
echo 1>myid
cat myid
1.5 进入每个zookeeper目录,修改配置文件:conf/zoozoo_sample.cfg文件改名为zoo.cfg,并修改zoo.cfg中的配置,主要有数据目录地址的修改dataDir,服务端口号的修改clientPort,以及添加配置集群中所有节点的通讯的ip和端口
cd conf/
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
这里的集群节点配置端口虽然是128,但是后来已经更新为129
1.6 在solrCloud目录下编辑快速启动脚本start-zookeeper.sh
cd zookeeper1/bin
./zkServer.sh start
cd ../../
cd zookeeper2/bin
./zkServer.sh start
cd ../../
cd zookeeper3/bin
./zkServer.sh start
cd ../../
1.7 给快速启动脚本添加执行权限,仅授权与当前用户
chmod u+x start-zookeeper.sh
1.8 执行脚本,查看执行结果
./start-zookeeper.sh
Using config: /root/solrCloud/zookeeper1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
JMX enabled by default
Using config: /root/solrCloud/zookeeper2/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
JMX enabled by default
Using config: /root/solrCloud/zookeeper3/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
1.9 进入节点目录查看节点状态,可以看到有了一个leader和两个follower
2 搭建solr集群
2.1 在solrCloud目录下创建4个tomcat实例[每个tomcat带有一个solr服务工程],并修改各自对应的端口,如第一个修改8005为8105,8080为8180,8009改为8109,以此类推,第二个tomcat,第三个tomcat,第四个tomcat端口第二位依次加1
2.2 为每个tomcat中的solr服务配置对应的solrhome,将单机版的solrhome配置文件夹直接拷贝四份,并修改每一个的solrhome下的solr.xml,单机版中无需配置此配置文件,但是集群版需要修改。文件结构如下
[root@localhost solrhome1]# ll
total 24
drwxr-xr-x. 2 root root 4096 Mar 11 20:14 bin
drwxr-xr-x. 4 root root 4096 Mar 11 20:14 collection1
drwxr-xr-x. 4 root root 4096 Mar 11 20:14 collection2
-rw-r--r--. 1 root root 2473 Mar 11 20:14 README.txt
-rw-r--r--. 1 root root 1708 Mar 18 06:59 solr.xml
-rw-r--r--. 1 root root 501 Mar 11 20:14 zoo.cfg
修改solr.xml中关于solrCloud的配置项目
<solrcloud>
<str name="host">192.168.183.129</str> // 为该solrhome对应的solr服务的ip
<int name="hostPort">8180</int> // 为该solrhome对应的solr服务的端口号
<str name="hostContext">${hostContext:solr}</str>
<int name="zkClientTimeout">${zkClientTimeout:30000}</int>
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
</solrcloud>
同理,配置其余3个solrhome的solr.xml中关于solrCloud的配置
2.3 配置solr与solrhome的关系,即在solr服务工程中的web.xml中配置solrhome的路径
<!-- People who want to hardcode their "Solr Home" directly into the
WAR File can set the JNDI property here...
-->
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/root/solrCloud/solrhome1</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
2.4 配置solr与zookeeper的关系,修改每个tomcat/bin/catalina.sh文件,来关联solr和zookeeper,添加如下配置到配置文件中,配置JAVA_OPTS配置项,指定zookeeper地址,因为是zookeeper集群因此配置zookeeper的地址列表
# Uncomment the following line to make the umask available when using the
# org.apache.catalina.security.SecurityListener
#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`um
ask`"
JAVA_OPTS="-DzkHost=192.168.183.129:2181,192.168.183.129:2182,192.168.183.129:21
83"
2.5 现在每个solr都对应自己的一个solrhome,每个solr用到的配置文件都在自己独立的solrhome中,而每个solrhome中的配置文件可能不一样,而在集群环境下,配置文件应该只有一份,因此我们把配置文件上传到zookeeper,让zookeeper统一管理配置文件,我们需要将solrhome/collection1/conf文件夹上传到zookeeper,至于用哪个solrhome任意,我们在这里上传solrhome1中的conf文件夹conf文件夹目录结构如下所示
[root@localhost conf]# ll
total 296
-rw-r--r--. 1 root root 1068 Mar 11 20:14 admin-extra.html
-rw-r--r--. 1 root root 928 Mar 11 20:14 admin-extra.menu-bottom.html
-rw-r--r--. 1 root root 926 Mar 11 20:14 admin-extra.menu-top.html
drwxr-xr-x. 3 root root 4096 Mar 11 20:14 clustering
-rw-r--r--. 1 root root 3974 Mar 11 20:14 currency.xml
-rw-r--r--. 1 root root 1348 Mar 11 20:14 elevate.xml
drwxr-xr-x. 2 root root 4096 Mar 11 20:14 lang
-rw-r--r--. 1 root root 78514 Mar 11 20:14 mapping-FoldToASCII.txt
-rw-r--r--. 1 root root 2868 Mar 11 20:14 mapping-ISOLatin1Accent.txt
-rw-r--r--. 1 root root 873 Mar 11 20:14 protwords.txt
-rw-r--r--. 1 root root 33 Mar 11 20:14 _rest_managed.json
-rw-r--r--. 1 root root 450 Mar 11 20:14 _schema_analysis_stopwords_english.json
-rw-r--r--. 1 root root 172 Mar 11 20:14 _schema_analysis_synonyms_english.json
-rw-r--r--. 1 root root 61684 Mar 11 20:14 schema.xml
-rw-r--r--. 1 root root 921 Mar 11 20:14 scripts.conf
-rw-r--r--. 1 root root 74827 Mar 11 20:14 solrconfig.xml
-rw-r--r--. 1 root root 13 Mar 11 20:14 spellings.txt
-rw-r--r--. 1 root root 781 Mar 11 20:14 stopwords.txt
-rw-r--r--. 1 root root 1119 Mar 11 20:14 synonyms.txt
-rw-r--r--. 1 root root 1416 Mar 11 20:14 update-script.js
drwxr-xr-x. 2 root root 4096 Mar 11 20:14 velocity
drwxr-xr-x. 2 root root 4096 Mar 11 20:14 xslt
我们上传这个conf文件夹的话需要用到一个插件,这个工具在solr目录下面,solr目录结构如下
[root@localhost solr-4.10.3]# ll
total 996
drwxr-xr-x. 2 root root 4096 Jan 18 20:01 bin
-rw-r--r--. 1 root root 406208 Dec 9 2014 CHANGES.txt
drwxr-xr-x. 13 root root 4096 Dec 9 2014 contrib
drwxr-xr-x. 4 root root 4096 Jan 15 20:05 dist
drwxr-xr-x. 17 root root 4096 Jan 15 20:05 docs
drwxr-xr-x. 15 root root 4096 Jan 15 20:05 example
drwxr-xr-x. 2 root root 28672 Jan 15 20:05 licenses
-rw-r--r--. 1 root root 12646 Dec 1 2014 LICENSE.txt
-rw-r--r--. 1 root root 501873 Dec 8 2014 LUCENE_CHANGES.txt
-rw-r--r--. 1 root root 24655 Dec 1 2014 NOTICE.txt
-rw-r--r--. 1 root root 5344 Dec 1 2014 README.txt
-rw-r--r--. 1 root root 850 Dec 1 2014 SYSTEM_REQUIREMENTS.txt
插件具体位置在
solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh
执行如下命令来上传,其中confname是为上传到zookeeper集群中的配置文件的起名为myconf
./zkcli.sh -zkhost 192.168.183.129:2181,192.168.183.129:2182,192.168.183.129:2183 -cmd upconfig -confdir /root/solrCloud/solrhome1/collection1/conf -confname myconf
执行完毕等待时间上传完成
2.6 检查配置文件是否上传成功,进入solrCloud目录下的任意zookeeper目录,此处我们进入zookeeper1目录,然后执行如下命令,输入ip和端口来连接该服务器上的指定端口的zookeeper,如我们这里配置连接2182端口上的zookeeper
./zkCli.sh -server 192.168.183.129:2182
需要注意的是:我们只需要连接zookeeper集群中的任意节点即可,不需要是leader,连接成功如下图所示
使用下面命令查看上传的配置文件目录
ls /
[zk: 192.168.183.129:2182(CONNECTED) 0] ls /
[configs, zookeeper]
[zk: 192.168.183.129:2182(CONNECTED) 1] ls /configs
[myconf]
[zk: 192.168.183.129:2182(CONNECTED) 2] ls /configs/myconf
[admin-extra.menu-top.html, currency.xml, protwords.txt, mapping-FoldToASCII.txt, _schema_analysis_synonyms_english.json, _rest_managed.json, solrconfig.xml, _schema_analysis_stopwords_english.json, stopwords.txt, lang, spellings.txt, mapping-ISOLatin1Accent.txt, admin-extra.html, xslt, synonyms.txt, scripts.conf, update-script.js, velocity, elevate.xml, admin-extra.menu-bottom.html, clustering, schema.xml]
可以看到配置文件已经成功上传,所有solr节点将共享这一份配置文件
2.7 使用quit退出zookeeper客户端连接。在solrCloud目录下编辑批处理文件start-tomcat.sh启动所有tomcat
/root/solrCloud/tomcat1/bin/startup.sh
/root/solrCloud/tomcat2/bin/startup.sh
/root/solrCloud/tomcat3/bin/startup.sh
/root/solrCloud/tomcat4/bin/startup.sh
2.8 为该批护理文件添加执行权限
chmod +x start-tomcat.sh
2.9 执行
./start-tomcat.sh
然后查看任意tomcat的启动日志,查看是否启动成功
2.10 访问任意solr服务,key看到已经配置成功
2.11 新建collection进行分片操作,使用如下命令,ip和端口修改为自己的
http://192.168.183.129:8180/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
2.12 删除不常用的collection
http://192.168.183.129:8180/solr/admin/collections?action=DELETE&name=collection1