我有一个主中继从配置。使用此复制配置设置主/从/中继器<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>