5

我们正在寻找一些关于在 Solr 中系统地重新索引不断增长的文档语料库(现在数千万,一年内数亿)而不降低当前运行的索引的建议。需要定期重新索引,因为:

  • 围绕搜索需要额外模式字段的现有语料库引入了新功能,我们不能总是提前预料到
  • 语料库跨多个分片编制索引。当它超过某个阈值时,我们需要创建更多的分片并在所有分片之间重新平衡文档(SolrCloud 似乎还不支持)。

当前索引接收非常频繁的更新和添加,需要在几分钟内可供搜索。因此,离线批量重新索引语料库的方法实际上并不奏效,因为当批处理完成时,新文档将可用。

我们目前正在研究的方法是:

  • 创建一个新的分片集群并在那里批量重新索引,同时旧集群仍可用于搜索。不属于重新索引批次的新文档将同时发送到旧集群和新集群。准备好切换时,将负载均衡器指向新集群。
  • 使用 CoreAdmin:为每个分片生成一个新核心并将重新索引的批次发送到新核心。不属于重新索引批次的新文档将同时发送到旧核心和新核心。准备好切换时,使用 CoreAdmin 动态交换内核。

如果人们能够确认或戳穿这些方法中的任何一种或所有方法,我们将不胜感激。一个比另一个更合适吗?还是我们完全关闭了?先感谢您。

4

1 回答 1

2

这可能不适用于你们,但我会提供解决这个问题的方法。

我们的 Solr 设置目前是单核的。我们将来会添加更多的内核,但绝大多数数据都写入单个内核。

考虑到这一点,分片并不真正适用于我们。我研究了分布式搜索——分割数据并在不同的服务器上运行不同的数据片段。对我来说,这似乎使事情复杂化了太多。这会使备份/恢复变得更加困难,并且在执行分布式搜索时最终会失去某些功能。

我们最终采用的方法是一个非常简单的集群主/从设置。

每个集群由一个主数据库和两个负载平衡的 solr 从属数据库组成。所有新数据都写入主数据库,从属数据库配置为每 5 分钟同步一次新数据。在正常情况下,这是一个非常好的设置。重新索引操作发生在主服务器上,在发生这种情况时,仍然可以从中读取从服务器。

当一个主要的重新索引操作发生时,我从负载均衡器中删除一个从属服务器并关闭另一个的轮询。因此,面向客户的 Solr 数据库现在没有与主数据库同步,而另一个正在更新。一旦重新索引完成并且离线从数据库同步,我将它添加回负载均衡器,从负载均衡器中删除另一个从数据库,并重新配置它以与主数据库同步。

到目前为止,这工作得很好。目前,我们的数据库中有大约 500 万份文档,并且这个数字将在多个集群中扩展得更高。

希望这可以帮助!

于 2011-05-22T17:06:55.637 回答