码迷,mamicode.com
首页 > 其他好文 > 详细

solr入门之搭建具有安全控制和权限管理功能的SolrCloud集群

时间:2016-05-18 19:53:31      阅读:531      评论:0      收藏:0      [点我收藏+]

标签:

结合上次搭建项目和配置安全控制的经验,工程的搭建过程应该如下:
1.搭建zookeeper集群
2.配置solr的jetty启动配置
3.在solr启动配置中增加zk的acl配置信息
4.使用solr配置,启动solrcloud集群将 集群交给zookeeper管理
5.上传相关的配置文件,创建集合
6.上传安全配置文件
7.登录admin界面,查看集群状态及能否访问到zookeeper上的文件
8.添加数据到solrcloud中

9.配置客户端,使用solrj来操作solrcloud(摸索阶段)

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

1.配置zookeeper集群
  1.1上传压缩包到liunx中,解压后进入根目录
    压缩包地址:
    链接:http://pan.baidu.com/s/1geOTZeN 密码:5bh8
    创建一个data文件夹
    mkdir data
    进入data中  
    cd  data
    vim myid
    输入 1
    进入conf目录下
    mv  zoo_sample.cfg  zoo.cfg  
    编辑zoo.cfg 内容修改如下
   我这里只用了两个节点,按官方推荐应该使用2n+1比较好
  同理配置另外一个节点后:
  启动zookeeper
 zookeeper/bin/zkServer.sh start 
 两个节点都启动后查看集群状态
 zookeeper/bin/zkServer.sh status
技术分享

   我这里只用了两个节点,按官方推荐应该使用2n+1比较好
  同理配置另外一个节点后:
  启动zookeeper
 zookeeper/bin/zkServer.sh start 
 两个节点都启动后查看集群状态
 zookeeper/bin/zkServer.sh status

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

2.配置jetty的启动文件.
 2.1 先将solr5.5的项目上传到liunx中,解压:
 文件地址:
链接:http://pan.baidu.com/s/1eRQrVfs 密码:rzvu
2.2 将我提供的启动配置信息上传到liunx中
链接:http://pan.baidu.com/s/1nvhE9Hv 密码:yef8
大致目录节后如下
技术分享

2.3修改solr_8001中的配置信息为符合自己的
(data目录下缺少一个solr.xml文件
cp /root/solr/solr/server/solr/solr.xml  /root/solr/solr_8001/data/
找到类似目录下复制过去即可)

vim solr.in.sh 
我修改后配置信息如下

技术分享

在修改bin下的solr.sh
vim bin/solr.sh
我修改后如下

技术分享

将修改后的文件复制到另外一个节点上:
scp  -----------
=================

3.在solr启动配置中增加zk的acl配置信息
3.1在solr_8001/data中的solr.xml中增加如下内容

技术分享


3.2 在solr_8001/solr.in.sh中底部增加如下内容:

技术分享


这里是设置了一个操作zookeeper的权限用户admin 密码也是admin

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


4.上传相关的配置文件,创建集合(使用自定义的方式)
4.1上传配置文件,这是我写的配置文件的脚本,可以参考
技术分享

4.2自定义集合方式,创建集合
cd /root/solr/solr_8001/data
分片库的文件夹
mkdir  gome_suggest 
编辑该分片的信息
vim  core.properties
技术分享

另外一个节点只需要讲core_node1变为core_node2即可
这里再说一下,启动的端口也是可以调整的,只需要改正一下 solr.in.sh中的端口信息即可

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

5.使用solr配置,启动solrcloud集群将 集群交给zookeeper管理
正常启动solr服务器(两个节点)
/root/solr/solr_8001/bin/solr.sh start
--->失败了 不知道啥原因--->
尝试使用api来建立以下
先关闭solr集群和和zookeeper集群将数据清理完毕,在打开zookeeper集群和solrcloud集群尝试使用
HTTP api 建立集合
删除集合:

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

6.上传安全配置文件(将原来的保存下来,再上传一遍)
使用如下脚本进行安全文件的上传操作:
java  -classpath ./:/root/solr/solr/server/solr-webapp/webapp/WEB-INF/lib/*  -DzkDigestUsername=admin -DzkDigest
Password=admin -DzkACLProvider=org.apache.solr.common.cloud.VMParamsAllAndReadonlyDigestZkACLProvider  -DzkCrede
ntialsProvider=org.apache.solr.common.cloud.VMParamsSingleSetCredentialsDigestZkCredentialsProvider   org.apache
.solr.cloud.ZkCLI -zkhost 192.168.119.20:2181,192.168.119.21:2181  -cmd  put  /security.json  ‘{"authentication"
:{"class":"solr.BasicAuthPlugin","blockUnknown":true,"credentials":{"root":"v1kx29vsv2JHda4iY+rqpNpHscwW29rH1z6rzI/6LVI= tL5DTOVBr1eRaW8u1Hyo5JluY8bMqkeQJ573pgLynDw="}},"authorization":{"class":"solr.RuleBasedAuthorizationPlugin"}}
设置的账户是 root 密码为 songqinghu
=============

7.给安全配置文件设置权限
---->刚刚开始就配置了zk的访问控制的话,是默认就创建了 安全配置文件的
而且 使用solr创建的文件都是有权限的

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

8.登录admin界面,查看集群状态及能否访问到zookeeper上的文件
可以访问zk上的文件内容,证明solr操作zk是有权限的.
技术分享


9.添加数据到solrcloud中
添加两条数据到数据库中,证明可以通过节点去操作
方便以后测试使用
技术分享


10.配置客户端,使用solrj来操作solrcloud(摸索阶段)

官方给的资料:


直接连接的尝试:
Caused by: org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /clusterstate.json
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:113)
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
    at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:1155)
    at org.apache.solr.common.cloud.SolrZkClient$7.execute(SolrZkClient.java:345)
    at org.apache.solr.common.cloud.SolrZkClient$7.execute(SolrZkClient.java:342)
    at org.apache.solr.common.cloud.ZkCmdExecutor.retryOperation(ZkCmdExecutor.java:60)
    at org.apache.solr.common.cloud.SolrZkClient.getData(SolrZkClient.java:342)
    at org.apache.solr.common.cloud.ZkStateReader.refreshLegacyClusterState(ZkStateReader.java:443)
    at org.apache.solr.common.cloud.ZkStateReader.createClusterStateWatchersAndUpdate(ZkStateReader.java:296)
    at org.apache.solr.client.solrj.impl.CloudSolrClient.connect(CloudSolrClient.java:467)
    ... 2 more

可以发现是没有权限的,我们模仿脚本中的参数设置,将相关数据添加到系统的属性中
       Properties p  = new Properties();
       p.setProperty("zkDigestUsername",  "admin");
       p.setProperty("zkDigestPassword", "admin");
       p.setProperty("zkCredentialsProvider", "org.apache.solr.common.cloud.VMParamsSingleSetCredentialsDigestZkCredentialsProvider");
       p.setProperty("zkACLProvider", "org.apache.solr.common.cloud.VMParamsAllAndReadonlyDigestZkACLProvider");
         System.setProperties(p);
      // System.out.println(System.getProperty("zkDigestUsername"));
        String zkUrl = "192.168.119.20:2181,192.168.119.21:2181";
        //ESystemDefaultHttpClient httpClient = new ESystemDefaultHttpClient(200, 2000);
        CloudSolrClient cloudSolrClient = new  CloudSolrClient(zkUrl);
        cloudSolrClient.setDefaultCollection("meixin_suggest");
        cloudSolrClient.connect();
        SolrQuery q  = new SolrQuery();
        q.set("q", "*:*");
        QueryRequest req = new QueryRequest(q);
        req.setBasicAuthCredentials("root", "songqinghu");
        QueryResponse response = req.process(cloudSolrClient);
        long numFound = response.getResults().getNumFound();
        System.out.println("the query numfound is :"+ numFound);
        cloudSolrClient.close();
运行再次报错:
xception in thread "main" java.lang.ExceptionInInitializerError
    at org.apache.solr.common.cloud.ZkClientConnectionStrategy.createSolrZooKeeper(ZkClientConnectionStrategy.java:103)
    at org.apache.solr.common.cloud.DefaultConnectionStrategy.connect(DefaultConnectionStrategy.java:37)
    at org.apache.solr.common.cloud.SolrZkClient.<init>(SolrZkClient.java:144)
    at org.apache.solr.common.cloud.SolrZkClient.<init>(SolrZkClient.java:115)
    at org.apache.solr.common.cloud.SolrZkClient.<init>(SolrZkClient.java:105)
    at org.apache.solr.common.cloud.ZkStateReader.<init>(ZkStateReader.java:201)
    at org.apache.solr.client.solrj.impl.CloudSolrClient.connect(CloudSolrClient.java:466)
    at com.git.solr.auth.SolrJAuthClient.client(SolrJAuthClient.java:45)
    at com.git.solr.auth.SolrJAuthClient.main(SolrJAuthClient.java:21)
Caused by: java.lang.NullPointerException
    at sun.nio.cs.ext.ExtendedCharsets.init(ExtendedCharsets.java:1300)
    at sun.nio.cs.AbstractCharsetProvider.charsetForName(AbstractCharsetProvider.java:160)
    at java.nio.charset.Charset.lookupExtendedCharset(Charset.java:455)
    at java.nio.charset.Charset.lookup2(Charset.java:480)
    at java.nio.charset.Charset.lookup(Charset.java:468)
    at java.nio.charset.Charset.isSupported(Charset.java:510)
    at java.lang.StringCoding.lookupCharset(StringCoding.java:99)
    at java.lang.StringCoding.decode(StringCoding.java:185)
    at java.lang.String.<init>(String.java:416)
    at java.lang.String.<init>(String.java:481)
    at java.net.Inet6AddressImpl.getLocalHostName(Native Method)
    at java.net.InetAddress.getLocalHost(InetAddress.java:1444)
    at org.apache.zookeeper.Environment.list(Environment.java:61)
    at org.apache.zookeeper.Environment.logEnv(Environment.java:98)
    at org.apache.zookeeper.ZooKeeper.<clinit>(ZooKeeper.java:95)
    ... 9 more

可以发现是创建solrclientzookeeper错误:
这里应该如何去解决呢?

连接节点应该类似于 solr服务器去连接zk,进行操作,既然solr可以连接,那么我这里应该也是没有问题的
仿照solr服务器去连接zk,进行操作.
搭建一个服务,设置系统变量到服务器中,
在服务器中直接运行项目
经过长达一天的试验,发现,确实是需要配置到服务器中,参数才会有作用

配置文件如下(window系统)tomcat中的catalina.bat

技术分享技术分享技术分享

使用的Java代码如下:

package com.mx.solr.zk.client.servlet.utils;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.CloudSolrClient;

public class SolrClientUitls {

    private static SolrClient client = null;
    public static SolrClient getClient(){
        if(client ==null){
            String zkUrl = "192.168.119.20:2181,192.168.119.21:2181";
            CloudSolrClient cloudSolrClient = new  CloudSolrClient(zkUrl);
            cloudSolrClient.setDefaultCollection("meixin_suggest");
            cloudSolrClient.connect();
            client = cloudSolrClient;
        }
        return client;
    }
}

package com.mx.solr.zk.client.servlet;

import java.io.IOException;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;

import com.mx.solr.zk.client.servlet.utils.SolrClientUitls;



/**
 * Servlet implementation class ClientServlet
 */
@WebServlet("/ClientServlet")
public class ClientServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public ClientServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            SolrClient client = SolrClientUitls.getClient();
            SolrQuery q  = new SolrQuery();
            q.set("q", "*:*");
            QueryRequest req = new QueryRequest(q);
            req.setBasicAuthCredentials("root", "songqinghu");
            QueryResponse res;
            try {
                res = req.process(client);
                long numFound = res.getResults().getNumFound();
                System.out.println("the query numfound is :"+ numFound);
                SolrDocumentList docs = res.getResults();
                for (SolrDocument doc : docs) {
                    System.out.println("suggestId :"+doc.getFieldValue("suggestId").toString());
                    System.out.println("word :"+doc.getFieldValue("word").toString());
                }
            } catch (SolrServerException e) {
                e.printStackTrace();
            }
           // cloudSolrClient.close();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}


运行结果如下:

技术分享

如果使用maven启动的话,只需要在下图的位置设置变量即可:

技术分享



到现在为止,一个具有安全控制功能的SolrCloud集合就搭建完成了,当然你在搭建的过程中可能会遇到很多问题,如果需要一起讨论,请加博主QQ群.

488252920





































solr入门之搭建具有安全控制和权限管理功能的SolrCloud集群

标签:

原文地址:http://blog.csdn.net/sqh201030412/article/details/51396427

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!