solrCloud 单机多节点部署(zookeeper3.4.6+solr4.10.4+tomcat7.0.61)

本套方案是在linux单主机上部署多个solr节点,最终达到solrCloud的效果。先展示下solrCloud单机部署的效果:

image

在solrCloud上已经创建了两个collection。

接下来就说说这个部署过程:

首先创建一个solrcloud目录,用于存放solrCloud所有相关的软件和配置。

1.下载安装zookeeper

按理来说需要多节点部署zookeeper,由于这个工作比较简单,需要的可以从网络上的其他地方搜索部署。本次使用单节点zookeeper,测试使用环境足以。当下载解压zookeeper之后,进入zookeeper目录,执行以下指令:

./bin/zkServer.sh start

所有的zookeeper日志都会存储到./bin/zookeeper.out中

2.下载配置solr-4.10.4和tomcat7.0.61

都解压完毕之后:

将solr-4.10.4/example/webapps/solr.war再解压到tomcat/webapps/solr目录下

unzip solr-4.10.4/example/webapps/solr.war tomcat/webapps/solr

将log4j配置文件和jar包拷贝到tomcat下

cp solr-4.10.4/example/lib/ext/* tomcat/webapps/solr/WEB-INF/lib/
mkdir -p tomcat/webapps/solr/WEB-INF/classes/
cp solr-4.10.4/example/resources/log4j.properties tomcat/webapps/solr/WEB-INF/classes

将配置文件上传到zookeeper中,用于集群共享配置:主要就是solrConfig.xml和schema.xml这两个文件。

上传需要用到solr自带的zookeeper工具包,将这些工具复制到自己的工具文件中。

cp -r  solrcloud/tomcat/webapps/solr/WEB-INF/lib/* solrcloud/solr-lib

我们需要用到的其实就是org.apache.solr.cloud.ZkCLI这个类

将需要上传的配置文件也单独存到solrcloud目录下

cp -r solrcloud/solr-4.10.4/example/solr/collection1/conf/*  solrcloud/config-files

将这些配置文件上传到zookeeper

java -classpath solrcloud/solr-lib/* org.apache.solr.cloud.ZkCLI -cmd upconfig -zkhost 172.20.5.161:2181 -confdir solrcloud/config-files/ -confname solrconf

可以使用zookeeper自带的客户端查看下zookeeper上的数据

zookeeper-3.4.6/bin/zkCli.sh -server 172.20.5.161:2181

可以看到solr集群配置数据已经存在

image

将zookeeper上的solrconf配置文件关联到zookeeper的collection目录

java -classpath solrcloud/solr-lib/* org.apache.solr.cloud.ZkCLI -cmd linkconfig -collection mycollection -confname solrconf -zkhost 172.20.5.161:2181
以上步骤已经将配置文件部署完毕
接下去需要配置tomcat中的solr了:
将solrcloud目录下创建index1目录,作为索引存放处。在index1目录下创建solr.xml文件,作为节点1的配置。solrcloud/index1/solr.xml的内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<solr persistent="true">
  <cores host="172.20.5.161" adminPath="/admin/cores" zkClientTimeout="${zkClientTimeout:15000}" hostPort="8080" hostContext="${hostContext:solr}">
</solr>

*这里的hostPort需要和tomcat对外的端口地址一致

将这个文件的位置写入到tomcat的solr应用中。

tomcat/webapps/solr/WEB-INF/web.xml文件中找到env-entry标签,启用它,配置如下:

<!--
    <env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>/put/your/solr/home/here</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>
   -->
    <env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>/home/clare/soft/solr/index1</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>

将env-entry-value替换为你index1所在目录就可以。

现在可以准备运行了,运行前先将tomcat启动参数配置下,tomcat/bin/catalina.sh:

*注意是脚本第一行,不是最后一行

#!/bin/sh
export JAVA_OPTS="-DzkHost=172.20.5.161:2181"

第一个节点就此配置完毕,等待启动。

===============================

接下来配置第二和第三节点:

复制tomcat目录两份到当前目录,命名为tomcat-2和tomcat-3

复制index1目录两份到当前目录,命名为index2和index3

这样下来,你的目录应该是如下

image

首先修改tomcat2/conf/server.xml文件

需要修改的部分为将所有的port的数值+1,使其与tomcat第一个节点不一致。同理第三个节点也是如此修改。

然后修改tomcat2/webapps/solr/WEB-INF/web.xml

将env-entry-value的值替换为index2的路径

最后修改index2中的solr.xml文件

将这里的hostPort改为tomcat2中的conf/server.xml文件的connector port一致

<Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8444" />

开始启动三个节点:

在每个tomcat目录下执行bin/catalina.sh start指令。

然后在浏览器输入机器ip:port/solr就可以看到控制面板了

这时cloud目录下没有数据,需要创建一个collection

在浏览器中地址栏输入创建指令,可以知道创建索引成功:

http://172.20.5.161:8080/solr/admin/collections?action=CREATE&name=secondIndex&numShards=3&replicationFactor=1

image

然后在控制面板中可以看到新创建的索引了:

image

接下来需要往solrcloud传点数据:

切到目录/solr-4.10.4/example/exampledocs下,执行以下指令,会将一些例子文档全部传到solrcloud创建索引

java -Durl=http://172.20.5.161:8080/solr/secondIndex/update -jar post.jar ./*

然后在控制面板中进行搜索测试:

image

这样整套solrCloud就基本搭建成功了。

再来试下java sdk:

写了一个solrCloudHelper.java进行测试:

import java.io.IOException;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrResponse;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.clare.exception.SolrCloudAddDocException;
import com.clare.exception.SolrCloudSearchException;

public class SolrCloudHelper {
    private final static Logger logger = LoggerFactory
            .getLogger(SolrCloudHelper.class);
    private final static String zkHostString = "172.20.5.161:2181";// 这里不能用localhost,要与config文件中一致
    private CloudSolrServer server = null;

    public  SolrCloudHelper() {
        server = new CloudSolrServer(zkHostString);
        server.setDefaultCollection("secondIndex");
        server.connect();
    }

    public CloudSolrServer getServer() {
        return server;
    }

    public void addDoc(SolrInputDocument doc) throws SolrCloudAddDocException {
        try {
            server.add(doc);
        } catch (Exception e) {
            throw new SolrCloudAddDocException(e);
        }
    }

    public SolrResponse search(SolrQuery query) throws SolrCloudSearchException {
        try {
            return server.query(query);
        } catch (SolrServerException e) {
            throw new SolrCloudSearchException(e);
        }
    }

    public void addDoc() throws SolrServerException, IOException {
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id", "1234");
        doc.addField("name", "A lovely summer holiday dong dong");
        server.add(doc);
        server.commit();
    }

    public void docSearch() throws SolrServerException {
        SolrQuery solrQuery = new SolrQuery();
        solrQuery.set("q", "holiday dong");
        QueryResponse response = server.query(solrQuery);
        SolrDocumentList list = response.getResults();
        System.out.println("hit doc number: " + list.getNumFound());
        for (SolrDocument doc : list) {
            System.out.println(doc.get("id") + "--->"
                    + (String) doc.get("name"));
        }

    }
    public static void main(String[] args) {
        SolrCloudHelper helper = new SolrCloudHelper();
        try {
            helper.addDoc();
            helper.docSearch();
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

先执行addDoc(),

然后再执行doCSearch():

image

至此,solrCloud的测试到此为止,运行原理之后会奉上。

转载于:https://www.cnblogs.com/clarechen/p/4573290.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值