各位技术人员大家好,

假设我们有一个每月有数百万访问者的 (PHP) 网站,并且我们在该网站上运行 SolR 索引,托管了 400 万个文档。Solr 在 4 台独立的服务器上运行,其中一台服务器是主服务器,其他 3 台服务器是复制服务器。

那里 每 5 分钟将数千个文档插入到 Solr 中。除此之外,用户可以更新他们的帐户,这也应该触发 solr 更新。

我正在寻找一种安全的策略来重建索引 快速地安全的 不遗漏任何文件。并拥有一个 安全的 增量/更新策略。我已经考虑过一个策略,我想与这里的专家分享,听听他们的意见,以及我是否应该采用这种方法,或者他们是否可能提出(完全)不同的建议。

Solr数据导入

对于所有操作,我想使用一个数据导入处理程序。我想将数据和增量导入混合到一个配置文件中,例如 DataImportHandlerDeltaQueryViaFullImport. 。我们使用 MySQL 数据库作为数据源。

重建索引

为了重建索引,我考虑以下几点;我们在“live”核心附近创建一个名为“reindex”的新核心。使用 dataimporthandler,我们完全重建了整个文档集(400 万个文档),总共需要大约 1-2 小时。在实时索引上,每分钟仍然有一些更新、插入和删除。

重建大约需要 1-2 小时后,新索引仍然不是最新的。为了缩短延迟,我们对新核心进行一次“增量”导入,以提交过去 1-2 小时内的所有更改。完成此操作后,将进行核心交换。每分钟运行的正常“增量”导入处理程序将选取这个新核心。

提交更新到 live core

为了保持我们的实时核心正常运行,我们每分钟运行一次增量导入。由于核心交换,重新索引核心(现在是实时核心)将被跟踪并保持最新状态。我猜如果这个索引延迟几分钟,那应该不是问题,因为 dataimport.properties 也会被交换?增量导入已经超过了这几分钟的延迟,但应该是可能的。

我希望您了解我的情况和我的策略,并可以建议我是否以您认为正确的方式做事。我也想知道是否存在我没​​有想到的瓶颈?我们正在运行 Solr 版本 1.4。

我确实有一个问题是,复制怎么样?如果主服务器交换核心,从服务器如何处理?

交换等时是否有丢失文件的风险?

提前致谢!

有帮助吗?

解决方案

好(又难)的问题!

完全导入是一项非常繁重的操作,通常最好运行增量查询以仅将索引更新为 RDMS 中的最新更改。我明白为什么当您需要进行完全导入时交换主版本:当完全导入在新核心上运行时,您可以使用增量导入来保持实时核心的最新状态,因为这需要两个小时。听起来不错,只要完全导入不那么频繁使用即可。

关于复制,我会确保在交换主核心之前没有任何复制正在进行。有关复制工作原理的更多详细信息,您可以查看 Solr 维基 如果你还没有这样做。

此外,我会确保在交换主核心之前,实时核心上没有运行任何增量导入。

其他提示

我们最后的情况略有改变。有两个 DataImportHandler - 一个用于完全导入,另一个用于增量导入。增量导入由 cron 每 3 小时触发一次,需要几分钟才能完成。完整导入约 1000 万份文档大约需要 48 小时(太疯狂了!)。其中很大一部分涉及网络延迟,因为每个文档都从 MySQL 表中获取大量数据。这两个表驻留在两个不同的 MySQL 服务器上,并且无法连接。

我们有一个“实时”核心,即具有增量导入的核心。我们引入另一个“重建”核心并执行完整索引,大约需要 48 小时才能完成。此时,我们跟踪已从“实时”核心更新/删除的所有文档,然后在“重建”核心中进行增量导入,以使它们都达到相同的状态。在正常情况下,一旦两个核心处于相同状态,我们将交换它们并从重建核心提供服务。(谁将监控重建核心是否已完成完整索引并已应用增量补丁?)

有时,我们希望“实时”和“重建”核心同时用于“ab 测试”。在那个时代,“实时”和“重建”核心都将具有增量导入以保持一致性,并且两者都将提供服务。根据结果​​,我们希望保留其中一个并通过交换删除另一个。

为了使整个设置运行稳定,我们计划引入一个监视进程,该进程将检查“重建”核心是否正在索引或已完成。如果它已建立索引,监控进程将使用增量文档更新它,并激活两个核心的增量索引 cron。ab 阶段完成后,其中一个核心将被卸载,另一个核心将被交换。然后额外的 crons 将被禁用。

该设计中存在较多的移动部件,监控过程的可靠性对于平稳运行至关重要。有什么建议/替代方案吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top