2015-10-15 96 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以驗證它是否正在運行。