DotNetNuke Lucene Search在负载平衡的环境中无法正常工作“锁定获取超时”,如何解决?

时间:2019-02-07 15:53:30

标签: lucene dotnetnuke dotnetnuke-9

我们有一个DotNetNuke站点在两个负载平衡的服务器上运行。为了确保文件在这些服务器上同步,我们正在使用文件复制服务。

在没有负载平衡的情况下,在DotNetNuke上搜索可以正常工作,但是在负载平衡设置中,搜索会在一段时间后停止工作(没有建议,没有结果)。
我们的日志文件中都包含以下相关异常:

[D:2][T:31][ERROR] DotNetNuke.Services.Exceptions.Exceptions - Lucene.Net.Store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@D:\Sites\SiteName\App_Data\Search\write.lock
   at Lucene.Net.Store.Lock.Obtain(Int64 lockWaitTimeout)
   at Lucene.Net.Index.IndexWriter.Init(Directory d, Analyzer a, Boolean create, IndexDeletionPolicy deletionPolicy, Int32 maxFieldLength, IndexingChain indexingChain, IndexCommit commit)
   at Lucene.Net.Index.IndexWriter..ctor(Directory d, Analyzer a, MaxFieldLength mfl)
   at DotNetNuke.Services.Search.Internals.LuceneControllerImpl.get_Writer()
   at DotNetNuke.Services.Search.Internals.LuceneControllerImpl.Delete(Query query)
   at DotNetNuke.Services.Search.Internals.InternalSearchControllerImpl.DeleteSearchDocumentInternal(SearchDocument searchDocument, Boolean autoCommit)
   at DotNetNuke.Services.Search.Internals.InternalSearchControllerImpl.DeleteSearchDocumentsByModule(Int32 portalId, Int32 moduleId, Int32 moduleDefId)
   at DotNetNuke.Services.Search.SearchDataStore.StoreSearchItems(SearchItemInfoCollection searchItems)
   at DotNetNuke.Services.Search.SearchEngine.IndexContent()
   at DotNetNuke.Services.Search.SearchEngineScheduler.DoWork()

我最好的猜测是,此问题是由于两台服务器都在运行其搜索功能,并且文件复制服务正在同步文件而导致冲突。
解决此问题的最佳方法是什么?

  • 添加排除规则以不复制搜索索引文件夹,而是让两台服务器继续运行搜索吗?
  • 以某种方式禁止一台服务器建立索引?
  • 还有其他建议吗?

安装详细信息:
DNN v.09.02.00(366)
.NET Framework 4.6

2 个答案:

答案 0 :(得分:2)

如果我没记错的话,搜索是通过预定任务完成的。您是否尝试过将任务设置为仅在一个服务器上运行,然后使用文件复制同步到另一台服务器。

答案 1 :(得分:2)

在设置部分中有一个“计划程序”工具,其中包含所有CRON /后台作业功能。

DNN Scheduler Tool

后台工作之一是“搜索:网站爬网程序”,它负责为网站建立索引。当该作业在两台服务器上同时运行时,将发生意外冲突。为防止这种情况发生,您可以使用“服务器”设置将作业配置为仅在指定的服务器上运行。

Search: Site Crawler DNN Background Job

将作业配置为仅在一台服务器上运行后,问题不再出现,并且搜索仍然在两台服务器上都可以进行。

感谢@Sanjay向我指出了正确的方向。