我正在使用NHibernate.Search程序集,正在寻找与多个Web服务器一起使用它的最佳实践。
我们的Web服务器上有足够的空间来处理我们正在生成的索引,所以我认为最好的方法是在每个Web服务器上都有索引。然后我索引的类添加一个版本列。我唯一的问题是,如果我这样做,NHibernate.Search是否足够聪明,可以提取最新记录并将其编入索引,如果让Web Server A更新记录并且Web Server B的索引已经过时了?
另一个选项是将索引存储在共享文件位置并从该网络资源中提取。这似乎是一个不太理想的解决方案,因为它不允许很大的冗余。
其他人如何使用NHibernate.Search和/或Lucene.NET索引来解决这个问题?
答案 0 :(得分:3)
当您决定将索引放在不同的计算机上时,您引入了“分布式搜索”问题。复制,冗余,管理,监控,搜索聚合等问题成为您需要解决的重要且有趣的问题。
尽管如此,Solr是该问题的推荐解决方案之一。更重要的是,SolrNet可以帮助您将其与Nhibernate集成。
我已经将这两个项目与Nhibernate结合使用了,它在开始时可能会有些混乱但以后会有所回报。
在您的情况下,您可以在Web服务器中运行Solr。
答案 1 :(得分:1)
我们使用NHibernate Search和Lucene.net支持的Master / Slave方法。
每个WebServer都有索引的从属副本,不进行索引。
每次网络服务器更新某些内容时,它都会向后端服务(我们使用带有msmq的Rhino ServiceBus)发送一条消息,该服务进行索引(通过加载更新的对象并重新编制索引)。
每隔10秒(我们需要最新的搜索 - 通常会有30分钟的宽限期)网络服务器将检查索引的新版本并在需要时获取它。它的工作非常好,因为更改是递增的,因此只有在我们进行优化或完全重新索引时才需要提取完整索引。
如果你需要更快的速度 - 你可以通过在web服务器上使用ram实现来优化它 - 但是在32 mb索引上使用非常复杂的通配符搜索,我们仍然远低于10 ms的查询。
另一个优化是让Web服务器执行索引,但只将增量副本发送到后端以附加到主索引。这样可以保存DB从后端服务调用,尽管有一定的复杂性,因为你必须深入了解NHibernate Search / Lucene的内容才能做到这一点。
答案 2 :(得分:0)
你的第一个想法是行不通的。服务器场的节点不会相互通信。它们依赖于共享资源,因为二级缓存是。 除此之外,您不需要单独的索引,因为它们将被解除同步。
共享文件位置是可行的方法。就冗余而言,我认为存储冗余相当微不足道,你可以从一个raid数组开始