DotNetNuke Lucene 搜索在负载平衡环境中不工作 'Lock obtain timed out',如何解决?
DotNetNuke Lucene Search not working 'Lock obtain timed out' in load balanced env, how to fix?
我们在两台负载平衡的服务器上有一个 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 诉 09.02.00 (366)
.NET 框架 4.6
如果我没记错的话,搜索是通过计划任务完成的。您是否尝试过仅在一台服务器上将任务设置为 运行,然后使用文件复制同步到另一台服务器。
设置部分中有一个 'scheduler' 工具,其中包含所有 CRON/background 作业功能。
后台作业之一是 'Search: Site Crawler' 作业,它负责为网站编制索引。当该作业同时在两台服务器上 运行 时,会发生意想不到的冲突。为防止这种情况发生,您可以使用 'Servers' 设置将作业配置为仅在指定服务器上 运行。
将作业配置为仅在一台服务器上 运行 后,问题没有再出现,搜索仍然适用于两台服务器。
感谢@Sanjay 为我指明了正确的方向。
我们在两台负载平衡的服务器上有一个 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 诉 09.02.00 (366)
.NET 框架 4.6
如果我没记错的话,搜索是通过计划任务完成的。您是否尝试过仅在一台服务器上将任务设置为 运行,然后使用文件复制同步到另一台服务器。
设置部分中有一个 'scheduler' 工具,其中包含所有 CRON/background 作业功能。
后台作业之一是 'Search: Site Crawler' 作业,它负责为网站编制索引。当该作业同时在两台服务器上 运行 时,会发生意想不到的冲突。为防止这种情况发生,您可以使用 'Servers' 设置将作业配置为仅在指定服务器上 运行。
将作业配置为仅在一台服务器上 运行 后,问题没有再出现,搜索仍然适用于两台服务器。
感谢@Sanjay 为我指明了正确的方向。