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

来源:互联网 发布:dnf赌马知乎 编辑:程序博客网 时间:2024/06/06 10:52
结合上次搭建项目和配置安全控制的经验,工程的搭建过程应该如下:
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 建立集合
http://192.168.119.20:8001/solr/admin/collections?action=CREATE&name=meixin_suggest&numShards=1&replicationFactor=2&collection.configName=meixin_suggest
删除集合:
http://192.168.119.20:8001/solr/admin/collections?action=delete&name=meixin_suggest

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

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


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

最后设置环境变量时候,别把系统其他的环境变量清空了.第二个错误就可以避免



































1 0