ZooKeeper 搭建 solr 集群

什么是 ZooKeeper ?

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。

ZooKeeper 功能

  • 集群管理 主从的管理、负载均衡、高可用的管理。集群的入口。Zookeeper必须是集群才能保证高可用。Zookeeper有选举和投票的机制。集群中至少应该有三个节点。

  • 配置文件集中管理 搭建solr集群时,需要把Solr的配置文件上传zookeeper,让zookeeper统一管理。每个节点都到zookeeper上取配置文件。

集群配置

  • zookeeper 3 台
  • solr 4 台

集群搭建

搭建 zookeeper 集群

  • 下载 ZooKeeper

  • 上传 ZooKeeper 到服务器(sftp 或 lrzsz 工具)

  • 将 ZooKeeper 解压

  • 把 zookeeper 向 /usr/local/solr-cloud 下复制三份,分别命名为 zookeeper01、zookeeper02、zookeeper03。

  • 配置 zookeeper。

    • 在 zookeeper01 目录下创建一个 data 文件夹

    • 在 data 目录下创建一个 myid 文件

    • myid 的内容 为 1。(02 对应 “2”,03 对应 “3”)。

    • zookeeper02、03 以此类推。

    • 进入 conf ,将 zoo_sample.cfg 更名为 zoo.cfg。

    • 修改 zoo.cfg

      • 将 dataDir= 指定为刚创建的文件夹。
      • clientPort 指定为不冲突的端口号(01:2181,02:2182,03:2183)
      • 添加如下内容:
        server.1=192.168.126.128: 2881:3881
        server.2=192.168.126.128: 2882:3882
        server.3=192.168.126.128: 2883:3883
        复制代码

  • 启动 zookeeper 使用 zookeeper 目录中 bin 目录下的 zkServer.sh,分别启动三个 zookeeper。 启动: ./zkServer.sh start 停止:./zkServer.sh stop 查看状态 ./zkServer.sh status

搭建 solr 集群

  • 安装4个 tomcat,编辑 server.xml,修改端口 8081-8084。

  • 向 tomcat 部署 solr。(细节可参考之前的博客)

  • 为每一个 solr 实例创建 solrhome。

  • 编辑 web.xml ,将每个 solr 实例和对应的 solrhome 关联

  <env-entry>
      <env-entry-name>solr/home</env-entry-name>
      <env-entry-value>/usr/local/solr-cloud/solrhome1</env-entry-value>
      <env-entry-type>java.lang.String</env-entry-type>
   </env-entry>
复制代码
  • 编辑每个 solrhome 下 solr.xml,指定对应 host 和 port
  <solrcloud>
    <str name="host">${host:192.168.126.128}</str>
    <int name="hostPort">${jetty.port:8081}</int>
    <str name="hostContext">${hostContext:solr}</str>
    <int name="zkClientTimeout">${zkClientTimeout:30000}</int>
    <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
  </solrcloud>
复制代码
  • 上传配置文件到 zookeeper. 需要使用/root/solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh命令上传配置文件。(其他 solrhome 的配置文件也可以。)
./zkcli.sh -zkhost 192.168.126.128:2181,192.168.126.128:2182,192.168.126.128:2183 -cmd upconfig -confdir /usr/local/solr-cloud/solrhome1/collection1/conf -confname myconf
复制代码
  • 查看是否上传成功 使用 zookeeper bin 目录下的 zkCli.sh 命令。
./zkCli.sh #即可连接上 zookeeper 集群
复制代码

然后就可以查看集群上文件

  • 告诉 solr 实例 zookeeper 的位置。需要编辑 tomcat catalina.sh,添加:
JAVA_OPTS="-DzkHost=192.168.126.128:2181,192.168.126.128:2182,192.168.126.128:2183"
复制代码

每个节点都要添加。

  • 分别启动每个 solr 实例

  • 集群分片 将集群分为两片,每片两个副本。在浏览器地址栏访问:

http://192.168.126.128:8081/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
复制代码

得到如下结果,则分片成功。

刷新 solr cloud 页面。

  • 删除不用的 collection1.
http://192.168.126.128:8081/solr/admin/collections?action=DELETE&name=collection1
复制代码

使用 Solrj 连接集群

@Test
	public void testSolrClout() throws Exception {
		//创建一个SolrServer对象
		CloudSolrServer solrServer = new CloudSolrServer("192.168.126.128:2181,192.168.126.128:2182,192.168.126.128:2183");
		//设置默认的collection
		solrServer.setDefaultCollection("collection2");
		//创建一个文档对象
		SolrInputDocument document = new SolrInputDocument();
		document.addField("id", "test01");
		document.addField("item_title", "title1");
		//添加文档
		solrServer.add(document);
		//提交
		solrServer.commit();
	}
复制代码

Spring 中切换到集群

<bean id ="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
	<constructor-arg name="zkHost" value="192.168.126.128:2181,192.168.126.128:2182,192.168.126.128:2183"/>
	<property name="defaultCollection" value="collection2"/>
</bean>
复制代码

猜你喜欢

转载自juejin.im/post/5b5834cff265da0f990d5fc7
今日推荐