0

我有一个主中继从配置。使用此复制配置设置主/从/中继器<str name="replicateAfter">optimize</str>,下面的完整配置

<requestHandler name="/replication" class="solr.ReplicationHandler">
    <str name="commitReserveDuration">01:00:00</str>
    <lst name="master">
      <str name="enable">${Project.enable.master:false}</str>
      <str name="replicateAfter">${Project.master.setReplicateAfterCommit:}</str>
      <str name="replicateAfter">${Project.master.setReplicateAfterStartup:}</str>
      <str name="replicateAfter">optimize</str>
      <str name="confFiles"></str>
    </lst>
    <lst name="slave">
      <str name="enable">${Project.enable.slave:false}</str>
      <str name="masterUrl">/solr/someCoreName</str>
      <str name="pollInterval">${Newton.replication.pollInterval:00:02:00}</str>
  </requestHandler>

中继器配置为每 1 秒轮询一次。N 个从站被配置为以不同的间隔轮询,以免下载请求压倒转发器,例如:2、4、6、8 分钟。两者都通过 java 启动命令 args。

现在,鉴于我在 master 上每 2 小时对 Master 索引进行一次优化,我希望 master 仅在优化后才能提供可复制的版本。但似乎,在X(可配置的)分钟后发生的每次提交后,主节点生成增加,中继器和从节点获得未优化的(但具有最新提交数据的最新状态)。

<updateHandler class="solr.DirectUpdateHandler2">
    <updateLog>
      <str name="dir">some/dir</str>
    </updateLog>

    <autoCommit>
      <maxDocs>10000000</maxDocs>
      <maxTime>${Project.autoCommit.maxTime:60000}</maxTime>
      <openSearcher>false</openSearcher>
    </autoCommit>
  </updateHandler>

看到主生成增量后的中继器/从属日志

2019-08-31 14:48:05,544 [INFO ][indexFetcher-15-thread-1][solr.handler.IndexFetcher][fetchLatestIndex()] - Master's generation: 6
2019-08-31 14:48:05,544 [INFO ][indexFetcher-15-thread-1][solr.handler.IndexFetcher][fetchLatestIndex()] - Master's version: 1567288083960
2019-08-31 14:48:05,544 [INFO ][indexFetcher-15-thread-1][solr.handler.IndexFetcher][fetchLatestIndex()] - Slave's generation: 5
2019-08-31 14:48:05,544 [INFO ][indexFetcher-15-thread-1][solr.handler.IndexFetcher][fetchLatestIndex()] - Slave's version: 1567288023785
2019-08-31 14:48:05,544 [INFO ][indexFetcher-15-thread-1][solr.handler.IndexFetcher][fetchLatestIndex()] - Starting replication process
2019-08-31 14:48:05,563 [INFO ][indexFetcher-15-thread-1][solr.handler.IndexFetcher][fetchLatestIndex()] - Number of files in latest index in master: 66
2019-08-31 14:48:05,624 [INFO ][indexFetcher-15-thread-1][solr.update.DefaultSolrCoreState][changeWriter()] - New IndexWriter is ready to be used.
2019-08-31 14:48:05,627 [INFO ][indexFetcher-15-thread-1][solr.handler.IndexFetcher][fetchLatestIndex()] - Starting download (fullCopy=false) to MMapDirectory@/data/<path>/index.20190831144805564 lockFactory=org.apache.lucene.store.NativeFSLockFactory@416c5340

问题:

我如何绝对确保仅在我发出的优化命令完成后才允许从 Master 到 Repeaters/Slaves 的索引流过?

笔记

一旦我发出优化,具有 1 个段的优化索引确实会按预期流向中继器/从属服务器,但发生在主服务器上的中间提交也会导致中继器/从属服务器下载新索引的一部分,使其段数 > 1,并且在段上搜索时减慢搜索速度size > 1 比在段大小 1 上搜索的成本更高。我只希望在发出定期(以代码编程)优化命令之后而不是在每次提交之后才需要新索引。我实际上删除了 master 上的提交持续时间,然后它只在优化后增加了它的生成,但是如果我完全删除提交,那么我们就有可能在 2 个优化周期之间丢失未提交的数据,并且机器恰好在这 2 个周期之间死亡。

Solr/luceneMatchVersion 版本

7.7.1

我也尝试添加 mergePolicyfactor 配置,但行为仍然相同

<mergePolicyFactory class="org.apache.solr.index.TieredMergePolicyFactory">
      <int name="maxMergeAtOnce">32</int>
      <int name="segmentsPerTier">32</int>
    </mergePolicyFactory>
4

1 回答 1

0

尝试更改<replicateAfter>commit</replicateAfter><replicateAfter>optimize</replicateAfter>

此外,如果它不起作用,请尝试从从站中删除轮询间隔配置。

您所看到的是 solr 的预期行为,没有什么不寻常的。尝试更改,我希望它应该可以正常工作。

于 2019-09-01T12:09:49.443 回答