Lucene 索引复制和负载平衡

Lucene 索引复制和负载平衡,lucene,lucene.net,Lucene,Lucene.net,我在我的web门户中使用Lucene API,它将有1000个并发用户。 我们的web服务器将调用Lucene API,它将位于应用服务器上。我们计划使用2个应用服务器进行负载平衡。 有鉴于此,我们在第二台应用服务器上复制lucene索引的策略应该是什么?请提供任何提示?您可以使用,其中包含内置复制。这可能是最好、最简单的解决方案,因为实施您自己的复制方案可能需要大量的工作 也就是说,我将亲自做这件事,为我正在进行的一个项目。不同之处在于,因为我们在前端使用PHP,所以我们在接受查询并返回db主

我在我的web门户中使用Lucene API,它将有1000个并发用户。 我们的web服务器将调用Lucene API,它将位于应用服务器上。我们计划使用2个应用服务器进行负载平衡。 有鉴于此,我们在第二台应用服务器上复制lucene索引的策略应该是什么?请提供任何提示?

您可以使用,其中包含内置复制。这可能是最好、最简单的解决方案,因为实施您自己的复制方案可能需要大量的工作

也就是说,我将亲自做这件事,为我正在进行的一个项目。不同之处在于,因为我们在前端使用PHP,所以我们在接受查询并返回db主键列表的套接字服务器中实现了lucene。我的计划是将更改推送到服务器并存储在队列中,在队列中我将首先将它们存储到内存索引中,然后在负载足够低时将内存索引刷新到磁盘


不过,这是一件复杂的事情,在我们有一个足够可靠的稳定的最终解决方案之前,我已经着手做了大量的工作。

根据经验,Lucene应该可以扩展到数千个用户。也就是说,如果您只使用第二台应用服务器进行负载平衡,而不用于故障转移情况,那么您应该只在其中一台服务器上托管Lucene,并通过NDS(如果您有unix环境)或共享目录(在windows环境中)从第二台服务器访问它


同样,这取决于您的具体情况。如果您正在谈论索引中有数百万(5个或更多)文档,并且需要lucene索引具有故障切换功能,那么您可能需要研究Solr或Katta。

我们正在开发一个类似于您所描述的概念验证的实现。我们所看到的最终产品由三个独立的服务器组成

有一个“发布”服务器,负责生成将要使用的索引。有一个服务实现,它处理用于构建这些索引的工作流,并能够发出完成信号(通过WCF web服务公开的自定义管理API)

有两个“面向站点”的Lucene.NET服务器。通过WCF服务提供对API的访问。它们位于物理负载平衡器后面,会定期“ping”发布服务器,以查看是否有比当前运行的指示更新的指示集。如果是,它将从发布服务器请求锁定,并通过启动到本地“传入”文件夹的传输来更新本地索引。一旦找到了,就只需在附加索引时暂停搜索者。然后它释放锁,另一台服务器也可以这样做

正如我所说的,我们只是在接近概念验证阶段,用它来替代我们当前的解决方案,即负载平衡的Endeca集群。指数的大小以及实际完成所需任务所需的时间是有待证明的更大问题

只是一些我们正在考虑的随机事件:

  • 如果在接收数据的每台机器上使用两个本地文件夹以实现“循环”方法,则可以减少给定服务器的停机时间

  • 我们正在查看负载平衡器是否允许编程访问,以便从集群中删除和添加节点。这将减少用户在更新期间访问时遇到挂起的可能性

  • 在集群操作不可能的情况下,我们正在研究“请求转发”

  • 我们也看了索尔。虽然很多都是开箱即用的,但我们有一些时间来探索这条道路作为学习练习——学习Lucene.NET之类的东西,提高我们的WF和WCF技能,并为管理前端实现ASP.NET MVC。在最坏的情况下,我们会使用类似solr的工具,但我们已经在一些技能方面积累了经验,我们正在寻求改进


我正在将发布后端计算机上的索引创建到文件系统中,并将这些索引复制到市场营销中。 这样,每个负载和故障平衡的节点都有自己的索引,没有网络延迟

唯一的缺点是,您不应该尝试在已复制文件夹中重新创建索引,因为您将在每个节点上都有锁文件,在重新索引完成之前会阻塞indexreader