帶有Vagrant和Virtualbox的Elasticsearch集羣

模擬分佈式存儲和計算環境的一種簡單方法是將Virtualbox作爲VM(“虛擬機”)的提供者,將Vagrant作爲配置,啓動和停止這些VM的前端腳本引擎。這篇文章的目標是構建一個集羣虛擬設備,將Elasticsearch作爲可由主機使用/控制的服務提供。可以從Github下載本文中使用的工件。

1.背景

面對不斷增長的前端需求,後端容量擴展通常通過用功能更強大的CPU / RAM /dish wise即所謂的“垂直縮放”來替換較弱的服務器來解決。這與“橫向縮放”相反,其中只需將更多服務器添加到混合中以處理額外需求。直覺上,後一種模式很有吸引力,因爲它看起來不那麼重要!在傳統的以RDBMS爲中心的應用程序中,沒有選擇,垂直擴展實際上是有意義的,因爲很難在大型分佈式數據表中進行連接。但垂直縮放有其侷限性,更重要的是,在達到這些限制之前,它們變得非常昂貴。爲了實現更簡單的水平伸縮而跳過關係(RDBMS的“R”)的NoSQL數據庫如今已成爲需要像facebook/google一樣進行大規模伸縮的應用程序的常用數據存儲。

讀者可以參考Hadoop:權威指南,其中Tom White深入研究了這些規模問題。在分佈式存儲和CPU上運行的應用程序必須處理自己的問題,例如讓CPU忙於“本地”數據,確保集羣成員彼此瞭解並知道誰擁有哪些數據,並且可能根據需要選擇leader/master進行協調,寫作等,因爲實施細節因系統而異。我們不打算深入研究這一切,但我們對這篇文章的目標更加務實:

  1. 開發一種方法來運行幾個節點(“客戶”)的虛擬集羣,其中現在的客戶是由Virtualbox從我的筆記本電腦中雕刻出來的。
  2. 通過機制在guest虛擬機羣集上安裝分佈式數據存儲Elasticsearch。
  3. 確認此“虛擬Elasticsearch設備”從主機提供完全可控的服務。

2. VirtualBox

我們使用Oracle的Virtualbox作爲來賓虛擬主機的提供商。Virtualbox可以免費使用,在我的Linux筆記本電腦上運行得非常好(我的筆記本電腦上是Ubuntu 15.04 64位,8核i7,2.2GHz CPU,16GB RAM),並且有關於如何控制要創建的主機的各個方面的大量文檔。還有預先構建的圖像以及任何數量的開源Linux發行版,您可以簡單地爲客戶操作系統添加這些圖像。它提供了各種網絡選項(有時我發現令人生畏),以擴展/限制guest的可訪問性/功能。出於我們的目的,我們更喜歡具有以下標準的“僅限主機”,“私人”網絡。

  • guest和host應該能夠互相交談。我們希望客戶組成一個集羣並一起工作以啓用服務。主機應該能夠控制和使用客戶羣提供的服務。
  • guest應該可以訪問互聯網。這樣他們就可以下載任何操作系統更新,以及運行任何應用程序所需的軟件包。
  • guest無法從外面進入guest。這只是一個彌補的要求,因爲我不想將服務暴露給外部。主機是服務的使用者,它可以將其轉換爲它自己的服務,如果它願意,它可以提供給外部。
  • 最後,爲了便於使用和移植,每個訪客在創建時應具有IP地址和名稱“已分配”。

安裝Virtualbox並創建各種VM非常簡單。根據我下載的預建圖像,我可以按照我想要的方式設置一個VM。使用適用於adapter1的NAT,僅適用於適配器2的NAT,以及激活VM上的僅主機接口。我想克隆它並建立其他客戶,但我有可能以可靠/可重複的方式正確地建立網絡。網絡從來都不是我的強項,在通過GUI和命令行玩網絡選項後,我放棄了嘗試掌握它。我相信網絡專家可以做到這一點,所以它肯定不是Virtualbox的限制,而是我的限制。

但更合理的是,我不想通過VirtualBox提供的GUI登錄guest虛擬機來設置內容或更糟糕 - 更改每個guest虛擬機的設置。這肯定不會擴展,重現的痛苦,並且容易出錯。我想要一種各種各樣的交鑰匙解決方案,其中我可以預先編寫VM羣集創建的所有方面,並且只需運行它就可以在安裝,啓動和飼養所有工具的情況下創建該羣集。

正如我高興地發現的那樣,Vagrant可以輕鬆地做到這一點。基本上,他們已經確定了'vboxmanage'命令(以及它們的選項)的確切順序,以運行來設置由某些高級要求指定的集羣......這正是我試圖做的,而且他們已經完成了!此外,由於使用Vagrant設置的羣集是基於文件的,我們可以對其進行版本化並與之共享(與OVA文件相比較小),以便將羣集準確地再現到其他位置。也許我有偏見是因爲我在網絡設置方面遇到的問題,但讀者可以參考類似於Why Vagrant? 或者我爲什麼要使用Vagrant而不僅僅是VirtualBox?的討論。Vagrant最終對我的真正吸引力在於它可以通過插件與其他VM提供商(如AWS,VMWARE)無縫協作,因此只需更改提供者名稱即可重複使用相同的配置文件/腳本。從我的筆記本電腦中挖出資源來構建虛擬機在這裏可以很好地降低機制,但它不會給出高性能的集羣!

3. Vagrant

花了很多話來試圖到達這裏,我們沒有進一步的追求。我們準備一個名爲'Vagrantfile'的文本文件,其中包含我們要構建的集羣的高級詳細信息。在命令提示符下運行將生成一個可以根據自己的喜好進行編輯的示例文件。以下是我們的文件如何滿足第2節中規定的要求。

Vagrantfile

# -  *  -  mode:ruby  -  *  - 

它是一個Ruby腳本,但是我不需要知道很多Ruby。這是它的作用的快速概述。

  • 我們想要建立一個2節點集羣(第3行)。
  • 我們選擇每個上的操作系統映像。如果之前尚未將圖像下載到本地倉庫('VirtualBox的默認機器文件夾')(第4行),Vagrant會下載它。
  • 我的筆記本電腦有16GB RAM,我想在任何時候都爲主機留下8gb。其餘部分由guest平分。同樣,客戶僅限於部分使用CPU。(第5,6行)
  • 我們遍歷每個guest:
    • 設置圖像(#13)和名稱(#14)。
    • 我們選擇' private_network '模式並設置IP地址(#15)。這爲我們提供了第2節中我們想要的網絡模型。
    • #19行,即將供應的工具和應用程序的虛擬機。非常強大和方便。我們可以使用我們希望客戶負責的應用程序自動化啓動集羣中每個成員的過程。無需爲每位guest提供服務並進行單獨安裝 - 節省大量時間!除了簡單的shell腳本外,Vagrant還允許其他機制,如Docker,Chef,Ansible,Puppet等,用於配置過程。在這裏,我們使用shell腳本'bootstrap.sh'來傳遞我們需要的參數,以設置Elasticsearch。

對於Vagrant來說,這一切都是真的。其餘的都是很好的舊shell腳本,我們老手 - 很棒!一旦腳本準備就緒,我們就會運行以啓動集羣,完成我們的工作並運行以關閉羣集。在我們運行之前,集羣將保留其apps / config / data,以便我們可以隨時運行以使用集羣及其服務。

4.供應Elasticsearch

這非常簡單。關鍵是要知道Vagrant會自動在主機和來賓之間啓用一個共享目錄。這是文件'Vagrantfile'所在的目錄。在guest虛擬機上,此目錄以“/ vagrant”的形式訪問。因此,如果我們在主機上有'Vagrantfile'的位置有'a / b / c / some_file'文件,則'some_file'可以作爲'/ vagrant / a / b / c / some_file'在訪客上訪問。我們使用此功能來共享我們需要在guest虛擬機上安裝的預先下載的軟件包,以及我們想要在啓動時間之後運行的任何腳本。 bootstrap.sh 腳本如下。

#!/usr/bin/env bash
nguests=$1
guestNumber=$2
memory=$3
ipAddressStart=$4
# Install some utilities that we will need
apt-get -y install unzip
apt-get -y install curl
# Install java
mkdir -p /opt/software/java
cd /opt/software/java ; tar zxvf /vagrant/tools/jdk-8u65-linux-x64.tar.gz
# Install & Start up elasticsearch
/vagrant/scripts/elastic.sh $nguests $guestNumber $memory $ipAddressStart

我們在第9行和第10行安裝了一些我們需要的實用工具。從第13行和第14行的共享位置安裝java。最後,我們運行下面的腳本在第17行安裝Elasticsearch。

elastic.sh

#!/usr/bin/env bash
usage="Usage: elastic.sh nguests thisguest memory ipAddressStart. Need the number of guests in the cluster, this guest number, es-heap memory in MB like 2048m, and startingIp like 192.168.0.5 if clustered ... "
# Install Elastic,  Configure & Start
function setUnicastHosts() {
  local unicast_guests="discovery.zen.ping.unicast.hosts: ["
  for i in $(seq 1 $nguests); do
    unicast_guests+='"guest-es'$i
    unicast_guests+=':9310"'
    if [ "$i" -ne "$nguests" ]; then
      unicast_guests+=','
    fi
  done
  unicast_guests+=']'
  echo "$unicast_guests"
}
# Add to /etc/hosts for convenience & restart networking...
function setEtcHosts() {
  guest_list=""
  for i in $(seq 1 $nguests); do
          guest_list+=$ipAddressStart$i' guest-es'$i
\n'
  done
  echo "$guest_list" > guests_to_be_added
  cat /etc/hosts guests_to_be_added > tmp ; mv tmp /etc/hosts
  /etc/init.d/networking restart
}
if [ "$#" -eq 4 ]; then
  nguests=$1
  thisguest=$2
  memory=$(expr $3 / 2)
  memory+="m"
  ES_HEAP_SIZE=$memory
  ipAddressStart=$4
  ES_HOME=/opt/software/elasticsearch/elasticsearch-1.7.2
  mkdir -p /opt/software/elasticsearch
  cd /opt/software/elasticsearch ; unzip /vagrant/tools/elasticsearch-1.7.2.zip
  cp /vagrant/elastic/start-node.sh $ES_HOME
  cp /vagrant/elastic/stop-node.sh $ES_HOME
  cp /vagrant/elastic/elasticsearch.yml $ES_HOME/config
  guest_name="guest-es"$thisguest
  node_name=$guest_name"-node1"
  unicast_guests=$(setUnicastHosts)
  if [ "$thisguest" -eq 1 ]; then
    mkdir -p $ES_HOME/plugins/kopf
    cd $ES_HOME/plugins/kopf ; tar zxvf /vagrant/elastic/kopf.tar.gz
  fi
  perl -0777 -pi -e "s|ES_HOME=/opt/elasticsearch|ES_HOME=$ES_HOME|" $ES_HOME/start-node.sh
  perl -0777 -pi -e "s/ES_HEAP_SIZE=2g/ES_HEAP_SIZE=$memory/" $ES_HOME/start-node.sh
  perl -0777 -pi -e "s/host_name=localhost/host_name=$guest_name/" $ES_HOME/start-node.sh
  perl -0777 -pi -e "s/host_name=localhost/host_name=$guest_name/" $ES_HOME/stop-node.sh
  perl -0777 -pi -e "s/node_name=node0/node_name=$node_name/" $ES_HOME/start-node.sh
  perl -0777 -pi -e "s/$/\n$unicast_guests/" $ES_HOME/config/elasticsearch.yml
else
  echo $usage
  exit 1
fi
setEtcHosts
$ES_HOME/start-node.sh

Elasticsearch節點是Elasticsearch的運行實例,服務器可以運行多個實例 - 當然資源允許。屬於羣集的所有節點都具有相同的“cluster.name”。從主機和guest虛擬機之間共享的一些樣板配置文件開始,上面的腳本根據在配置期間傳遞給每個guest虛擬機的參數來修改它們。所有訪客節點的文件'config / Elasticsearch.yml'將使用該羣集的所有成員列表進行擴充。

discovery.zen.ping.unicast.hosts :[ “guest-es1:9310” ,“guest-es2:9310” ]

setEtcHosts 功能附加

  • 192.168.1.51 guest-es1
  • 192.168.1.52 guest-es2

到每個guest虛擬機上的'/ etc / hosts'文件並重新啓動網絡。下面爲'guest2'準備的start-node.sh腳本運行以下命令來啓動Elasticsearch節點'guest-es2-node1'。

start-node.sh

/opt/software/elasticsearch/elasticsearch-1.7.2/bin/elasticsearch -d 
-Des.cluster.name=es-dev 
-Des.node.name=guest-es2-node1 
-Des.http.port=9210 
-Des.transport.tcp.port=9310 
-Des.path.data=/opt/software/elasticsearch/elasticsearch-1.7.2/data 
-Des.path.logs=/opt/software/elasticsearch/elasticsearch-1.7.2/logs 
-Des.path.plugins=/opt/software/elasticsearch/elasticsearch-1.7.2/plugins 
-Des.path.conf=/opt/software/elasticsearch/elasticsearch-1.7.2/config 
-Des.path.work=/opt/software/elasticsearch/elasticsearch-1.7.2/tmp 
-Des.network.host=guest-es2 -Des.network.publish_host=guest-es2 
-p /opt/software/elasticsearch/elasticsearch-1.7.2/pid

其中'es-dev'是我們正在構建的集羣的名稱。'guest1'啓動'guest-es1-node1'的命令與上面的命令相同,只是用'es1'替換'es2'。

我們只需運行vagrant up即可啓動虛擬彈性羣集 。因爲我們在配置期間在'guest1'上安裝了'kopf'插件,所以我們可以驗證羣集已啓動,可從主機訪問並準備投入使用。

我們通過運行vagrant halt關閉羣集。每當我們準備好從主機再次使用它時,我們只需運行vagrant up並且羣集將被備份。成功!我們已經建立了一種機制,可以根據虛擬集羣的需要將Elasticsearch作爲一項服務。

這就是這篇文章的全部內容。在以後的帖子中,我們將考慮擴展這個以在AWS上創建設備,以便我們可以做真正的工作。

原文標題《Elasticsearch Cluster with Vagrant and Virtualbox》

作者:Ashok Chilakapati

譯者:February

不代表雲加社區觀點,更多詳情請查看原文鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章