分布式搜索之搭建Solrcloud(Solr集群)

分布式搜索之搭建Solrcloud(Solr集群)

Solrcloud介绍:

  SolrCloud(solr集群)是Solr提供的分布式搜索方案

  当你需要大规模,容错,分布式索引和检索能力时使用SolrCloud。

  当索引量很大,搜索请求并发很高时,同样需要使用SolrCloud来满足这些需求。

  不过当一个系统的索引数据量少的时候是没有必要使用SolrCloud的。

  SolrCloud是基于Solr和Zookeeper的分布式搜索方案。它的主要思想是使用Zookeeper作为SolrCloud集群的配置信息中心,统一管理solrcloud的配置,比如solrconfig.xml和schema.xml。

Solrcloud特点功能:

  1)集中式的配置信息

  2)自动容错

  3)近实时搜索

  4)查询时自动负载均衡

Solrcloud的结构:

  solrcloud为了降低单机的处理压力,需要由多台服务器共同来完成索引和搜索任务实现的思路是将索引数据进行Shard分片,每个分片由多台服务器共同完成,当一个索引或搜索请求过来时会分别从不同的Shard的服务器中操作索引solrcloud是基于solr和zookeeper部署,zookeeper是一个集群管理软件,solrcloud需要由多台solr服务器组成,然后由zookeeper来进行协调管理。

分布式搜索之搭建Solrcloud(Solr集群)

 

由于solrcloud一般都是解决大数据量、大并发的搜索服务,所以搭建solrcloud之前,首先需要搭建zookeeper注册中心集群。

1)、搭建zookeeper集群步骤:需要三台zookeeper、分别是zk1、zk2、zk3,对应的端口分别为2281、2282、2283。

第一步:安装jdk环境,因为zookeeper是使用Java语言编写的;

第二步:准备zookeeper-3.4.6.tar.gz压缩包,解压并修改目录名称为zk1

分布式搜索之搭建Solrcloud(Solr集群)

第三步:进入zk1/conf目录,zoo_sample.cfg文件名称改为zoo.cfg

第四步:修改zoo.cfg文件,配置集群信息(俩个截图信息都是配置在zoo.cfg文件中)

分布式搜索之搭建Solrcloud(Solr集群)

分布式搜索之搭建Solrcloud(Solr集群)

第五步:dataDir(对应zoo.cfg配置文件中的目录结构)目录下创建myid文件,文件内容为1,对应server.1中的1。

第六步:拷贝zk1,复制两个目录zk2、zk3。并修改zoo.cfg和myid两个文件。

分布式搜索之搭建Solrcloud(Solr集群)

第七步:编写俩个脚本文件,分别启动zookeeper集群和查看集群中各个服务的状态。

分布式搜索之搭建Solrcloud(Solr集群)

分布式搜索之搭建Solrcloud(Solr集群)

分布式搜索之搭建Solrcloud(Solr集群)

 

 2)、搭建solrcloud集群步骤:

第一步:复制4个单机版solr服务对应的tomcat,并分别修改端口为:8280、8380、8480、8580。

分布式搜索之搭建Solrcloud(Solr集群)

第二步:复制4个solrhome,分别为solrhome8280、solrhome8380、solrhome8480、solrhome8580。一个solr实例对应一个solrhome。

 分布式搜索之搭建Solrcloud(Solr集群)

第三步:修改每个solr服务对应的Tomcat容器中solr项目的web.xml文件中的内容(目录结构为/usr/local/solrcloud/tomcat8280/webapps/solr/WEB-INF)

分布式搜索之搭建Solrcloud(Solr集群)

第四步:修改每个solrhome下的solr.xml,指定对应solr服务的tomcat的ip和端口。

分布式搜索之搭建Solrcloud(Solr集群)

第五步:设置tomcat的启动参数,在每个tomcat目录下的bin/catalina.sh,添加以下内容:

分布式搜索之搭建Solrcloud(Solr集群)

第六步:将solr配置文件上传到zookeeper中,进行统一管理,进入到/root/soft/solr-4.10.3/example/scripts/cloud-scripts目录中执行zkcli.sh命令

分布式搜索之搭建Solrcloud(Solr集群)

./zkcli.sh   -zkhost   192.168.136.135:2281,192.168.136.135:2282,192.168.136.135:2283   -cmd   upconfig   -confdir   /usr/local/solrcloud/solrhome8280/collection1/conf   -confname   myconf(每个ip地址之间用逗号分隔)

第七步:编写脚本文件启动所有的solr服务

分布式搜索之搭建Solrcloud(Solr集群)

第八步:访问部署的solr集群中任意的端口服务

分布式搜索之搭建Solrcloud(Solr集群)

第九步:solrcloud搭建完毕。

---------------------------------------------------------

Solr集群的使用

使用solrj操作集群环境的索引库。

1.1 Solrj测试

public class SolrCloudTest {

 

@Test

public void testAddDocument() throws Exception {

//创建一个和solr集群的连接

//参数就是zookeeper的地址列表,使用逗号分隔

String zkHost = "192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183";

CloudSolrServer solrServer = new CloudSolrServer(zkHost);

//设置默认的collection

solrServer.setDefaultCollection("collection2");

//创建一个文档对象

SolrInputDocument document = new SolrInputDocument();

//向文档中添加域

document.addField("id", "test001");

document.addField("item_title", "测试商品");

//把文档添加到索引库

solrServer.add(document);

//提交

solrServer.commit();

}

@Test

public void deleteDocument() throws SolrServerException, IOException {

//创建一个和solr集群的连接

//参数就是zookeeper的地址列表,使用逗号分隔

String zkHost = "192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183";

CloudSolrServer solrServer = new CloudSolrServer(zkHost);

//设置默认的collection

solrServer.setDefaultCollection("collection2");

solrServer.deleteByQuery("*:*");

solrServer.commit();

}

}

 

1.2 Solrjspring集成

修改spring的配置文件,添加集群版的配置:

<!-- 集群版 -->

<bean id="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">

<constructor-arg name="zkHost" value="192.168.25.154:2181,192.168.25.154:2182,192.168.25.154:2183"></constructor-arg>

<property name="defaultCollection" value="collection2"></property>

</bean>



---------------------------------------------------

遇到个问题

启动4个tomcat后,访问solr地址后,发现只有一个solr可以打开,重启后tomcat后,发现其中只有一个solr能够打开是随机的。

有时候是8080可以打开,有时候是8081能够打开,有时候是8082能够打开,有时候是8083打开。

其他三个都会报错  其中报错原因是  :index locked for write for core这个错误。打开其中可以打开的solr网站,进入点击cloud

发现四个solr都是黄色处于down状态。

网络上有两个解决方法 

如下

1.unlockOnStartup 告知 Solr 忽略在多线程环境中用来保护索引的锁定机制。在某些情况下,索引可能会由于不正确的关机或其他错误而一直处于锁定,这就妨碍了添加和更新。将其设置为 true 可以禁用启动锁定,进而允许进行添加和更新。

      进入solr-5.3.1/server/solr/被锁住的集合名/conf, 修改solrconfig.xml文件, 在<lockType>${solr.lock.type:native}</lockType>语句上面加一条语句:<unlockOnStartup>true</unlockOnStartup>

2.很多情况自己不小心重启电脑而此时solr正在索引时,将可能启动报错LockObtainFailedException

index locked for write for core。到data/index下面看应该是有一个write.lock文件,删掉就行了。 然后,登录 Apache Tomcat 管理界面,点击进入Manager App ,在Applications列表中找到solr站点,点击Reload按钮
最后,刷新solr站点,发现问题解决了,皆大欢喜!


于是我就用过一上的方法先第一步,每个solrhome都更改了配置,然后发现data中确实有write.lock,,删掉。然后relod后发现有一个绿了,真神奇。

于是就纳闷了我都删了配置了怎么还给我其他都是黄色的呢。

不断试错啊!我有一一的看配置到底哪里有问题,然后发现8080的solrhome1中的data又有个write.lock,删了reload黄色的tomcat后发现又一个绿了。

每次都会产生一个write.lock,不敢重启tomcat,怕绿的又变成黄色的了。

估计锁机制还存在,没有禁止,所以我reload 其中tomcat达到变绿,其实是骗自己,solr的锁机制还是存在,没有正在的解决,之后复制solr的分片就失败了。重启tomcat后又回到了一开始的状况

其中原因估计就定位到solr的锁机制,不知道还有没有大神可以解决我的问题,这个问题纠结了2天了。