需要实现的solr集群架构
Zookeeper作为集群的管理工具。
1、集群管理:容错、负载均衡。
2、配置文件的集中管理
3、集群的入口
需要实现zookeeper 高可用。需要搭建集群。建议是奇数节点。需要三个zookeeper服务器。
搭建solr集群需要7台服务器。
搭建伪分布式:
需要三个zookeeper节点
需要四个tomcat节点。
建议虚拟机的内容1G以上。
Zookeeper集群搭建
第一步:需要安装jdk环境。
第二步:把zookeeper的压缩包上传到服务器。
第三步:解压缩。
第四步:把zookeeper复制三份。
[root@localhost ~]# mkdir /usr/local/solr-cloud
[root@localhost ~]# cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper01
[root@localhost ~]# cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper02
[root@localhost ~]# cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper03
第五步:在每个zookeeper目录下创建一个data目录。
第六步:在data目录下创建一个myid文件,文件名就叫做“myid”。内容就是每个实例的id。
[root@123 zookeeper1]# mkdir data
[root@123 data]# touch myid
在文件中写数字1,其他服务器写其他的数字
[root@123 data]# vim myid
//也可以这样,把输出写到这个文件下面
[root@123 zookeeper2]# eacho 2 > data/myid
第七步:修改配置文件。把conf目录下的zoo_sample.cfg文件改名为zoo.cfg
1.在conf文件夹里面的zoo_sample.cfg 改成 zoo.cfg
- [root@123 conf]# cp -r zoo_sample.cfg zoo.cfg
- [root@123 conf]# rm -rf zoo_sample.cfg
2.zoo.cfg修改配置文件
//2881 节点通信的端口,3881 节点投票端口
server.1=192.168.25.154:2881:3881
server.2=192.168.25.154:2882:3882
server.3=192.168.25.154:2883:3883
其他的同上
第八步:启动每个zookeeper实例。
启动bin/zkServer.sh start
1.创建一个启动脚本
[root@123 solr-cloud]# vim start-all.sh
cd zookeeper1/bin
./zkServer.sh start
cd ../../
cd zookeeper2/bin
./zkServer.sh start
cd ../../
cd zookeeper3/bin
./zkServer.sh start
cd ../../
cd zookeeper1/bin
./zkServer.sh stop
cd ../../
cd zookeeper2/bin
./zkServer.sh stop
cd ../../
cd zookeeper3/bin
./zkServer.sh stop
cd ../../
2.修改权限
[root@123 solr-cloud]# chmod u+x start-all.sh
查看zookeeper的状态:
bin/zkServer.sh status
Solr集群的搭建
第一步:创建四个tomcat实例。每个tomcat运行在不同的端口。8180、8280、8380、8480
1.[root@123 solr-cloud]# vim tomcat1/conf/server.xml
2.修改所有的端口号
第二步:部署solr的war包。把单机版的solr工程复制到集群中的tomcat中。
第三步:为每个solr实例创建一个对应的solrhome。使用单机版的solrhome复制四份。
第四步:需要修改solr的web.xml文件。把solrhome关联起来。
[root@123 solr-cloud]# vim tomcat1/webapps/solr/WEB-INF/web.xml
第五步:配置solrCloud相关的配置。每个solrhome下都有一个solr.xml,把其中的tomcat ip及端口号配置好。
第六步:修改tomcat/bin目录下的catalina.sh 文件,关联solr和zookeeper。把此配置添加到配置文件中:
JAVA_OPTS="-DzkHost=192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"
第七步:让zookeeper统一管理配置文件。需要把solrhome/collection1/conf目录上传到zookeeper。上传任意solrhome中的配置文件即可。
使用工具上传配置文件:/root/solr-4.10.3/example/scripts/cloud-scripts/zkcli.sh
./zkcli.sh -zkhost 192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183 -cmd upconfig -confdir /usr/local/solr-cloud/solrhome01/collection1/conf -confname myconf
查看zookeeper上的配置文件:
使用zookeeper目录下的bin/zkCli.sh命令查看zookeeper上的配置文件:
[root@localhost bin]# ./zkCli.sh
查看指定的ip和端口
[root@123 bin]# ./zkCli.sh -server 192.168.31.61:2182
查看配置文件
[zk: localhost:2181(CONNECTED) 0] ls /
[configs, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /configs
[myconf]
[zk: localhost:2181(CONNECTED) 2] ls /configs/myconf
退出:
[zk: localhost:2181(CONNECTED) 3] quit
第八步:启动每个tomcat实例。要包装zookeeper集群是启动状态。
第九步:访问集群
第十步:创建新的Collection进行分片处理。
name=collection2&numShards=2&replicationFactor=2 – 名字叫collection2,分成两片,每片两个机子,在浏览器中直接使用
http://192.168.25.154:8180/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
第十一步:删除不用的Collection。
http://192.168.25.154:8180/solr/admin/collections?action=DELETE&name=collection1
使用solrJ操作集群
package cn.test.solrJTest;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
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.junit.Test;
/**
* solrJ使用集群方法
* @author yuhf
*
*/
public class SolrJCloud {
/**
* 添加
* @throws Exception
* @Test
*/
public void testAddDocument() throws Exception {
//创建一个集群的连接,应该使用CloudSolrServer创建。
CloudSolrServer solrServer = new CloudSolrServer("192.168.31.61:2181,192.168.31.61:2182,192.168.31.61:2183");
//zkHost:zookeeper的地址列表
//设置一个defaultCollection属性。
solrServer.setDefaultCollection("collection2");
//创建一个文档对象
SolrInputDocument document = new SolrInputDocument();
//向文档中添加域
document.setField("id", "solrcloud01");
document.setField("item_title", "测试商品01");
document.setField("item_price", 123);
//把文件写入索引库
solrServer.add(document);
//提交
solrServer.commit();
}
/**
* 查询
* @throws Exception
* @Test
*/
public void testQueryDocument() throws Exception {
//创建一个CloudSolrServer对象
CloudSolrServer cloudSolrServer = new CloudSolrServer("192.168.31.61:2181,192.168.31.61:2182,192.168.31.61:2183");
//设置默认的Collection
cloudSolrServer.setDefaultCollection("collection2");
//创建一个查询对象
SolrQuery query = new SolrQuery();
//设置查询条件
query.setQuery("*:*");
//执行查询
QueryResponse queryResponse = cloudSolrServer.query(query);
//取查询结果
SolrDocumentList solrDocumentList = queryResponse.getResults();
System.out.println("总记录数:" + solrDocumentList.getNumFound());
//打印
for (SolrDocument solrDocument : solrDocumentList) {
System.out.println(solrDocument.get("id"));
System.out.println(solrDocument.get("title"));
System.out.println(solrDocument.get("item_title"));
System.out.println(solrDocument.get("item_price"));
}
}
/**
* 删除
* @throws Exception
*
*/
@Test
public void delect() throws Exception{
//创建一个CloudSolrServer对象
//org.apache.solr.client.solrj.impl.CloudSolrServer
CloudSolrServer cloudSolrServer = new CloudSolrServer("192.168.31.61:2181,192.168.31.61:2182,192.168.31.61:2183");
//设置默认的Collection
cloudSolrServer.setDefaultCollection("collection2");
//删除文档
//solrServer.deleteById("doc01");
//这个是根据属性删除,两个是一样的
cloudSolrServer.deleteByQuery("*:*");
//提交
cloudSolrServer.commit();
}
}
使用spring配置
<!-- 添加一个bean httpSolrServer 这个是子类 SolrServer是父类 这个是单机版-->
<!--
<bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
<constructor-arg name="baseURL" value="http://192.168.31.61:8080/solr/collection1"></constructor-arg>
</bean>
-->
<!-- 集群版配置 -->
<bean id="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">
<constructor-arg name="zkHost" value="192.168.31.61:2181,192.168.31.61:2182,192.168.31.61:2183"></constructor-arg>
<property name="defaultCollection" value="collection2"></property>
</bean>
在其感谢黑马资料,有很多借鉴黑马资料