Solr7 Index Replication

2019-05-17  本文已影响0人  yuhan_sining

Solr索引复制将主索引的完整副本分发到一个或多个从属服务器。 主服务器继续管理索引的更新。 所有查询都由从服务器处理。 这种分工使Solr能够扩展,以针对大型搜索量提供足够的响应。
下图显示了使用索引复制的Solr配置。 主服务器的索引在从属服务器上复制。


A Solr index can be replicated across multiple slave servers, which then process requests.

Index Replication in Solr

Solr包含一个通过HTTP工作的索引复制的Java实现:

Replication In SolrCloud

尽管SolrCloud集群中没有明确的“主/从”节点概念,但SolrCloud仍然会根据需要使用此页面上讨论的ReplicationHandler来支持“分片恢复” - 但这是以对等方式完成的。
使用SolrCloud时,必须通过/replication路径提供ReplicationHandler。 除非在solrconfig.xml中显式覆盖,否则Solr会隐式执行此操作,但如果您希望覆盖默认行为,请确保您未明确设置下面提到的任何“主”或“从”配置选项,否则它们会干扰 使用正常的SolrCloud操作。

Replication Terminology

索引
Lucene索引是文件目录。这些文件构成了Solr Core的可搜索和可返回数据。
分配
将索引从主服务器复制到所有从属服务器。分发过程利用了Lucene的索引文件结构。
插入和删除
由于插入和删除发生在索引中,因此目录保持不变。文档始终插入新创建的段文件中。删除的文档不会从段文件中删除。它们在文件中被标记,可删除,并且不会从段中删除,直到该段作为正常索引更新的一部分合并。
主服务和从服务
Solr复制主机是一个单个节点,它最初接收所有更新并保持一切有条理。 Solr复制从属节点不直接接收更新,而是所有更改(例如插入,
更新,删除等)是针对单个主节点进行的。在主服务器上进行的更改将分发到所有从服务器节点,这些节点服务来自客户端的所有查询请求
更新
更新是针对单个Solr实例的单个更改请求。它可能是删除文档,添加新文档,更改文档,删除与查询匹配的所有文档等的请求。
更新在单个Solr实例中同步处理。
优化
压缩索引并合并段以提高查询性能的过程。
优化只应在主节点上运行。与在一段时间内通过许多更新变得分散的索引相比,优化的索引可以提供查询性能增益。
分配优化索引需要比将新段分配到未优化索引的时间长得多的时间。

索引的自包含子集,由一些文档和与这些文档中的术语的倒排索引相关的数据结构组成。
合并因子
控制索引中段数的参数。例如,当mergeFactor设置为3时,Solr将使用文档填充一个段,直到满足极限maxBufferedDocs,然后它将启动一个新段。当达到mergeFactor指定的段数时(在本例中为3),Solr会将所有段合并为一个索引文件,然后开始将新文档写入新段。
快照
包含指向索引数据文件的硬链接的目录。当从属设备拉出快照时,快照从主节点分发,“智能复制”从属节点在包含指向最新索引数据文件的硬链接的快照目录中没有的任何段。

Configuring the ReplicationHandler

除了特定于主/从角色的ReplicationHandler配置选项外,还有一些通常支持的特殊配置选项(即使使用SolrCloud时也是如此)。

Configuring the Replication RequestHandler on a Master Server

在运行复制之前,应在处理程序初始化时设置以下参数:
replicateAfter
字符串指定应在何时进行复制的操作。有效值包括提交,优化或启动。此参数可以有多个值。如果使用“startup”,如果要在将来的提交或优化时触发复制,还需要“commit”和/或“optimize”条目。
backupAfter
字符串指定应在何时执行备份的操作。有效值包括commit, optimize, 或 startup。
此参数可以有多个值。它不是复制所必需的,它只是进行备份。
maxNumberOfBackups
整数指定要保留的备份数。这可用于删除除最近N个备份之外的所有备份。
confFiles
要复制的配置文件,用逗号分隔。
commitReserveDuration
如果您的提交非常频繁且网络速度很慢,则可以调整此参数以增加传输数据所需的时间。默认值为00:00:10,即10秒。
下面的示例显示了ReplicationHandler可能的“主”配置,包括固定数量的备份和maxWriteMBPerSec请求参数的不变设置,以防止从设备使其网络接口饱和

<requestHandler name="/replication" class="solr.ReplicationHandler">
<lst name="master">
  <str name="replicateAfter">optimize</str>
  <str name="backupAfter">optimize</str>
  <str name="confFiles">schema.xml,stopwords.txt,elevate.xml</str>
</lst>
<int name="maxNumberOfBackups">2</int>
<str name="commitReserveDuration">00:00:10</str>
<lst name="invariants">
  <str name="maxWriteMBPerSec">16</str>
</lst>
</requestHandler>

Replicating solrconfig.xml

In the configuration file on the master server, include a line like the following:

<str name="confFiles">solrconfig_slave.xml:solrconfig.xml,x.xml,y.xml</str>

This ensures that the local configuration solrconfig_slave.xml will be saved as solrconfig.xml on the slave. All other files will be saved with their original names.
On the master server, the file name of the slave configuration file can be anything, as long as the name is correctly identified in the confFiles string; then it will be saved as whatever file name appears after the colon ':'.

Configuring the Replication RequestHandler on a Slave Server

The code below shows how to configure a ReplicationHandler on a slave.

<requestHandler name="/replication" class="solr.ReplicationHandler">
    <lst name="slave">
    <!-- fully qualified url for the replication handler of master. It is
    possible to pass on this as a request param for the fetchindex command -->
    <str name="masterUrl">http://remote_host:port/solr/core_name/replication</str>
    <!-- Interval in which the slave should poll master. Format is HH:mm:ss .
    If this is absent slave does not poll automatically.
    But a fetchindex can be triggered from the admin or the http API -->
    <str name="pollInterval">00:00:20</str>
    <!-- THE FOLLOWING PARAMETERS ARE USUALLY NOT REQUIRED-->
    <!-- To use compression while transferring the index files. The possible
    values are internal|external. If the value is 'external' make sure
    that your master Solr has the settings to honor the accept-encoding header.
    See here for details: http://wiki.apache.org/solr/SolrHttpCompression
    If it is 'internal' everything will be taken care of automatically.
    USE THIS ONLY IF YOUR BANDWIDTH IS LOW.
    THIS CAN ACTUALLY SLOWDOWN REPLICATION IN A LAN -->
    <str name="compression">internal</str>
    <!-- The following values are used when the slave connects to the master to
    download the index files. Default values implicitly set as 5000ms and
    10000ms respectively. The user DOES NOT need to specify these unless the
    bandwidth is extremely low or if there is an extremely high latency -->
    <str name="httpConnTimeout">5000</str>
    <str name="httpReadTimeout">10000</str>
    <!-- If HTTP Basic authentication is enabled on the master, then the slave
    can be configured with the following -->
    <str name="httpBasicAuthUser">username</str>
    <str name="httpBasicAuthPassword">password</str>
    </lst>
</requestHandler>

Setting Up a Repeater with the ReplicationHandler

主设备可能只能为这么多从设备提供服务而不会影响性能。一些组织已在多个数据中心部署了从属服务器。如果每个从属设备从远程数据中心下载索引,则生成的下载可能会消耗过多的网络带宽。为避免此类情况下的性能下降,您可以将一个或多个从站配置为转发器。转发器只是一个充当主设备和从设备的节点。

<requestHandler name="/replication" class="solr.ReplicationHandler">
    <lst name="master">
        <str name="replicateAfter">commit</str>
        <str name="confFiles">schema.xml,stopwords.txt,synonyms.txt</str>
    </lst>
    <lst name="slave">
        <str name="masterUrl">http://master.solr.company.com:8983/solr/core_name/replication</str>
        <str name="pollInterval">00:00:60</str>
    </lst>
</requestHandler>

Commit and Optimize Operations

在主服务器上执行提交或优化操作时,RequestHandler将读取与每个提交点关联的文件名列表。 这依赖于配置中的replicateAfter参数来确定哪些类型的事件应该触发复制。
支持这些操作:

<str name="replicateAfter">startup</str>
<str name="replicateAfter">commit</str>
<str name="replicateAfter">optimize</str>

Slave Replication

主节点完全没有意识到备节点。
从站持续轮询主站(取决于pollInterval参数)以检查主站的当前索引版本。如果从服务器发现主服务器具有较新版本的索引,则会启动复制过程。步骤如下:

上一篇下一篇

猜你喜欢

热点阅读