本文的做者是 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 的例子。