使用 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 的例子。

相关文章
相关标签/搜索