Azure应用服务-在Jetty上运行Solr-Azure维护后的LockObtainFailedException

时间:2018-12-20 10:01:32

标签: azure solr azure-web-app-service

我正在Azure应用程序服务上运行一个(未缩放的)solr实例。 App Service运行Java 8和Jetty 9.3容器。

一切正常,但是当Azure决定交换到另一个VM时,有时JVM似乎无法正常关闭,因此我们会遇到问题。

Azure决定交换到另一个VM的原因之一是基础结构维护。例如,安装了Windows Update,并将您的应用移动到另一台计算机上。

为防止停机,Azure启动了新应用程序,准备就绪后它将交换到新应用程序。看起来不错,但这似乎无法与solr的锁定机制配合使用。

我们使用的是默认的本机lockType,因为我们只运行一个实例,所以应该没问题。 Solr应该在关闭过程中删除write.lock文件,但这似乎并非一直存在。

Azure诊断工具清楚地显示了此事件的发生: enter image description here

并且内存使用情况显示两个应用程序: enter image description here

在第二个实例开始时,solr尝试锁定索引,但这是不可能的,因为第一个实例仍在使用它(它也有write.lock文件)。有时第一个不会删除write.lock文件,而这就是问题所在。 没有手动干预(手动删除write.lock文件),第二个solr实例将永远无法正常工作。

solr日志:

Caused by: org.apache.solr.common.SolrException: Index dir 'D:\home\site\wwwroot\server\solr\****\data\index/' of core '*****' is already locked. The most likely cause is another Solr server (or another solr core in this server) also configured to use this directory; other possible causes may be specific to lockType: native

org.apache.lucene.store.LockObtainFailedException

对此可以做什么? 我当时正在考虑将lockType更改为基于内存的锁,但是我不确定这是否行得通,因为两个实例在短时间内都同时处于活动状态。

2 个答案:

答案 0 :(得分:1)

您可以尝试设置WEBSITE_DISABLE_OVERLAPPED_RECYCLING=1

重叠回收使得它可以在当前实例打开之前 应用程序关闭,新实例启动。在某些情况下可能会导致 文件锁定问题,在这种情况下,您可以尝试将其关闭:

Reference

答案 1 :(得分:0)

如果您想在没有任何锁的情况下运行Solr,可以通过在solrconfig.xml中指定而不是通常的<lockType>native</lockType>中进行操作来实现,可以使用<lockType>none</lockType>

显然,您需要谨慎使用此机制,因为不同的Solr实例可能会尝试同时更改索引,这可能会导致潜在的损坏。

列出所有可用的锁类型there