2015-10-15 76 views
-1

我下载了ElasticSearch,运行bin/elasticsearch.bat,它在我的本地计算机上运行。然后,我添加了elasticsearch文件夹到我的资料库,并更新了deploymentscript(deploy.cmd),加上几行:无法在Azure WebApp中启动ElasticSearch

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. 

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

推我的仓库到我的Azure的网站后,在日志中出现此错误

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

编辑:Could not reserve enough space for object heap看起来像我有较少的内存,但我已经尝试过了3.5GB与RAM和该错误也出现 - ElasticSearch只是我的本地机器上使用155 MB RAM)

EDIT2: 经过一番尝试我得到一个新的错误日志:

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] 

回答

0

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

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

如果要使用ElasticSearch,则应使用Azure VM或从Azure Marketplace设置Facetflow ElasticSearch。有关Azure VM上的Elastic的信息,请参阅https://azure.microsoft.com/en-us/documentation/templates/elasticsearch/,并参阅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/

+0

谢谢!我编辑了elasticsearch配置文件,以便它现在监听端口80(适用于本地计算机),但在我的WebApp部署中出现同样的错误。我已经在ES上使用了一个虚拟机,但是我想迁移到WebApp,因为我不想像VM那样拥有高维护。我将介绍一下Azure搜索,但我更喜欢WebApp中的ES。 – Munchkin

+0

@Munchkin Azure WebApp包含IIS代理,用于Java的Tomcat或Jetty Servlet容器,以及WebJob作为没有http侦听器的后端任务。它不适合独立的服务流程。部署脚本仅用于将Web项目部署到Azure中,而不用于启动服务。因此,如果您不想为ES使用虚拟机,我建议您在Azure预览门户市场中免费使用Facetflow ES。感谢您的反馈意见。关于Azure上关于ES的任何问题,请随时通知我。 –

1

我怀疑这是失败,因为它试图做出本地请求。有关Azure Web App沙箱限制的更多信息,请参阅this document

0

通过-Djava.net.preferIPv4Stack=true参数到elasticsearch.bat

还要确保JAVA_HOME被设置为Java 8,而不是Java 7中Azure上的Web应用程序的路径是D:\Program Files\Java\jdk1.8.0_25

也请记住,如果你运行在同一个虚拟机的多个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 

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

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

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