什么是SolrCloud
solr的分布式搜索方案
为什么要有SolrCloud
当索引数据量大,搜索请求并发量高时
- 降低单机处理的压力,能保证高并发下的
高可用
- 提高单机存储的索引上限,提高了
可扩展性
SolrCloud做了什么
- 自动容错
- 实时搜索
- 查询时自动负载均衡
- 配置文件集中管理
如何实现SolrCloud
solr+zookeeper
将索引数据分片(Shard)存储到不同的服务器上
每个分片由主服务器以及多个备份从服务器共同维护
不同的搜索请求由不同分片的服务器提供服务
- 物理结构
一个SolrCloud由多个solr节点组成
一个solr节点由多个solr core组成 - 逻辑结构
一个solr core包含一个独立索引库
一个完整索引库由多个分片组成
一个分片由多个solr core提供服务(主从)
SolrCloud搭建
第一步:搭建zookeeper集群
一、准备工作
- 安装jdk:
- 将安装包上传后解压
二、准备集群节点
- 创建集群目录: mkdir /usr/local/solr-cloud
- 准备多个zookeeper节点
cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper01
cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper02
cp -r zookeeper-3.4.6 /usr/local/solr-cloud/zookeeper03 - 修改zookeeper节点配置
- 创建各个节点的数据存放目录:
cd /usr/local/solr-cloud/zookeeper0X
mkdir data
echo 1 >> data/myid - 修改各个节点的配置文件:
cp zoo_simple.cfg zoo.cfg
vim zoo.cfg
修改数据存放位置dataDir
修改客户端连接端口clientPort
添加以下内容指定集群中的节点ip:投票端口:选举端口
server.1=ip:2881:3881
server.2=ip:2882:3882
server.3=ip:2883:3883 - 启动zookeeper:./zkServer.sh start
关闭为./zkServer.sh stop
查看服务状态为./zkServer.sh status
- 创建各个节点的数据存放目录:
第二步:搭建solr集群
一、准备tomcat
- 准备多个tomcat:
拷贝多个tomcat解压文件到solr-cloud中:
cp -r apache-tomcat-7.0.52 /usr/local/solr-cloud/tomcat0X - 修改tomcat配置文件中的端口:
vim tomcat0X/conf/server.xml
二、准备solr节点
- 把单机版的solr复制到tomcat下
cp -r solr /usr/local/solr-cloud/tomcat0X/webapps - 为每个solr实例创建solrhome
cp -r solrhome /usr/local/solr-cloud/solrhome0X - 为每个solr实例关联对应的solrhome
修改tomcat0X/webapps/solr/WEB-INF/web.xml中的配置 - 为每个solrhome设置所在的tomcatIP以及端口
vim tomcat0X/webapps/solr/WEB-INF/web.xml
修改每个solrhome下的solr.xml文件:
三、将配置文件上传到zookeeper
- 启动zookeeper集群
- cd /root/solr-4.10.3/example/scripts/cloud-scripts
- 上传配置文件: 用zkcli.sh命令将任一/usr/local/solr-cloud/solrhome0X/collection1/conf目录上传到zookeeper
./zkcli.sh -zkhost zookeeperIp1:端口1,zookeeperIp2:端口2,zookeeperIp3:端口 -cmd upconfig -confdir /usr/local/solr-cloud/solrhome01/collection1/conf -confname myconf - 查看是否上传成功:
cd /usr/local/solr-cloud/zookeeper01/bin
./zkCli.sh
确保包含schema.xml以及solrconfig.xml
四、告诉每个solr节点zookeeper的位置
- 修改tomcat0X/bin/catalina.sh中的配置,添加:
JAVA_OPTS="-DzkHost=zookeeperIp1:端口1,zookeeperIp2:端口2,zookeeperIp3:端口 - 启动所有solr节点,访问其中的一个
五、集群分片
- 浏览器访问
http://solrIp1:port1/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
- 删除不用的collection1
http://solrIp1:port1/solr/admin/collections?action=DELETE&name=collection1
solr集群导入数据
从数据库中根据sql语句查询数据,遍历数据创建文档对象,把文档对象写入索引库
//从数据库中查询数据
List<SearchItem> items = itemMapper.importItems();
for (SearchItem item : items) {
//创建文档
SolrInputDocument document = new SolrInputDocument();
//向文档中添加域
document.addField("id", item.getId());
document.addField("item_title", item.getTitle());
document.addField("item_sell_point", item.getSell_point());
document.addField("item_price", item.getPrice());
document.addField("item_image", item.getImage());
document.addField("item_category_name", item.getCategory_name());
document.addField("item_desc", item.getItem_desc());
//将文档写入索引库
solrServer.add(document);
}
//提交
solrServer.commit();
但service层配置和单机版不同
<!-- 集群版solr -->
<bean id = "cloudSolrServer" class = "org.apache.solr.client.solrj.impl.CloudSolrServer">
<constructor-arg name = "zkHost" value = "192.168.134.131:2181,192.168.134.131:2182,192.168.134.131:2183"/>
<property name="defaultCollection" value="Collection2"></property>
</bean>
项目中使用solr集群
同单机版相同