本文的做者是 Luke Marsden ,本文的原文地是 Deploying and migrating a multi-node ElasticSearch-Logstash-Kibana cluster using Dockerhtml
注:本文沒有所有翻譯,是摘取性翻譯,只翻譯本人認爲關鍵的部分。要看全文請看原文node
首先,對 ELK 的各類組件和它們所扮演的角色作一個快速預覽。web
咱們要作的第一件事情就是要把咱們的三個應用以及它們的依賴關係打包進獨立的 Docker。我已經爲你作了這些,並放在 DockerHub 上:docker
使用 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": "image": "clusterhq/elasticsearch" "ports": - "internal": 9200 "external": 9200 "volume": "mountpoint": "/var/lib/elasticsearch/" "logstash": "image": "clusterhq/logstash" "ports": - "internal": 5000 "external": 5000 "links": - "local_port": 9200 "remote_port": 9200 "alias": "es" "kibana": "image": "clusterhq/kibana" "ports": - "internal": 8080 "external": 80
讓咱們特別值得注意的幾件事:app
/var/lib/elasticsearch
,Flocker 的一大優勢就是有能力在兩個主機之間能夠遷移數據卷 links
容許容器之間相互交流,甚至當它們位於不一樣的主機ports
代理一個 Docker 主機上的端口("external")到容器中的端口("internal")如今咱們有咱們本身的 ELK stack 鏡像和定義的 application.yml
。咱們須要部署這些容器到多個主機上。我在咱們前面提到的第二份配置文件 deployment configuration
中指定我想把咱們的容器部署到哪裏。elasticsearch
在這個例子中,咱們將部署每一個服務到它本身的虛擬服務器。若是你但願這樣作,你實際上可使用任何主機而且步驟在虛擬機上一樣有效。裸機,或是任何組合。好比,由於性能緣由,你想在裸機上運行 ElasticSearch,可是爲下降成本在虛機上運行 Logstash 和 Kibana,這取決於你,Flocker 是與底層主機無關的。ide
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 查詢消耗了你的 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的時候發生了什麼:
咱們稱這個方式爲 two-phase 推送,由於數據在兩個階段遷移。在第一階段,也是時間最長的階段,當數據卷被拷貝過來,數據庫繼續提供鏈接服務。它僅僅在第二階段,應用程序會經歷停機。咱們正在積極地朝着一個世界,當應用運行在一個容器中,它們的數據能夠在兩臺機器之間無縫遷移,甚至整個數據中心在一個基於虛機的世界靈活的移動。
我但願這篇文章對你部署和遷移 ELK 有用。若是想獲取更多信息,請移步 follow along with our step-by-step Getting Started guide 來學習安裝和使用 Flocker。除了 ElasticSearch 以外,咱們還有部署和管理 MongoDB, PostgreSQL 和 MySQL 的例子。