本套方案是在linux单主机上部署多个solr节点,最终达到solrCloud的效果。先展示下solrCloud单机部署的效果:
在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集群配置数据已经存在
将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
这样下来,你的目录应该是如下
首先修改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
然后在控制面板中可以看到新创建的索引了:
接下来需要往solrcloud传点数据:
切到目录/solr-4.10.4/example/exampledocs下,执行以下指令,会将一些例子文档全部传到solrcloud创建索引
java -Durl=http://172.20.5.161:8080/solr/secondIndex/update -jar post.jar ./*
然后在控制面板中进行搜索测试:
这样整套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():
至此,solrCloud的测试到此为止,运行原理之后会奉上。