[Solr] Apache Solr 集群

前言

SolrCloud是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。

SolrCloud需要Solr基于Zookeeper部署,Zookeeper是一个集群管理软件,由于SolrCloud需要由多台服务器组成,由zookeeper来进行协调管理。

注 : 由于本文中涉及到了Solr的单机部署及ZK集群的搭建,请参照本人之前写好的几篇文章,这里不再过多介绍。

Zookeeper集群的搭建

Apache Solr 简介及使用


环境准备

  1. Linux (三台)
  2. solr
  3. zookeeper-3.4.9.tar.gz

Solr 单节点部署

将我们在上文中(Apache Solr 简介及使用)部署好的 apache-tomcat-7.0.77(webapps已经内置solr) 与 solr_home (索引库) 打包成solr.zip,将solr.zip上传到Linux服务器中的任意一台即可。

#解压zip包时需要使用unzip,如果没有安装可以执行以下命令
yum -y install unzip

1> 安装solr

unzip solr.zip 
mv solr /usr/

2> 修改tomcat中的solr索引库位置

cd /usr/solr/apache-tomcat-7.0.77/webapps/solr/WEB-INF/
vim web.xml

<env-entry>
    <env-entry-name>solr/home</env-entry-name>
    <env-entry-value>/usr/solr/solr-home</env-entry-value>
    <env-entry-type>java.lang.String</env-entry-type>
</env-entry>

3> 启动tomcat

注: 要给tomcat/bin里所有脚本可执行权限

cd /usr/solr/apache-tomcat-7.0.77/bin/
chmod 777 *
./startup.sh

4> 访问solr -> http://Hadoop1:8080/solr/

看到如下页面说明访问成功。
1

成功后务必将tomcat关掉,才能进行下面的集群搭建!!!

成功后务必将tomcat关掉,才能进行下面的集群搭建!!!

成功后务必将tomcat关掉,才能进行下面的集群搭建!!!

./shutdown.sh 

5> 由于我们在上文中配置了多个索引库,现在我们要删除其他的索引库,还原原始状态

cd /usr/solr/solr-home
//删除多余的索引库,只保留一个collection1即可
rm -rf collection2
//删除collection1索引库中产生的data
cd /usr/solr/solr-home/collection1
rm -rf data

Solr 集群

1> 我们需要将上文中准备好的 solr-4.10.2.zip 上传到服务器

#解压
unzip solr-4.10.2.zip

#将solr安装包复制到/usr/solr/下
mv solr-4.10.2  /usr/solr/

2> 下面是将solr托管给zookeeper,执行的是zkcli.sh命令
这个命令在solr安装包solr-4.10.2/example/scripts/cloud-scripts文件夹里

#开始执行上传
cd  /usr/solr/solr-4.10.2/example/scripts/cloud-scripts

//注意: 以下命令是一行
./zkcli.sh -zkhost Hadoop1:2181,Hadoop2:2181,Hadoop3:2181 -cmd upconfig -confdir /usr/solr/solr-home/collection1/conf -confname solrconf

注意要修改上面的host地址,-confdir指的是索引库conf文件夹的地址
-confdir实际上是要将两个重要文件托管给zk管理 : schema.xml,solrconfig.xml

当执行完以上的命令之后,如果看到类似下图样子,说明执行成功

1

以下命令主要用于查看zookeeper中是否存在solr的配置文件: 可以不执行跳过

cd cd /usr/zookeeper/zookeeper-3.4.9/bin/
./zkCli.sh
ls /configs/solrconf

1

3> 修改索引库solr-home中的solr.xml

cd /usr/solr/solr-home
vim solr.xml

1

4> 修改tomcat的Catalina.sh配置文件

cd /usr/solr/apache-tomcat-7.0.77/bin
vim catalina.sh
//添加如下内容  注意: 这是一行内容, 复制时一起复制即可
export "JAVA_OPTS=-DzkHost=Hadoop1:2181,Hadoop2:2181,Hadoop3:2181"

5> 将solr目录发送到其他两台linux上,首先看一下/usr/solr下的内容

1

cd /usr
# 将整个solr目录发送到其他服务器
scp -r solr root@Hadoop2:$PWD
scp -r solr root@Hadoop3:$PWD

6> 分别启动三台机器的tomcat

cd /usr/solr/apache-tomcat-7.0.77/bin/
./startup.sh

此时我们就可以访问solr集群了 http://hadoop1:8080/solr

我们发现访问时多了一个新服务 Cloud,Cloud代表的是当前集群节点状态

1

此时,我们的solr集群就启动成功了

SolrCloud管理命令

1> 创建新集群(创建一个索引库)

#注意:这是一行Http请求,空间问题,分成了三行
http://Hadoop1:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2
&replicationFactor=2&maxShardsPerNode=8&property.schema=schema.xml
&property.config=solrconfig.xml


接口参数说明:
action: 表示执行的操作 CREATE 创建
name: 新集群的名称
numShards: 分片数
replicationFactor: 每个分片的节点数
maxShardsPerNode: 设置每个分片的最大节点数, 默认为1
property.schema: 指定使用的schema文件   (注意, 此文件必须在zookeeper上存在)
property.config: 指定使用的solrConfig文件 (注意, 此文件必须在zookeeper上存在)

当我们访问完此http请求后,会返回如下信息,说明创建新索引库成功

1

重新查看solr管理界面的Cloud信息

1

2> 删除Core索引库

http://Hadoop1:8080/solr/admin/collections?action=DELETE&name=collection1

与上面创建时一样,返回success时说明删除成功,发现只有collection2了

1

3> 查询所有Core

http://Hadoop1:8080/solr/admin/collections?action=LIST

4> 分裂shard

分裂: 就是将某个分片分成两个分片
注: 一旦分裂后, 虽然原来的分片还可以提供服务, 但是已经不再保存数据, 会将数据保存到新的分裂后的分片

#注意:这是一行Http请求,空间问题,分成了两行
http://Hadoop1:8080/solr/admin/collections?
action=SPLITSHARD&collection=collection2&shard=shard1

参数说明:
shard: 指定要分裂的分片

1

5> 删除某个分片

注: 删除的分片必须是已经被分裂的, 或者是已经无法提供服务的

#注意:这是一行Http请求,空间问题,分成了两行
http://Hadoop1:8080/solr/admin/collections?
action=DELETESHARD&shard=shard1&collection=collection2

删除之后就没有collection2中的shard1了

1

Solr Cloud 在Java中的使用

导入相关的pom依赖

  <dependencies>
        <dependency>
            <groupId>org.apache.solr</groupId>
            <artifactId>solr-solrj</artifactId>
            <version>4.10.2</version>
        </dependency>
         <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging-api</artifactId>
            <version>1.1</version>
        </dependency>
    </dependencies>

1> 创建索引

    @Test
    public void createIndexToSolrCloud() throws IOException, SolrServerException {
        //1. 创建连接solrCloud的服务对象
        //String zkHost: 需要传递zookeeper集群的地址
        String zkHost="Hadoop1:2181,Hadoop2:2181,Hadoop3:2181";
        CloudSolrServer cloudSolrServer = new CloudSolrServer(zkHost);
        //1.1 设置连接那个solr的索引库
        cloudSolrServer.setDefaultCollection("collection2");
        //1.2 可选的参数
        //设置连接zookeeper的时间
        cloudSolrServer.setZkClientTimeout(5000);
        //设置获取和solr的连接的时间
        cloudSolrServer.setZkConnectTimeout(5000);
        //3. 执行获取连接
        cloudSolrServer.connect();

        //4. 添加索引操作
        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id","1");
        doc.addField("title","你好,solrCloud");
        cloudSolrServer.add(doc);

        //5. 执行提交
        cloudSolrServer.commit();
    }

2> 删除索引

    //删除索引
    @Test
    public void deleteIndexToSolrCloud() throws IOException, SolrServerException {
        //1. 创建连接solrCloud的服务对象
        //String zkHost: 需要传递zookeeper集群的地址
        String zkHost="Hadoop1:2181,Hadoop2:2181,Hadoop3:2181";
        CloudSolrServer cloudSolrServer = new CloudSolrServer(zkHost);
        //1.1 设置连接那个solr的索引库
        cloudSolrServer.setDefaultCollection("collection2");
        //1.2 可选的参数
        //设置连接zookeeper的时间
        cloudSolrServer.setZkClientTimeout(5000);
        //设置获取和solr的连接的时间
        cloudSolrServer.setZkConnectTimeout(5000);
        //3. 执行获取连接
        cloudSolrServer.connect();

        //4. 添加索引操作
        cloudSolrServer.deleteById("1");
        //5. 执行提交
        cloudSolrServer.commit();

    }

3> 查询索引

    //查询索引
    @Test
    public void queryIndexToSolrCloud() throws IOException, SolrServerException {
        //1. 创建连接solrCloud的服务对象
        //String zkHost: 需要传递zookeeper集群的地址
        String zkHost="Hadoop1:2181,Hadoop2:2181,Hadoop3:2181";
        CloudSolrServer cloudSolrServer = new CloudSolrServer(zkHost);
        //1.1 设置连接那个solr的索引库
        cloudSolrServer.setDefaultCollection("collection2");
        //1.2 可选的参数
        //设置连接zookeeper的时间
        cloudSolrServer.setZkClientTimeout(5000);
        //设置获取和solr的连接的时间
        cloudSolrServer.setZkConnectTimeout(5000);
        //3. 执行获取连接
        cloudSolrServer.connect();

        //4. 添加索引操作
        SolrQuery query = new SolrQuery("*:*");
        QueryResponse response = cloudSolrServer.query(query);

        SolrDocumentList documentList = response.getResults();
        for (SolrDocument doc : documentList) {
            Object id = doc.get("id");
            Object title = doc.get("title");
            System.out.println(id+"  "+title);
        }

    }

至此,Solr 的集群就介绍完了~

猜你喜欢

转载自blog.csdn.net/Konaji/article/details/81514385