本文的作者是 Luke Marsden ,本文的原文地是 Deploying and migrating a multi-node ElasticSearch-Logstash-Kibana cluster using Docker
注:本文沒有全部翻譯,是摘取性翻譯,只翻譯本人認爲關鍵的部分。要看全文請看原文
設置 ELK
首先,對 ELK 的各種組件和它們所扮演的角色做一個快速預覽。
Logstash 接收日誌消息和轉發它們到 ElasticSearch
ElasticSearch 在數據庫中存儲這些日誌消息
Kibana 連接 ElasticSearch 來檢索這些日誌數據並通過一個 web 接口呈現它們
我們要做的第一件事情就是要把我們的三個應用以及它們的依賴關係打包進獨立的 Docker。我已經爲你做了這些,並放在 DockerHub 上:
部署 ELK 到一個多節點集羣
使用 Flocker 工作有兩個配置文件: application configuration 和 deployment configuration。讓我們首先看下 application configuration
。
application configuration
是一個非常簡單的 yaml 文件,它描述了你的應用是怎樣由多個能相互通信的 Docker 容器組成。爲此,我們通常把它作 application.yml
。如果你對 Docker 的 Fig 工具很熟悉的話,你將立刻認識到和 Flocker
的application yml
很多相似的地方。
下面是需要啓動所有三個容器的 application.yml
,還有端口映射,能讓它們彼此通信,以及在 ElasticSearch 容器中創建一個 Flocker-managed 的 Docker 數據卷。
"version": 1"applications": "elasticsearch": "p_w_picpath": "clusterhq/elasticsearch" "ports": - "internal": 9200 "external": 9200 "volume": "mountpoint": "/var/lib/elasticsearch/" "logstash": "p_w_picpath": "clusterhq/logstash" "ports": - "internal": 5000 "external": 5000 "links": - "local_port": 9200 "remote_port": 9200 "alias": "es" "kibana": "p_w_picpath": "clusterhq/kibana" "ports": - "internal": 8080 "external": 80
讓我們特別值得注意的幾件事:
ElasticSearch 應用有一個卷和掛載點指定,在這個例子中是
/var/lib/elasticsearch
,Flocker 的一大優點就是有能力在兩個主機之間可以遷移數據卷links
允許容器之間相互交流,甚至當它們位於不同的主機ports
代理一個 Docker 主機上的端口("external")到容器中的端口("internal")
部署 ElasticSearch
現在我們有我們自己的 ELK stack 鏡像和定義的 application.yml
。我們需要部署這些容器到多個主機上。我在我們前面提到的第二份配置文件 deployment configuration
中指定我想把我們的容器部署到哪裏。
在這個例子中,我們將部署每個服務到它自己的虛擬服務器。如果你希望這樣做,你實際上可以使用任何主機並且步驟在虛擬機上同樣有效。裸機,或是任何組合。比如,因爲性能原因,你想在裸機上運行 ElasticSearch,但是爲降低成本在虛機上運行 Logstash 和 Kibana,這取決於你,Flocker 是與底層主機無關的。
deployment config
也僅僅是一個 yaml 文件,deployment.yml
通過列出的一個或多個 IP 地址告訴 Flocker 去哪裏部署每個容器和定義在 application.yml
的應用別名。
在這個例子中,我們部署我們每個容器到不同的虛機:
"version": 1"nodes": "172.16.255.250": ["elasticsearch"] "172.16.255.251": ["logstash"] "172.16.255.252": ["kibana"]
當我們使用 Flocker 提供的 CLI 工具運行 flocker-deploy 命令的時候,容器將被自動部署,做好網絡和啓動我們在部署配置中定義的服務器。
alice@mercury:~/flocker-tutorial$ flocker-deploy deployment.yml application.yml alice@mercury:~/flocker-tutorial$
從一臺服務器把 ElasticSearch 的數據遷移到另外一臺
現在 ElasticSearch 已經在集羣的多個節點部署了。但如果其中一個你的 ElasticSearch 查詢消耗了你的 m3.large EC2 實例的 90% 可用內存,並且幾分鐘後你查詢不出爲什麼。你不能真的提供緩慢的性能直到你查出性能差勁的根本原因,因此你想把 ElasticSearch 遷移到一個更大內存的服務器,15 GB 內存的 m3.xlarge 。
使用 Flocker,這會變得非常容易。僅僅需要用新的 IP 地址更新你的 deployment.yml
,然後重新運行 flocker-deploy,你的 ElasticSearch 容器和它的數據卷將被自動移動到新的節點,將已經正式去原來節點的連接自動路由到新的節點。
老的:
"version": 1"nodes": "172.16.255.250": ["elasticsearch"] "172.16.255.251": ["logstash"] "172.16.255.252": ["kibana"]
新的:
"version": 1"nodes": "172.16.255.250": [] "172.16.255.251": ["logstash"] "172.16.255.252": ["kibana"] "172.16.255.253": ["elasticsearch"]
這裏說明了當你重新運行 flocker-deploy
從節點1去遷移 ElasticSearch 到節點2的時候發生了什麼:
Flocker 檢查是否你已經改變了你的配置
因爲它看起來你好像已經從 172.16.255.250 移動 ElasticSearch 到 172.16.255.253 了,它初始化一個遷移
遷移通過推送整個節點1的數據卷內容到節點2開始。在這個期間,節點1依然接受連接,因此你的用戶或其他依賴於那些數據的進程不會感受任何連接問題
一旦所有的數據被拷貝完,運行在節點1的應用被關閉
數據被複制過來之後的任何對數據卷的改變這時將被複制,依賴於你的數據庫多繁忙,這可能只是幾百kb 的變化
一旦這些最後的少許改變被複制過來,Flocker 不干涉節點2的卷
ElasticSearch 在節點2啓動
我們稱這個方式爲 two-phase 推送,因爲數據在兩個階段遷移。在第一階段,也是時間最長的階段,當數據卷被拷貝過來,數據庫繼續提供連接服務。它僅僅在第二階段,應用程序會經歷停機。我們正在積極地朝着一個世界,當應用運行在一個容器中,它們的數據可以在兩臺機器之間無縫遷移,甚至整個數據中心在一個基於虛機的世界靈活的移動。
我希望這篇文章對你部署和遷移 ELK 有用。如果想獲取更多信息,請移步 follow along with our step-by-step Getting Started guide 來學習安裝和使用 Flocker。除了 ElasticSearch 之外,我們還有部署和管理 MongoDB, PostgreSQL 和MySQL 的例子。