什么是SolrCloud:
SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。
SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。
它有几个特色功能:
1)集中式的配置信息
2)自动容错
3)近实时搜索
4)查询时自动负载均衡
SolrCloud结构:
SolrCloud为了降低单机的处理压力,需要由多台服务器共同来完成索引和搜索任务。实现的思路是将索引数据进行Shard(分片)拆分,每个分片由多台的服务器共同完成,当一个索引或搜索请求过来时会分别从不同的Shard的服务器中操作索引。
SolrCloud需要Solr基于Zookeeper部署,Zookeeper是一个集群管理软件,由于SolrCloud需要由多台服务器组成,由zookeeper来进行协调管理。
下图是一个SolrCloud应用的例子:
物理结构:需要实现能看到、配置得了的东西。
逻辑结构:看不见、莫不着的。
环境搭建:3个zookeeper实例、4个tomcat实例、在一台虚拟机上模拟。
采用伪集群的方式进行安装,如果是真正的生产环境,将伪集群的ip改下就可以了,步骤是一样的。
环境准备:
centos6.5
jdk1.7
apache-tomcat7
zookeeper
solr
环境安装:
centos6.5:略 、
jdk:略
solr集群搭建:
1、先创建4个tomcat实例。
上传解压tomcat安装包,复制4个解压文件到/usr/local/solrcloud/目录下,分别命名tomcat1、tomcat2、tomcat3、tomcat4
cp apache-tomcat-7.0.47 /usr/local/solrcloud/tomcat1 -r
cp apache-tomcat-7.0.47 /usr/local/solrcloud/tomcat2 -r
cp apache-tomcat-7.0.47 /usr/local/solrcloud/tomcat3 -r
cp apache-tomcat-7.0.47 /usr/local/solrcloud/tomcat4 -r
2、修改端口8080:8083
示范tomcat2,改3个地方。其它一样:
3、安装solr(跟单机版一样)
上传、解压安装文件,从解压文件dist目录中复制solr.war到tomcat中。
cd solr-4.10.3/dist/
cp solr-4.10.3.war /usr/local/solrcloud/tomcat1/webapps/solr.war
cp solr-4.10.3.war /usr/local/solrcloud/tomcat2/webapps/solr.war
cp solr-4.10.3.war /usr/local/solrcloud/tomcat3/webapps/solr.war
cp solr-4.10.3.war /usr/local/solrcloud/tomcat4/webapps/solr.war
启动tomcat来解压solr.war
cd /usr/local/solrcloud/
tomcat1/bin/startup.sh
tomcat2/bin/startup.sh
tomcat3/bin/startup.sh
tomcat4/bin/startup.sh
为了方便可以写个脚本启动和关闭
启动:./startall.sh
停止:./shutdownall.sh
将原来的solr.war删除。
4、拷贝example\lib\ext 目录下所有jar包到Tomcat的webapp\solr\WEB-INF\lib目录下
cd solr-4.10.3/example/lib/ext/
cp ./* /usr/local/solrcloud/tomcat1/webapps/solr/WEB-INF/lib/
cp ./* /usr/local/solrcloud/tomcat2/webapps/solr/WEB-INF/lib/
cp ./* /usr/local/solrcloud/tomcat3/webapps/solr/WEB-INF/lib/
cp ./* /usr/local/solrcloud/tomcat4/webapps/solr/WEB-INF/lib/
5、在Tomcat下webapps\solr\WEB-INF目录中创建文件classes文件夹,拷贝log4j.properties文件
mkdir /usr/local/solrcloud/tomcat1/webapps/solr/WEB-INF/classes
mkdir /usr/local/solrcloud/tomcat2/webapps/solr/WEB-INF/classes
mkdir /usr/local/solrcloud/tomcat3/webapps/solr/WEB-INF/classes
mkdir /usr/local/solrcloud/tomcat4/webapps/solr/WEB-INF/classes
cd solr-4.10.3/example/resources/
cp log4j.properties /usr/local/solrcloud/tomcat1/webapps/solr/WEB-INF/classes/
cp log4j.properties /usr/local/solrcloud/tomcat2/webapps/solr/WEB-INF/classes/
cp log4j.properties /usr/local/solrcloud/tomcat3/webapps/solr/WEB-INF/classes/
cp log4j.properties /usr/local/solrcloud/tomcat4/webapps/solr/WEB-INF/classes/
4、进入example目录下拷贝4次solr到solrcloud下面,存放solr配置文件
cd solr-4.10.3/example/
cp -r solr /usr/local/solrcloud/solrhome1
cp -r solr /usr/local/solrcloud/solrhome2
cp -r solr /usr/local/solrcloud/solrhome3
cp -r solr /usr/local/solrcloud/solrhome4
5、修改web.xml找到对应配置文件目录
cd /usr/local/solrcloud/
vi tomcat1/webapps/solr/WEB-INF/web.xml
记得去掉注释!
启动访问测试:
./startall.sh
192.168.132.132:8080/solr
192.168.132.132:8081/solr
192.168.132.132:8082/solr
192.168.132.132:8083/solr
把solrhome中的配置文件上传到zookeeper集群,使用zookeeper的客户端上传
在solr-4.10.3/example/scripts/cloud-scripts/目录下执行下面命令:
./zkcli.sh -zkhost 192.168.132.132:2181,192.168.132.132:2182,192.168.132.132:2183 -cmd upconfig -confdir /usr/local/solrcloud/solrhome1/collection1/conf -confname myconf
登录zookeeper服务器查询配置文件
cd /usr/local/zookeeper/bin/
./zkCli.sh
6、修改4个solrhome下的solr.xml文件,指定当前实例运行的ip地址及端口
7、修改每一台的tomcat的bin目录下catalina.sh文件中加入DzkHost指定zookeeper服务器地址:
JAVA_OPTS="-DzkHost=192.168.132.132:2181,192.168.132.132:2182,192.168.132.132:2183"
启动tomcat:
./startall.sh
随便访问一个就看到左边多了一个cloud
一主多备,集群只有一片,目的是要有2片,每片都是一主一备
8、创建一个两片的collection,每片都是一主一备
在浏览器下使用一下命令:
http://192.168.132.132:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2
重新再访问一次集群:
再把collection1删除掉就可以了(可以共存多个collection)
http://192.168.132.132:8080/solr/admin/collections?action=DELETE&name=collection1
8、配置业务字段
在solr中默认是中文分析器,需要手工配置,配置一个FieldType,在FieldType中指定中文分析器。solr中的字段必须是先定义后使用。
使用IKAnalyzer,把分析器的文件夹拖到服务器
cd IK Analyzer 2012FF_hf1
cp IKAnalyzer2012FF_u1.jar /usr/local/solrcloud/tomcat1/webapps/solr/WEB-INF/lib/
cp IKAnalyzer2012FF_u1.jar /usr/local/solrcloud/tomcat2/webapps/solr/WEB-INF/lib/
cp IKAnalyzer2012FF_u1.jar /usr/local/solrcloud/tomcat3/webapps/solr/WEB-INF/lib/
cp IKAnalyzer2012FF_u1.jar /usr/local/solrcloud/tomcat4/webapps/solr/WEB-INF/lib/
把IKAnalyzer需要的扩展词典及停用词词典和配置文件复制到solr工程的classpath
cp IKAnalyzer.cfg.xml ext_stopword.dic mydict.dic /usr/local/solrcloud/tomcat1/webapps/solr/WEB-INF/classes/
cp IKAnalyzer.cfg.xml ext_stopword.dic mydict.dic /usr/local/solrcloud/tomcat2/webapps/solr/WEB-INF/classes/
cp IKAnalyzer.cfg.xml ext_stopword.dic mydict.dic /usr/local/solrcloud/tomcat3/webapps/solr/WEB-INF/classes/
cp IKAnalyzer.cfg.xml ext_stopword.dic mydict.dic /usr/local/solrcloud/tomcat4/webapps/solr/WEB-INF/classes/
配置FieldType和业务字段:
业务字段判断标准:
1、在搜索时是否需要在此字段上进行搜索(结合商城例如:商品名称、卖点、描述)
2、后续的业务是否需要用到此字段
在/usr/local/solrhome1/collection2/conf/schema.xml:
如果每个solrhome下面没有collection2就从解压文件里面拷贝过来,并改名为collection2
<fieldType name="text_ik" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> <field name="item_title" type="text_ik" indexed="true" stored="true"/> <field name="item_sell_point" type="text_ik" indexed="true" stored="true"/> <field name="item_price" type="long" indexed="true" stored="true"/> <field name="item_image" type="string" indexed="false" stored="true" /> <field name="item_category_name" type="string" indexed="true" stored="true" /> <field name="item_desc" type="text_ik" indexed="true" stored="false" /> <field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/> <copyField source="item_title" dest="item_keywords"/> <copyField source="item_sell_point" dest="item_keywords"/> <copyField source="item_category_name" dest="item_keywords"/> <copyField source="item_desc" dest="item_keywords"/>
测试:
spring集成:相对于单机版只需要改一下xml配置文件,如下:
结合工程导入数据:
http://localhost:8084/search/manager/importall