之前一篇文章有说如何搭建Solr单机版,这一篇是搭建Solr集群
Zookeeper介绍
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
安装环境
Linux,内存要尽量大一点,否则zookeeper和tomcat不一定全部启动起来。否则CPU会爆掉。
需要安装的软件
安装相关自行百度安装。
集群架构
4个tomcat,4个solrhome,3个zookeeper
开始搭建集群服务
1.1 新建集群中心
到 /usr/local/ 下面
新建一个目录为 solr-cloud
mkdir solr-cloud
此时这个目录下面还是空的,需要拷贝4个tomcat、4个solrhome和3个zookeeper进来
1.2 准备好相关软件拷贝到该目录下面
- cp -r /usr/local/tomcat/tomcat-8.5.37/ tomcat01
- cp -r /usr/local/zookeeper/zookeeper-3.4.12/ zookeeper01
- cp -r /usr/local/solr/solrhome/ solrhome01
zookeeper的相关配置参考另一篇文章:https://blog.csdn.net/qq_35618489/article/details/87269234
拷贝完成如下如
复制多份
另外复制三份新的 tomcat
- cp -r tomcat01/ tomcat02
- cp -r tomcat01/ tomcat03
- cp -r tomcat01/ tomcat04
另外复制三份 solorhome
- cp -r solrhome01/ solrhome02
- cp -r solrhome01/ solrhome03
- cp -r solrhome01/ solrhome04
另外复制两份 zookeeper
- cp -r zookeeper01/ zookeeper02
- cp -r zookeeper01/ zookeeper03
核心的部分来了
1.3 配置 tomcat 的端口和 webapps下面 solr部署包 的 web.xml
①先配置端口号,共三处
修改如下做个记录,三处分别为
- tomcat01 ——> 8006,8081,8010
- tomcat02 ——> 8007,8082,8011
- tomcat03 ——> 8008,8083,8012
- tomcat04 ——> 8009,8084,8013
记住修改tomcat的时候不能出现端口重复。
②配置tomcat 下 webapps 下的 solr/WEB-INF/web.xml
将web.xml里面红框的地址改为相应上面截图里 /usr/local/solr-cloud/solrhome01
修改完成之后,分别为
- /usr/local/solr-cloud/tomcat01/webapps/solr/WEB-INF/web.xml 修改为 /usr/local/solr-cloud/solrhome01
- /usr/local/solr-cloud/tomcat02/webapps/solr/WEB-INF/web.xml 修改为 /usr/local/solr-cloud/solrhome02
- /usr/local/solr-cloud/tomcat03/webapps/solr/WEB-INF/web.xml 修改为 /usr/local/solr-cloud/solrhome03
- /usr/local/solr-cloud/tomcat04/webapps/solr/WEB-INF/web.xml 修改为 /usr/local/solr-cloud/solrhome04
tomcat暂时配置完成了。
1.4 配置 zookeeper 集群
以zookeeper01为例子修改
进入目录
修改 zoo.cfg ,当前的 dataDir地址是 /usr/local/solr-cloud/zookeeper01/data
# 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.
#自定义数据存放位置
dataDir=/usr/local/solr-cloud/zookeeper01/data
#自定义数据日志存放位置
dataLogDir=/usr/local/solr-cloud/zookeeper01/log
# the port at which the clients will connect
#Zookeeper监听的端口
clientPort=2181
#Zookeeper集群配置
server.1=localhost:2881:3881
server.2=localhost:2882:3882
server.3=localhost:2883:3883
其他二个zookeeper配置为,修改dataDir、dataLogDir的路径还有 clientPort端口号
- zookeeper01 port:2181
- zookeeper02 port:2182
# 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. #自定义数据存放位置 dataDir=/usr/local/solr-cloud/zookeeper02/data #自定义数据日志存放位置 dataLogDir=/usr/local/solr-cloud/zookeeper02/log # the port at which the clients will connect #Zookeeper监听的端口 clientPort=2182 #Zookeeper集群配置 server.1=localhost:2881:3881 server.2=localhost:2882:3882 server.3=localhost:2883:3883
- zookeeper03 port:2183
# 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. #自定义数据存放位置 dataDir=/usr/local/solr-cloud/zookeeper03/data #自定义数据日志存放位置 dataLogDir=/usr/local/solr-cloud/zookeeper03/log # the port at which the clients will connect #Zookeeper监听的端口 clientPort=2183 #Zookeeper集群配置 server.1=localhost:2881:3881 server.2=localhost:2882:3882 server.3=localhost:2883:3883
ok,zookeeper的端口号和data路径修改好了
接下来配置 data 目录下面的内容
- 进入data目录下面
cd zookeeper01/data/
- 删除所有的文件,data下面有文件是因为,我从源文件拷贝过来的时候是启动的
rm -rf *
- 在data目录下面新建一个文件名为 myid,区分当前的zookeeper,值为1
echo 1 >>myid
同理在其他两个zookeeper也这么配置,步骤如下
1.5 将 solrhome 和 zookeeper 关联指定 ip、端口号
进入到 /usr/local/solr-cloud/tomcat01/bin 下面,修改 catalina.sh 文件
先查看本机的ip地址:ip:114.116.24.32
添加这样一句话
JAVA_OPTS="-DzkHost=114.116.24.32:2181,114.116.24.32:2182,114.116.24.32:2183"
打开 catalina.sh 文件,加入上面一句话,每一个tomcat都要加上。
配置完成,关闭。
1.6 配置 solrhome 的 solr.xml
修改路径为 /usr/local/solr-cloud/solrhome01 下面的 solr.xml
打开 solr.xml 原先的为
修改之后为
以此修改其他三个solrhome
- solrhome01 ——> ip:114.116.24.32 port:8081
- solrhome02 ——> ip:114.116.24.32 port:8082
- solrhome03 ——> ip:114.116.24.32 port:8083
- solrhome04 ——> ip:114.116.24.32 port:8084
OK,此时配置快完成了,但是项目还启动不了。下面再说
1.7 编写 sh 文件,分别启动、停止所有的 zookeeper 和 tomcat
- vim startAllTomcat.sh 启动全部 tomcat
cd tomcat01/bin/ ./startup.sh cd ../.. cd tomcat02/bin/ ./startup.sh cd ../.. cd tomcat03/bin/ ./startup.sh cd ../.. cd tomcat04/bin/ ./startup.sh cd ../..
- vim stopAllTomcat.sh 停止全部 tomcat
cd tomcat01/bin/ ./shutdown.sh cd ../.. cd tomcat02/bin/ ./shutdown.sh cd ../.. cd tomcat03/bin/ ./shutdown.sh cd ../.. cd tomcat04/bin/ ./shutdown.sh cd ../..
- vim startAllZK.sh 启动全部 zookeeper
cd zookeeper01/bin/ ./zkServer.sh start cd ../.. cd zookeeper02/bin/ ./zkServer.sh start cd ../.. cd zookeeper03/bin/ ./zkServer.sh start cd ../..
- vim stopAllZK.sh 停止全部zookeeper
cd zookeeper01/bin/ ./zkServer.sh stop cd ../.. cd zookeeper02/bin/ ./zkServer.sh stop cd ../.. cd zookeeper03/bin/ ./zkServer.sh stop cd ../..
保存退出。
1.8 启动所有的 zookeeper
发现我新建的 sh 文件,启动没有权限,赋个权限
chmod u+x startAll*
chmod u+x stopAll*
u+x给当前用户赋权限
赋完权限颜色就不一样了,再试一下。
./startAllZK.sh
ps -ef | grep zookeep
ok,所有zookeeper全部启动完成。
1.9 启动所有的 tomcat
因为启动时间根据linux的配置有块有慢,在启动前,xshel再打开四个新窗口,查看tomcat启动日志
分别输入命令
- tomcat01——>tail -f /usr/local/solr-cloud/tomcat01/logs/catalina.out
- tomcat02——>tail -f /usr/local/solr-cloud/tomcat02/logs/catalina.out
- tomcat03——>tail -f /usr/local/solr-cloud/tomcat03/logs/catalina.out
- tomcat04——>tail -f /usr/local/solr-cloud/tomcat04/logs/catalina.out
在主窗口启动
./startAllTomcat.sh
后边四个窗口都有变化
报错
Caused by: org.apache.solr.common.SolrException: No coreNodeName for CoreDescriptor[name=collection_1;instanceDir=/usr/local/solr-cloud/solrhome01/collection_1]
缺少 coreNodeName 这个属性,
问题找到了,关闭所有的tomcat
进入到 solrhome01/collection_1/下面,修改 core.properties
添加一行内容,修改之后为
name=collection_1
coreNodeName=c1
其他几个以此修改,并且 coreNodeName 不能重复
- solrhome01
name=collection_1 coreNodeName=c1
- solrhome02
name=collection_1 coreNodeName=c2
- solrhome03
name=collection_1 coreNodeName=c3
- solrhome04
name=collection_1 coreNodeName=c4
再次启动
还是有个错误,少了 shard 属性
Caused by: org.apache.solr.common.SolrException: No shard id for CoreDescriptor[name=collection_1;instanceDir=/usr/local/solr-cloud/solrhome01/collection_1]
按照上面方式加上一个属性,分别加上
- shard=s1
- shard=s2
- shard=s3
- shard=s4
重新启动。
发现还是有错,
Caused by: org.apache.solr.common.SolrException: Replica c1 is not present in cluster state: null
这个错误我们不需要处理,跳过
启动完成,查看日志,
- tomcat01
- tomcat02
- tomcat03
- tomcat04
ok,但是现在所有的solrhome配置都一样,这个处于无人管理
1.10 将Solr集群交给Zookeeper监控中心进行管理
注意,此脚本必须执行,否则启动不了
步骤一:
./zkcli.sh -zkhost 114.116.24.32:2181,114.116.24.32:2182,114.116.24.32:2183 -cmd upconfig -confdir /usr/local/solr-cloud/solrhome01/collection_1/conf/ -confname myconf
其中 /usr/local/solr-cloud/solrhome01/collection_1/conf/ 为 solrhome01的配置下面的conf,其他几个solrhome的不用管了
上传之后,测试有没有上传成功。
进入到zookeeper01/bin/下面,使用命令
./zkCli.sh
运行后,里面会出现一大堆内容,如果你不指定参数,他会默认访问localhost:2181,进行查看
有myconf这个参数,name我们上传就是成功的了,使用quit退出
1.11 对 solr 进行集群分片处理
在浏览器输入地址进行集群分片管理:
注意:numShards是分成2个切片,replicationFactor是每个切片下面有2台tomcat,分别为一主一从
numShards + replicationFactor < 启动的tomcat机器数量(4台)
浏览器输入完成等一会显示
访问任意一个tomcat,如图,出现;两个切片,两个tomcat分别为一主一从集群
左侧选择collections,可以看到我们的collection名称是collection2,myconf 是 configName 交给zookeeper监管的
ok,集群全部搭建完毕。
1.12 测试各个集群之间的联系
在 tomcat01 里面添加,在其他里面是否存在测试。
{"id":1,"title_ik":"这段话是中文分词器拆分测试语句"}
去其他 tomcat 下面的 collection2 查询结果
可以在其他 tomcat 查到添加的数据,ok,至此,Solr+Zookeeper+Tomcat搭建的Solr集群完毕!!!
Java代码里面使用集群连接
单机配置参考:https://blog.csdn.net/qq_35618489/article/details/87185904
前提保证tomcat集群启动起来,三个Zookeeper也需要启动起来。
测试代码:
/**
* 连接Solr集群服务
*
* @throws IOException
* @throws SolrServerException
*/
@Test
public void testSoloCloud() throws IOException, SolrServerException {
//集群获取连接资源
CloudSolrClient solrClient = new CloudSolrClient.Builder().withZkHost("114.116.24.32:2181,114.116.24.32:2182,114.116.24.32:2183").build();
System.out.println(solrClient);
//设置条件
SolrQuery solrQuery = new SolrQuery();
/**
* 这句话要设置,否则报错,没有选择collection
*/
solrClient.setDefaultCollection("collection2");
solrQuery.setQuery("*:*");
//查询返回的对象
QueryResponse response = solrClient.query(solrQuery);
//查询返回的集合
SolrDocumentList results = response.getResults();
for (SolrDocument document : results) {
Object id = document.get("id");
Object title_ik = document.get("title_ik");
System.out.println("id:" + id + ",title_ik:" + title_ik);
}
solrClient.close();
}
其中,114.116.24.32:2181,114.116.24.32:2182,114.116.24.32:2183 是交给zookeeper的地址,
./zkcli.sh -zkhost 114.116.24.32:2181,114.116.24.32:2182,114.116.24.32:2183 -cmd upconfig -confdir /usr/local/solr-cloud/solrhome01/collection_1/conf/ -confname myconf
测试结果为:
java测试也完成了。
ok,配置加测试全部完成了。