欢迎您, 来到 宁时修博客.^_^

Solr系列--2、Solr主从复制

2016/11/23 言则行 Solr 1318
企业级搜索应用服务Solr

   本文翻译至官方文档

一、Index Replication

索引复制将master索引的完整副本分发到一个或多个slave服务器。master服务器继续管理索引的更新。所有查询由从机处理。这种劳动分工使Solr能够扩展,以便针对大型搜索量对查询提供足够的响应。

下图显示了使用索引复制的Solr配置。master服务器的索引在slave上复制。

sss.png


  Solr索引可以跨多个从服务器进行复制,然后这些服务器处理请求。


二、Index Replication in Solr

  Solr的索引复制是通过HTTP工作的Java实现:

   1、影响复制的配置由单个文件solrconfig.xml控制;

   2、支持复制配置文件以及索引文件;

   3、在具有相同配置的平台上工作;

   4、不依赖于操作系统相关的文件系统功能(例如:硬链接);

   5、与Solr紧密集成; 管理页面提供对复制的每个方面的细粒度控制;

   6、基于Java的复制功能作为请求处理程序实现。 因此,配置复制与任何正常的请求处理程序相似。


三、Replication Terminology(复制术语)

  下表定义了与solr复制相关的关键术语:

Term(术语)Definition(定义)
Distribution(分发)将索引从Master复制到所有Slave,分发过程利用了Lucene的索引文件结构。
Inserts and Deletes由于插入和删除发生在索引中,所以目录保持不变。documents始终插入到新创建的文件中,删除的documents不会从文件中删除。它们被标记在文件中,可删除,并且在索引优化之前不会从文件中删除。
Update更新是针对单个Solr实例的单个更改请求。它可能是删除documents,添加新documents,更改documents,删除与查询匹配的所有documents等的请求。在单个Solr实例内同步处理更新。
Master and SlaveSolr复制master是一个单个节点,它最初接收所有更新并保持一切组织结构。Solr复制slave不直接接收更新,而是对单个主节点进行所有更改(例如插入,更新,删除等)。主节点上进行的更改分发到所有从节点,从节点为来自客户端的所有查询请求提供服务。
Segments(分段)包含一些documents和数据结构的索引的一个子集,这些documents和数据结构与documents中的倒排索引术语有关。
Optimization压缩索引并合并分段以提高查询性能的过程。优化应仅在主节点上运行。与在许多更新的一段时间内变得分段的索引相比,优化的索引可以给出查询性能增益。分发优化索引需要比将新分段分发到未优化索引更长的时间。
mergeFactor(合并因子)一个参数,该参数控制索引中的分段(Segments)的数目。例如,当mergeFactor设置为3时,Solr将使用文档填充一个分段,直到达到maxBufferedDocs的限制为止,然后它将启动一个新的分段。达到由mergeFactor指定的数量(在此示例中为3)时,Solr将所有分段合并为单个索引文件,然后开始向新的分段写入新内容。
IndexLucene索引是一个文件的目录,这些文件构成Solr Core的可搜索和可返回的数据。
Snapshot(快照)索引的数据文件包含目录做硬链接,当从属节点拉动它们时,从主节点分发快照,“智能复制”从节点在包含最近的索引数据文件的硬链接的快照目录中不具有的任何分段。

  


四、Configuring the ReplicationHandler

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

   1maxNumberOfBackups一个整数值,表示该节点在接收备份命令时在磁盘上保留的最大备份数。

   2、类似于Solr中的大多数其他请求处理程序,您可以配置一组相应的“defaults, invariants, and/or appends”参数对应ReplicationHandler在处理命令时支持的任何请求参数。


4.1 Configuring the Replication RequestHandler on a Master Server

   在运行复制之前,应该在处理程序初始化时设置以下参数

NameDescription
replicateAfter字符串指定应在何时进行复制的操作。有效值为commitoptimizestartup。此参数可以有多个值。如果使用“startup”,如在将来commit或optimize时触发复制,则还需要具有“commit”和/或“optimize”条目。
backupAfter字符串指定应在何时进行备份的操作。有效值为commitoptimizestartup。此参数可以有多个值。它不是复制所必需的,只是做一个备份。
maxNumberOfBackups指定要保留的备份数量。这可用于删除除了最近的N个备份之外的所有备份。
confFiles指定要复制的配置文件名,用逗号分隔。
commitReserveDuration如果你的commit非常频繁,你的网络又很慢,您可以调整此参数以增加从master下载到slave所需的时间。默认值为10秒。即每次commit之后,保留增量索引的周期时间。


  下面的示例显示了ReplicationHandler的一种可能的“master”配置,包括固定数量的备份和maxWriteMBPerSec请求参数的不变设置,以防止slave饱和其网络接口:

<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>
    <str name="commitReserveDuration">00:00:10</str>
  </lst>
  <int name="maxNumberOfBackups">2</int>
  <lst name="invariants">
    <str name="maxWriteMBPerSec">16</str>
  </lst>
</requestHandler>



4.2 Replicating solrconfig.xml

在master server的配置文件中,包括类似以下行:

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

  这确保本地配置solrconfig_slave.xml将作为solrconfig.xml保存在slave上。所有其他文件将以其原始名称保存。

  在master server上,slave配置文件的文件名可以是任何名,只要在confFiles字符串中正确标识名称即可; 那么它将被保存为冒号“:”后出现的任何文件名。

  

4.3 Configuring the Replication RequestHandler on a Slave Server

  下面的代码显示了如何在slave上配置一个ReplicationHandler:

<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.
     复制程序使用完整的master URL,可以将其作为fetchindex命令的请求参数传递;存在多核时,
     地址写为 http://remote_host:port/solr/core1_name/replication -->
    <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.
     slave应该轮询master的时间间隔,格式是HH:mm:ss。如果没有这个slave不会自动轮询master。但是
     fetchindex可以通过主页面或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
   在传输索引文件时使用压缩,值可以是internal或external,如果值是'external',请确保您的master Solr
   具有符合accept-encoding标头的设置,详情请参阅这里: 
   如果值是‘internal’,一切都会自动处理。如果您的带宽低,请使用此功能,这可以在局域网中的实现减
   速复制。internal表示内网,external表示外网。-->
    <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.
   slave连接master下载索引文件时,使用以下配置超时时间,默认值分别设置为5000ms和 10000ms。用户不需
   要指定这些,除非带宽非常低或者具有极高的延迟。-->
 
    <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.
    如果在主站上启用了HTTP基本认证,则slave可以配置以下内容。-->
 
    <str name="httpBasicAuthUser">username</str>
    <str name="httpBasicAuthPassword">password</str>
  </lst>
</requestHandler>


五、Setting Up a Repeater with the ReplicationHandler

    一个master可能只能服务多个slave而不影响性能,一些组织已经在多个数据中心部署slave。如果每个slave从远程数据中心下载索引,则生成的下载可能会消耗过多的网络带宽。为了避免在这种情况下性能下降,可以将一个或多个slave配置为中继器。中继器仅仅是充当master and slave的节点。

    1、要将服务器配置为中继器,solrconfig.xml文件中的Replication requestHandler的定义必须包括master和slave的文件列表。

    2、请务必将replicateAfter参数设置为提交commit,即使replicateAfte在master上设置为optimize。这是因为在中继器(或任何slave)上,只有在下载索引之后才调用commit。任何slave从不会调用optimize命令。

    3、可选,可以配置中继器通过压缩参数从master提取压缩文件,以减少索引下载时间。

   下面是中继器的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

   当在master上执行commit或optimize操作时,RequestHandler读取与每个提交点相关联的文件名列表。这依赖于配置中的replicateAfter参数来决定哪些类型的事件应触发复制。

Setting on the MasterDescription
commitmaster index上执行执行commit是触发复制。
optimizemaster index optimize时触发复制
startupmaster index启动时触发复制

   

   replicateAfter参数可以接受多个参数。例如:

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


七、Slave Replication

   master完全不知道slaves。slave持续轮询master(取决于pollInterval参数)以检查master的当前索引版本。如果slave发现master具有索引的较新版本,它将启动复制过程。步骤如下:

   1、slave发出一个filelist命令以获取文件列表。此命令返回文件的名称以及一些元数据(例如,大小,最后修改的时间戳,别名(如果有))。

   2、如果slave在本地索引中有任何这些文件,它将使用自己的索引进行校验。然后运行filecontent命令下载缺少的文件。这使用自定义格式(类似于HTTP分块编码)来下载完整内容或每个文件的一部分。如果连接中断,下载从失败的点恢复。在任何时候,slave会尝试5次,然后完全放弃复制。

   3、文件被下载到临时目录中,因此,如果slave或master在下载过程中崩溃,则会没有文件被破坏。相反,当前复制将简单地中止。

   4、下载完成后,所有新文件将移动到活动的索引目录,文件的时间戳与master上的副本相同。

   5、slave的ReplicationHandler在slave上发出一个commit命令,并加载新的索引。


7.1 Replicating Configuration Files

  要复制配置文件,请使用confFiles参数列出它们。只有在主服务器Solr实例的conf目录中找到的文件才会被复制。

Solr仅在复制索引本身时复制配置文件。这意味着即使在master上更改配置文件,只有在master索引上有新的commit/optimize之后,该文件才会被复制。

不同于索引文件,时间戳是好的,足以确定它们是否相同,配置文件与其校验和进行比较。如果它们的校验和相同,则schema.xml文件(在slave and master上)被判断为相同。

作为复制配置文件时的预防措施,Solr将配置文件复制到临时目录,然后将其移动到conf目录中的最终位置。旧的配置文件重命名并保存在同一个conf /目录中。 ReplicationHandler不会自动清理这些旧文件。

如果复制涉及下载至少一个配置文件,则ReplicationHandler会发出core-reload命令而不是commit命令。


7.2 Resolving Corruption Issues on Slave Servers(解决slave server上的损坏问题)

  如果documents被添加到slave,则slave不再与其master同步。然而,slave不会采取任何操作使自己同步,直到master具有新的索引数据。当在master上发生commit操作时,master的索引版本与slave的索引版本不同。然后,slave获取文件列表,并发现master上存在的一些文件也存在于本地索引中,但具有不同的大小和时间戳。这意味着masterslave具有不兼容的索引。为了纠正这个问题,slave将所有索引文件从master复制到一个新的索引目录,并要求Core从新的目录加载新的索引。


八、HTTP API Commands for the ReplicationHandler

   可以使用下面的HTTP命令来控制ReplicationHandler的操作:

CommandDescription
http://master_host:port/solr/core_name/replication?command=enablereplicationmaster上启用复制
http://master_host:port/solr/core_name/replication?command=disablereplicationmaster上禁用复制
http://host:port/solr/core_name/replication?command=indexversion返回指定masterslave上最新可复制索引的版本
http://slave_host:port/solr/core_name/replication?command=fetchindex

强制指定的slave从其master获取索引的副本。

如果愿意,您可以传递一个额外的属性,例如masterUrlcompression(或在<lst name =slave>标记中指定的任何其他参数),以从主机执行一次性复制。这避免了对slave中的master进行硬编码的需要。

http://slave_host:port/solr/core_name/replication?command=abortfetch中止将索引从master复制到指定的slave
http://slave_host:port/solr/core_name/replication?command=enablepoll使指定的slave轮询master的更改
http://slave_host:port/solr/core_name/replication?command=disablepoll禁止指定的slave轮询master上的更改
http://slave_host:port/solr/core_name/replication?command=details检索配置详细信息和当前状态
http://host:port/solr/core_name/replication?command=filelist&generation=<generation-number>检索指定主机索引中存在的Lucene文件的列表。您可以通过运行indexversion命令来发现索引的迭代号。
http://master_host:port/solr/core_name/replication?command=backup

如果服务器中有提交的索引数据,则在master上创建备份否则,什么也不做。此命令对进行定期备份很有用。

支持的请求参数:

1numberToKeep:请求参数可以与backup命令一起使用,除非已在处理程序上指定了maxNumberOfBackups初始化参数---在这种情况下,始终使用maxNumberOfBackups并尝试使用numberToKeep请求参数将导致错误。

2name:(可选)备份名称,快照将在Core的数据目录内的名为snapshot.<name>的目录中创建。默认情况下,名称使用yyyyMMddHHmmssSSS格式的日期生成。如果传递location参数,那么将使用该参数,而不是数据目录。

3location:备份位置

http:// master_host:port   /solr/core_name/replication?command=deletebackup

删除使用backup命令创建的任何备份。

请求参数:

1name:快照的名称。快照的名字snapshot.<name>必须存在。如果不是,抛出一个错误。

2location:创建快照的位置



PS:本人水平有限,如有翻译错误,请指正!!!!!

点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群