Apache Solr 包括建立结合容错和高可用性的Solr服务器集群的能力,叫做SolrCloud,这些功能提供了分布式索引和检索功能,支持以下功能:
SolrCloud时灵活的分布式检索和索引系统,不用主节点去分配从节点,分片和复制。而是,Solr使用ZooKerper来管理这些领域,依赖配置文件和模式。文档可被发送到任何服务器并且ZooKeeper将会管理这些。
这一章,我们将会覆盖任何你需要学习的东西当你以SolrCloud模式使用Solr时。我们将会分割细节到下面的主题:
SolrCloud被设计用来提供一个高可用、故障转移的环境是能够索引你的数据并可以检索。数据被组织成所个块、或者说分片,并且可以存在于所个机器上,使用复制机制提供数据冗余来确保可扩展行和故障转移,并且一个ZooKeeper服务器会帮助管理整个结构以保证索引和检索需求能够被正确的路由。
这一章解释了SolrCloud和他的内部运行细节,但是,在你深入之前,最好有一个想法你将要完成什么。这个页面提供了一个简单的入门来解释SolrCloud怎样工作以一个事实上的标准,并且如何利用他的优势。我们将会使用一个简单的例子配置SolrCloud在一个单独的机器上,这个明显不是一个生产环境,这个将包括多个服务器和虚拟机。在一个真实的生产环境中,以将会使用真实的机器名来替换“localhost”,这里我们将使用“localhost”。
建立一个有多分片的集群包括两步:
这个例子中,你将会建立两个独立的Solr实例在同一个机器上。这个不是生产环境的安装,而是一个使用能够熟悉SolrCloud的快速练习。
这个练习中,我们将开始创建两个exmaple目录(solr发布版本中)的复制。
cd $SOLR_HOME
mkdir solrcloud //非必须
cp -r example/ solrcloud/node1
cp -r example/ solrcloud/node2
这写example目录的拷贝实际上可以称为任何事。所有我们尝试做的就是拷贝solr的example 应用是我们能够使用他并有一个可以单独使用的solr例子。
下一步,启动第一个solr实例。包括-DzkRun参数,这个同时会启动一个本地的ZooKeeper实例:
cd solrcloud/node1
java -DzkRun -DnumShards=2 -Dbootstrap_confdir=./solr/collection1/conf -Dcollection.configName=myconf -jar start.jar
运行结果:
这时候你已经有一个服务器在运行,但是这仅仅时一半的分片,所以你需要启动第二个来完成一个全功能的集群。启动第二个实例在另一个窗口下:
cd node2
java -Djetty.port=7574 -DzkHost=localhost:9983 -jar start.jar
因为这个节点没有运行ZooKeeper,并且不包括启动集合,参数就没有第一个复杂:
现在,你有两个solr 窗口运行,都被ZooKeeper管理。去验证它,在你的浏览器中打开Solr Admin UI,并且转到第一个solr服务器的Cloud screen:http://localhost:8983/solr/#/~cloud
你应该看见node1和node2:
现在,看看集群。开始索引一些数据到一个或者所有节点,你可以做这件事以任何你喜欢的方式。但是最方便的方式是使用exampledocs,并且使用curl是你能够控制端口(那个服务器)得到了更新:
cd exampledocs/
curl http://localhost:8983/solr/update?commit=true -H "Content-Type:text/xml" -d "@mem.xml"
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">885</int></lst>
</response>
curl http://localhost:7574/solr/update?commit=true -H "Content-Type:text/xml" -d "@monitor2.xml"
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">724</int></lst>
</response>
现在,每一个分片包括一个数据子集,但是不管导向到那个分片的检索都会返回所有分片,例如:下面的检索返回了完全相同的结果集:
curl http://localhost:7574/solr/collection1/select?q=*:*
curl http://localhost:8983/solr/collection1/select?q=*:*
其中的原因时每一个分片知道其他的分片,所以检索时搬运了所有的核心。因此结果被调用的服务器组合并返回。
这种方式,你可以有两个或者200个核心,每一个都有独立部分的数据。
**如果你想检查每一个分片上的文档数,你可以添加distrib=false在每一个查询上,这是检索数据将不包括所有分片。
但是关于提供高可用性,甚至当其中一个或者多个服务器宕机了?要做这些,你需要看看复制。