Solr+Zookeeper+Tomcat搭建Solr集群服务

之前一篇文章有说如何搭建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 进行集群分片处理

在浏览器输入地址进行集群分片管理:

http://114.116.24.32:8081/solr/admin/collections?action=CREATE&name=collection2&numShards=3&replicationFactor=2

注意: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,配置加测试全部完成了。

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值