【问题标题】:Could not start ElasticSearch in Azure WebApp无法在 Azure WebApp 中启动 ElasticSearch
【发布时间】:2015-10-15 12:08:37
【问题描述】:

我下载了ElasticSearch,运行bin/elasticsearch.bat,它在我的本地机器上运行。然后我将 elasticsearch 文件夹添加到我的存储库并更新了部署脚本 (deploy.cmd),添加了以下几行:

echo starting ElasticSearch...
elasticsearch-1.7.2\bin\elasticsearch.bat
echo ElasticSearch started!

将我的存储库推送到我的 Azure 网站后,日志中出现此错误:

starting ElasticSearch...
Error occurred during initialization of VM
Error: Could not create the Java Virtual Machine.
Could not reserve enough space for object heap
Error: A fatal exception has occurred. Program will exit.

在我的 WebApp 的配置中打开了 Java。所以有什么问题?为什么无法创建 Java VM?

编辑:Could not reserve enough space for object heap 看起来我的 RAM 较少,但我已经尝试使用 3.5GB RAM 并且错误也发生了 - ElasticSearch 在我的本地计算机上仅使用 155 MB RAM)

编辑2: 经过一些尝试,我得到了一个新的错误日志:

starting ElasticSearch...
[2015-10-15 12:59:18,879][INFO ][node                     ] [Marsha Rosenberg] version[1.7.2], pid[3728], build[e43676b/2015-09-14T09:49:53Z]
[2015-10-15 12:59:18,879][INFO ][node                     ] [Marsha Rosenberg] initializing ...
[2015-10-15 12:59:19,273][INFO ][plugins                  ] [Marsha Rosenberg] loaded [], sites []
[2015-10-15 12:59:20,692][INFO ][env                      ] [Marsha Rosenberg] using [1] data paths, mounts [[Windows (D:)]], net usable_space [13.5gb], net total_space [32gb], types [NTFS]
[2015-10-15 12:59:28,869][INFO ][node                     ] [Marsha Rosenberg] initialized
[2015-10-15 12:59:28,869][INFO ][node                     ] [Marsha Rosenberg] starting ...
{1.7.2}: Startup Failed ...
- ChannelException[Failed to create a selector.]
    IOException[Unable to establish loopback connection]
        SocketException[Address family not supported by protocol family: bind]

【问题讨论】:

    标签: java azure elasticsearch azure-web-app-service


    【解决方案1】:

    我怀疑这是由于它尝试发出本地请求而失败的。有关 Azure Web App 沙盒限制的更多信息,请参阅this document

    【讨论】:

      【解决方案2】:

      根据我的经验,使用部署脚本在 Azure WebApp 上启动 ElasticSearch 不是正确的方法。

      在文档https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox 中,“网络端点监听”部分说“通过 Internet 访问应用程序的唯一方法是通过已经公开的 HTTP (80) 和 HTTPS (443) TCP 端口;应用程序可能不要在其他端口上侦听来自 Internet 的数据包。”所以我认为您的问题“无法创建 JavaVM”是由 ElasticSearch 无法将端口 9200 绑定为 HTTP 侦听器引起的。

      如果要使用 ElasticSearch,应使用 Azure VM 或从 Azure Marketplace 设置 Facetflow ElasticSearch。请参考https://azure.microsoft.com/en-us/documentation/templates/elasticsearch/了解Azure VM上的Elastic,参考https://azure.microsoft.com/en-us/marketplace/partners/facetflow/facetflow/了解Azure上的Facetflow ElasticSearch。

      即使您只想将搜索功能添加到您的 web 应用程序中,Azure 搜索也可能是一个不错的选择。关于 Azure 搜索,请参考https://azure.microsoft.com/en-us/documentation/services/search/

      【讨论】:

      • 谢谢!我编辑了 elasticsearch 配置文件,使其现在侦听端口 80(在我的本地计算机上工作),但在我的 WebApp 部署中遇到了同样的错误。我已经为 ES 使用了 VM,但我想迁移到 WebApp,因为我不想像使用 VM 那样进行高维护。我将研究一下 Azure 搜索,但我更喜欢 WebApp 中的 ES。
      • @Munchkin Azure WebApp 包含 IIS 代理、用于 Java 的 Tomcat 或 Jetty Servlet 容器,以及作为后端任务的 WebJob,没有 http(s) 侦听器。它不适合独立的服务进程。部署脚本仅用于将 Web 项目部署到 Azure,而不用于启动服务。因此,如果您不想为 ES 使用 VM,我建议您在 Azure 预览门户的 Marketplace 中免费使用 Facetflow ES。感谢您的反馈意见。对 Azure 上的 ES 有任何疑问,请随时告诉我。
      【解决方案3】:

      -Djava.net.preferIPv4Stack=true 参数传递给elasticsearch.bat

      还要确保 JAVA_HOME 设置为 Java 8 而不是 Java 7。Azure Web Apps 上的路径是 D:\Program Files\Java\jdk1.8.0_25

      另外请记住,如果您在同一个 VM(在同一个应用服务计划中)上运行多个 elasticsearch 服务器,它们不会都在 9200 上侦听。默认情况下,我认为 elasticsearch 会尝试来自9200 - 9300 的端口,因此请查看标准输出。

      您可能想在elasticsearch.yml 中禁用集群和自动发现,因为无论如何您都无法通过设置来形成集群

      node.local: true
      discovery.zen.ping.multicast: false
      index.number_of_shards: 1
      index.number_of_replicas: 0
      

      这对于测试/开发场景可能很好,但对于生产,你真的应该考虑在它自己的虚拟机或虚拟机集群上运行弹性搜索,这些虚拟机在自己的 VNET 中运行,并通过 VPN 将站点加入 VNET。然后,您将拥有一个受 VPN 保护的完整 elasticsearch 集群,并且网络应用程序将通过其私有 IP 与其通信。

      最后,请记住 elasticsearch.bat 正在阻止。如果您在 deploy.cmd 中执行此操作,它将永远阻止您的部署。 (不是真的永远,有一个超时,它会在最后杀死elasticsearch)。你想尝试从Kudu Console 运行它。基本上去https://<yourSitenName>.scm.azurewebsites.net/DebugConsole 你会有一个cmd 窗口来运行东西。您可以点击Use old console。新旧控制台之间的区别在于,新控制台是交互式的(您会在服务器上看到 stdout),但超时时间为 30 分钟,而旧控制台不是交互式的(只会显示输出一旦命令完成运行),但没有超时。

      在 elasticsearch 服务器运行时,打开另一个 Kudu 控制台实例并运行 curl localhost:9200 以验证它是否正在运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-29
        • 2015-06-17
        • 2020-03-20
        • 1970-01-01
        • 2016-05-15
        • 2023-03-28
        相关资源
        最近更新 更多