复制配置文件

使用 confFiles 参数指定需要复制的配置文件。只有在主服务器 conf 目录下的文件才会被复制。
solr 的配置文件复制只会发生在索引复制之后,即使主服务器中的配置文件修改了,只有在新的 commit/optimize 之后,才会发生配置文件复制。
为了防止失败,solr 在将配置文件替换到 conf 目录前,会先将配置文件复制到临时目录中。旧的配置文件会被重命名,还是放在 conf 目录下,ReplicationHandler 不会自动删除这些旧的配置文件。
当有配置文件被复制到从服务器中,ReplicationHandler 会发起一条让 core 重新加载的命令。

从服务器复制索引过程

主服务器并不能感知到从服务器的存在。从服务器会按照 pollInterval 参数的设置,不多从主服务器中检查索引版本。如果从服务器发现主服务器有新的版本存在,将启动索引同步进程。步骤如下:
  • 从服务发送一个 filelist 的命令,从主服务中获得文件列表,这个命令会返回文件名以及 metadata,包括大小,最后修改时间等
  • 从服务检查本地的索引中是否包包含这些文件,然后发送 filecontent 命令下载本地不存在的文件,该过程使用一种类似 http 块编码方式下载全部或者部分文件内容,如果过程中断,下次将从断点处继续。每次断开后,从服务器最多会重试 5 次
  • 文件下载下来后会放入临时目录,这样在复制过程出错也不会导致索引库不能使用。
  • 下载完成后,新的文件将会替换到现在的索引库中,新文件的时间戳也将跟服务器的同步
  • 最后将发生一次commit,新的索引将被加载

在从服务器中配置索引复制请求处理

以下代码显示如何在从服务器中配置一个索引复制请求处理:

<requestHandler name="/replication" class="solr.ReplicationHandler" >
	<lst name="slave">
		<!--主索引的url,该从索引将从这个主索引地址同步索引-->
		<str name="masterUrl">http://remote_host:port/solr/corename/replication</str>;
		<!--拉取间隔,达到这个时间,从索引将从主索引同步索引.格式为 is HH:mm:ss . 如果该设置为空从索引将不会主动从主索引同步索引.
		另外拉取索引的请求也可以通过 admin 页面或者 http api 来触发 -->
		<str name="pollInterval">00:00:20</str>
		<!-- 以下参数不常用,非必填参数-->
		<!--在索引传输过程中使用压缩,可选的值有两个 internal 和 external
		如果值是 'external' 请确保主索引的solr已经设置了accept-encoding header。
		如果值是 'internal' 索引数据将被自动压缩?,这个主要在低带宽情况下使用,局域网中请不要使用,局域网中使用会降低复制效率-->
		<str name="compression">internal</str>
		<!-以下是配置连接和读取超时时间,这个跟 http 中的概念一样,单位为毫秒-->
		<str name="httpConnTimeout">5000</str>
		<str name="httpReadTimeout">10000</str>
		<!-- 如果主服务中的 http base 的鉴权可用的话,从服务就需要配置这个用户名和密码 -->
		<str name="httpBasicAuthUser">username</str>
		<str name="httpBasicAuthPassword">password</str>
	</lst>
</requestHandler>

复制 solrconfig.xml

在主服务的配置文件里有这么一行:
<str name="confFiles">solrconfig_slave.xml:solrconfig.xml,x.xml,y.xml</str>
solrconfig_slave.xml:solrconfig.xml 的意思是主服务中的 solrconfig_slave.xml 在复制到从服务器上时,solrconfig_slave.xml 将被重命名成 solrconfig.xml ,其他文件将按原始名称复制过去。

在主服务中配置索引复制请求处理类

以下是个主从复制模式中的主服务的配置示例:

<requestHandler name="/replication" class="solr.ReplicationHandler" >
	<lst name="master">
		<!--在 'optimize(合并索引)'后进行同步,其他可选的值还有'commit', 'startup',该值可以填多个-->
		<str name="replicateAfter">optimize</str>
		<!--在 'optimize(合并索引)'后备份索引,其他可选的值还有'commit', 'startup',该值可以填多个-->
		<!-- <str name="backupAfter">optimize</str> -->
		<!--指定备份多少份文件,默认值为 MAX_VALUE-->
		<!-- <int name="numberToKeep">2</int> -->
		<!--指定需要同步的配置文件,多份文件以逗号分隔 -->
		<str name="confFiles">schema.xml,stopwords.txt,elevate.xml</str>
		<!--The default value of reservation is 10 secs. Normally , you should not need
		to specify this -->
		<str name="commitReserveDuration">00:00:10</str>
	</lst>
</requestHandler>

索引复制(Index Replication)

索引复制这种分布式方式,是由一个主索引和多个从索引构成,从索引从主索引复制索引。主索引负责更新索引,从索引复制同步索引和查询。一个主索引可以复制索引到多个多个从索引库。

索引复制

solr 伸缩性和分布式介绍

分布式解决的问题:
当搜索执行的时间太长,或者索引太大,此时要考虑使用 solr 的分布式了。solr 分布式中,将一个大的索引分成几个小的索引(shards,分片),放在不同的机器上。当执行搜索时,将查询划分成多个子查询,在不同机器的索引库中执行搜索,然后将查询结果合并。这个拆分查询和合并结果的过程对用户是透明了。
索引复制解决的问题:
  • 当单机的查询性能不济时,可以考虑复制出多台索引来分别承担压力,如做一个全国性的搜索,可以将索引库复制30来个,每个省分一个,每个省请求过来时,分别在自己省所分配的索引库中进行搜索
  • 将索引的读写分离,也可以很好的提供性能。由一个负责写索引,然后同步到其他索引,其他索引只读,仅提供搜索。
  • 备份索引,详见利用 Replication Handler 备份索引

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress