我们正在为企业 Web 应用程序设计搜索架构。我们将为此使用 Lucene.net。索引不会很大(大约 100,000 个文档),但搜索服务必须始终处于运行状态并且始终处于最新状态。将一直有新文档添加到索引和并发搜索。由于我们必须为搜索系统提供高可用性,因此我们有 2 个应用程序服务器,它们公开 WCF 服务来执行搜索和索引(服务的副本在每个服务器中运行)。然后服务器使用 lucene.net API 来访问索引。
问题是,保持索引始终同步的最佳解决方案是什么?我们考虑了几个选项:
使用一台服务器进行索引并让第二台服务器通过 SMB 访问索引:不行,因为我们有单点故障情况;
对两台服务器建立索引,基本上每个索引都写入两次:可能性能很差,并且可能会出现不同步,例如。服务器 1 索引正常,服务器 2 磁盘空间不足或其他什么;
使用 SOLR 或 KATTA 包装对索引的访问:不,我们不能在服务器上运行 tomcat 或类似的东西,我们只有 IIS。
将索引存储在数据库中:我发现这可以使用 Lucene 的 java 版本(JdbcDirectory 模块)来完成,但我找不到与 Lucene.net 类似的任何东西。即使这意味着对性能的小幅影响,我们也会选择这个选项,因为它可以干净地解决最小开发的并发和同步问题。
使用 Lucene.net DistributedSearch contrib 模块:我无法提交包含有关此文档的单个链接。通过查看代码我什至不知道这段代码做了什么,但在我看来,它实际上将索引拆分到多台机器上,这不是我们想要的。
rsync 和朋友,在 2 个服务器之间来回复制索引:这对我们来说感觉很骇人且容易出错,而且,如果索引变大,可能需要一段时间,在此期间我们将返回损坏或不一致数据给客户端,所以我们必须制定一些我们不希望的临时锁定策略。
我知道这是一个复杂的问题,但我相信很多人以前都遇到过。欢迎任何帮助!