标签:
结合上次搭建项目和配置安全控制的经验,工程的搭建过程应该如下:
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中,解压后进入根目录
压缩包地址:
创建一个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中,解压:
文件地址:
2.2 将我提供的启动配置信息上传到liunx中
大致目录节后如下
2.3修改solr_8001中的配置信息为符合自己的
(data目录下缺少一个solr.xml文件
cp /root/solr/solr/server/solr/solr.xml /root/solr/solr_8001/data/
找到类似目录下复制过去即可)
我修改后配置信息如下
在修改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