9

各位技术人员您好,

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

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

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

Solr 数据导入

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

重建索引

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

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

提交更新到实时核心

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

我希望你能理解我的情况和我的策略,如果我在你眼中做对了,我会给出建议。另外我想知道是否有我没有想到的瓶颈?我们正在运行 Solr 1.4 版。

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

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

提前致谢!

4

2 回答 2

2

好(而且很难)的问题!

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

关于复制,我会确保在交换主核心之前没有任何复制正在进行。有关复制如何工作的更多详细信息,如果您还没有完成,可以查看Solr wiki 。

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

于 2012-02-27T11:21:24.220 回答
1

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

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

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

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

此设计中还有更多的活动部件,监控过程的可靠性对于平稳运行至关重要。任何建议/替代方案?

于 2013-02-28T09:24:39.917 回答