使用 Docker 部署和遷移多節點的 ElasticSearch-Logstash-Kibana 集羣

本文的做者是 Luke Marsden ,本文的原文地是 Deploying and migrating a multi-node ElasticSearch-Logstash-Kibana cluster using Dockerhtml

注:本文沒有所有翻譯,是摘取性翻譯,只翻譯本人認爲關鍵的部分。要看全文請看原文node

設置 ELK

首先,對 ELK 的各類組件和它們所扮演的角色作一個快速預覽。web

  • Logstash 接收日誌消息和轉發它們到 ElasticSearch
  • ElasticSearch 在數據庫中存儲這些日誌消息
  • Kibana 鏈接 ElasticSearch 來檢索這些日誌數據並經過一個 web 接口呈現它們

咱們要作的第一件事情就是要把咱們的三個應用以及它們的依賴關係打包進獨立的 Docker。我已經爲你作了這些,並放在 DockerHub 上:docker

部署 ELK 到一個多節點集羣

使用 Flocker 工做有兩個配置文件: application configurationdeployment configuration。讓咱們首先看下 application configuration數據庫

application configuration 是一個很是簡單的 yaml 文件,它描述了你的應用是怎樣由多個能相互通訊的 Docker 容器組成。爲此,咱們一般把它做 application.yml。若是你對 Docker 的 Fig 工具很熟悉的話,你將馬上認識到和 Flockerapplication 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

  • ElasticSearch 應用有一個卷和掛載點指定,在這個例子中是 /var/lib/elasticsearchFlocker 的一大優勢就是有能力在兩個主機之間能夠遷移數據卷
  • links 容許容器之間相互交流,甚至當它們位於不一樣的主機
  • ports 代理一個 Docker 主機上的端口("external")到容器中的端口("internal")

部署 ElasticSearch

如今咱們有咱們本身的 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 已經在集羣的多個節點部署了。但若是其中一個你的 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 以外,咱們還有部署和管理 MongoDBPostgreSQLMySQL 的例子。

相關文章
相關標籤/搜索