介绍
Mesosphere 是一个系统,它结合了许多组件以在现有操作系统层之上有效地管理服务器集群和高可用性部署。 与 CoreOS 等系统不同,Mesosphere 不是一个专门的操作系统,而是一组包。
在本指南中,我们将介绍如何在 Mesosphere 中配置高可用性集群。 此配置将为我们设置故障转移,以防我们的任何主节点出现故障,以及一个从服务器池来处理计划的任务。
我们将在本指南中使用 Ubuntu 14.04 服务器。
先决条件和目标
在完成本指南之前,强烈建议您查看我们的 对 Mesosphere 的介绍。 这是熟悉系统组成的组件并帮助您确定每个单元负责什么的好方法。
在本教程中,我们将使用六台 Ubuntu 服务器。 这满足了 Apache Mesos 的建议,即生产环境中至少要有三个 master。 它还提供了一个由三个工作服务器或从服务器组成的池,当任务发送到集群时,它们将被分配工作。
我们将使用的六台服务器将使用 zookeeper
来跟踪主服务器的当前领导者。 建立在此之上的 Mesos 层将提供分布式同步和资源处理。 它负责管理集群。 Marathon 是集群的分布式初始化系统,用于调度任务并将工作交给从服务器。
为了本指南的目的,我们将假设我们的机器具有以下配置:
主机名 | 功能 | IP地址 |
---|---|---|
大师1 | Mesos 大师 | 192.0.2.1 |
大师2 | Mesos 大师 | 192.0.2.2 |
大师3 | Mesos 大师 | 192.0.2.3 |
奴隶1 | 梅索斯奴隶 | 192.0.2.51 |
奴隶2 | 梅索斯奴隶 | 192.0.2.52 |
奴隶3 | 梅索斯奴隶 | 192.0.2.53 |
这些机器中的每一个都应该安装 Ubuntu 14.04。 您将需要完成我们的 Ubuntu 14.04 初始服务器设置指南 中列出的基本配置项。
完成上述步骤后,请继续阅读本指南。
在服务器上安装 Mesosphere
启动并运行集群的第一步是安装软件。 幸运的是,Mesosphere 项目维护了一个 Ubuntu 存储库,其中包含易于安装的最新软件包。
将 Mesosphere 存储库添加到您的主机
在主机(主机和从机)的 all 上,完成以下步骤。
首先,将 Mesosphere 存储库添加到您的源列表中。 这个过程包括从 Ubuntu 密钥服务器下载 Mesosphere 项目的密钥,然后为我们的 Ubuntu 版本制作正确的 URL。 该项目提供了一种方便的方法:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E56151BF DISTRO=$(lsb_release -is | tr '[:upper:]' '[:lower:]') CODENAME=$(lsb_release -cs) echo "deb http://repos.mesosphere.io/${DISTRO} ${CODENAME} main" | sudo tee /etc/apt/sources.list.d/mesosphere.list
安装必要的组件
将 Mesosphere 存储库添加到系统后,您必须更新本地包缓存才能访问新组件:
sudo apt-get -y update
接下来,您需要安装必要的软件包。 您需要的组件取决于主机的角色。
对于您的 master 主机,您需要 mesosphere
元包。 这包括 zookeeper
、mesos
、marathon
和 chronos
应用程序:
sudo apt-get install mesosphere
对于您的 slave 主机,您只需要 mesos
包,它还引入 zookeeper
作为依赖项:
sudo apt-get install mesos
为 Mesos 设置 Zookeeper 连接信息
我们要做的第一件事是配置我们的 zookeeper
连接信息。 这是允许我们所有主机连接到正确主服务器的底层,因此从这里开始是有意义的。
我们的主服务器将是我们 zookeeper
集群的唯一成员,但我们所有的服务器都需要一些配置才能使用该协议进行通信。 定义它的文件是 /etc/mesos/zk
。
在您的主机的 all 上,完成以下步骤。 使用 root 权限打开文件:
sudo nano /etc/mesos/zk
在里面,你会发现连接 URL 默认设置为访问本地实例。 它看起来像这样:
zk://localhost:2181/mesos
我们需要修改它以指向我们的三个主服务器。 这是通过将 localhost
替换为我们的第一个 Mesos 主服务器的 IP 地址来完成的。 然后我们可以在端口规范之后添加一个逗号并复制格式以将我们的第二个和第三个主节点添加到列表中。
对于我们的指南,我们的主服务器的 IP 地址为 192.0.2.1
、192.168.2.2
和 192.168.2.3
。 使用这些值,我们的文件将如下所示:
zk://192.0.2.1:2181,192.0.2.2:2181,192.0.2.3:2181/mesos
该行必须以 zk://
开头并以 /mesos
结尾。 在这两者之间,指定了主服务器的 IP 地址和 zookeeper
端口(默认为 2181
)。
完成后保存并关闭文件。
在您的每个主人和奴隶中使用这个相同的条目。 这将帮助每个单独的服务器连接到正确的主服务器以与集群通信。
配置主服务器的 Zookeeper 配置
在您的 master 服务器上,我们需要做一些额外的 zookeeper
配置。
第一步是为每个主服务器定义一个唯一的 ID 号,从 1 到 255。 这保存在 /etc/zookeeper/conf/myid
文件中。 现在打开它:
sudo nano /etc/zookeeper/conf/myid
删除此文件中的所有信息并将其替换为一个数字,从 1 到 255。 您的每台主服务器都必须有一个唯一编号。 为简单起见,最简单的方法是从 1 开始并逐步向上。 我们将使用 1、2 和 3 作为我们的指南。
我们的第一个服务器将在文件中包含以下内容:
1
完成后保存并关闭文件。 在您的每台主服务器上执行此操作。
接下来,我们需要修改我们的 zookeeper
配置文件以将我们的 zookeeper
ID 映射到实际主机。 这将确保服务可以从它使用的 ID 系统中正确解析每个主机。
现在打开 zookeeper
配置文件:
sudo nano /etc/zookeeper/conf/zoo.cfg
在此文件中,您需要将每个 ID 映射到主机。 主机规范将包括两个端口,第一个用于与领导者通信,第二个用于在需要新领导者时处理选举。 zookeeper
服务器由“服务器”标识,后跟一个点及其 ID 号。
对于我们的指南,我们将为每个函数使用默认端口,我们的 ID 为 1-3。 我们的文件将如下所示:
server.1=192.168.2.1:2888:3888 server.2=192.168.2.2:2888:3888 server.3=192.168.2.3:2888:3888
在每个主服务器的配置文件中添加这些相同的映射。 完成后保存并关闭每个文件。
至此,我们的 zookeeper
配置就完成了。 我们可以开始关注 Mesos 和 Marathon。
在主服务器上配置 Mesos
接下来,我们将在三台主服务器上配置 Mesos。 应该在您的每台主服务器上执行这些步骤。
修改仲裁以反映您的集群大小
首先,我们需要调整决策所需的法定人数。 这将确定集群处于正常运行状态所需的主机数量。
法定人数应设置为必须有超过 50% 的主成员在场才能做出决定。 但是,我们还希望建立一些容错能力,以便如果我们所有的主节点都不存在,集群仍然可以运行。
我们有三个主人,所以满足这两个要求的唯一设置是两个人的法定人数。 由于初始配置假定单个服务器设置,因此仲裁当前设置为 1。
打开仲裁配置文件:
sudo nano /etc/mesos-master/quorum
将值更改为“2”:
2
保存并关闭文件。 在每个主服务器上重复此操作。
配置主机名和 IP 地址
接下来,我们将为每个主服务器指定主机名和 IP 地址。 我们将使用 IP 地址作为主机名,这样我们的实例就不会出现正确解析的问题。
对于我们的主服务器,IP 地址需要放在这些文件中:
- /etc/mesos-master/ip
- /etc/mesos-master/主机名
首先,在 /etc/mesos-master/ip
文件中添加每个主节点的单独 IP 地址。 请记住为每个服务器更改此值以匹配适当的值:
echo 192.168.2.1 | sudo tee /etc/mesos-master/ip
现在,我们可以将此值复制到主机名文件中:
sudo cp /etc/mesos-master/ip /etc/mesos-master/hostname
在您的每台主服务器上执行此操作。
在主服务器上配置 Marathon
现在 Mesos 已经配置好了,我们可以配置 Marathon,Mesosphere 的集群初始化系统实现。
Marathon 将在我们的每台主控主机上运行,但只有领先的主控服务器才能实际调度作业。 其他 Marathon 实例将透明地代理请求到主服务器。
首先,我们需要为每个服务器的 Marathon 实例再次设置主机名。 同样,我们将使用文件中已有的 IP 地址。 我们可以将其复制到我们需要的文件位置。
但是,我们需要的 Marathon 配置目录结构并不是自动创建的。 我们必须创建目录,然后我们可以复制文件:
sudo mkdir -p /etc/marathon/conf sudo cp /etc/mesos-master/hostname /etc/marathon/conf
接下来,我们需要定义 Marathon 将连接到的 zookeeper
主机列表以获取信息和调度。 这与我们一直用于 Mesos 的 zookeeper
连接字符串相同,因此我们只需复制文件即可。 我们需要将它放在一个名为 master
的文件中:
sudo cp /etc/mesos/zk /etc/marathon/conf/master
这将允许我们的 Marathon 服务连接到 Mesos 集群。 但是,我们还希望 Marathon 将自己的状态信息存储在 zookeeper
中。 为此,我们将使用另一个 zookeeper
连接文件作为基础,只需修改端点。
首先,将文件复制到 Marathon zookeeper 位置:
sudo cp /etc/marathon/conf/master /etc/marathon/conf/zk
接下来,在编辑器中打开文件:
sudo nano /etc/marathon/conf/zk
我们需要在此文件中修改的唯一部分是端点。 我们将其从 /mesos
更改为 /marathon
:
zk://192.0.2.1:2181,192.0.2.2:2181,192.0.2.3:2181/marathon
这就是我们需要为 Marathon 配置做的所有事情。
配置服务初始化规则并重启服务
接下来,我们将重新启动主服务器的服务以使用我们一直在配置的设置。
首先,我们需要确保我们的主服务器只运行 Mesos 主进程,而不运行从进程。 我们可以停止任何当前正在运行的从属进程(这可能会失败,但这没关系,因为这只是为了确保进程停止)。 我们还可以通过创建覆盖文件来确保服务器不会在启动时启动从属进程:
sudo stop mesos-slave echo manual | sudo tee /etc/init/mesos-slave.override
现在,我们需要做的就是重新启动 zookeeper
,这将设置我们的主节点选举。 然后我们可以启动我们的 Mesos master 和 Marathon 进程:
sudo restart zookeeper sudo start mesos-master sudo start marathon
要了解您刚刚设置的内容,请在 Web 浏览器中的端口 5050
中访问您的主服务器之一:
http://192.168.2.1:5050
您应该会看到 Mesos 主界面。 You may be told you are being redirected to the active master depending on whether you connected to the elected leader or not. 无论哪种方式,屏幕看起来都类似于:
这是当前集群的视图。 没有太多可看的,因为没有可用的从节点,也没有启动任务。
我们还配置了 Mesosphere 长期运行的任务控制器 Marathon。 这将在您的任何主服务器上的端口 8080
上可用:
设置好从属设备后,我们将简要介绍如何使用这些接口。
配置从服务器
现在我们已经配置了主服务器,我们可以开始配置我们的从服务器。
我们已经用我们的主服务器的 zookeeper
连接信息配置了我们的从属服务器。 从站本身不运行自己的 zookeeper
实例。
我们可以停止当前在我们的从节点上运行的任何 zookeeper
进程并创建一个覆盖文件,以便在服务器重新启动时它不会自动启动:
sudo stop zookeeper echo manual | sudo tee /etc/init/zookeeper.override
接下来,我们要创建另一个覆盖文件以确保 Mesos 主进程不会在我们的从服务器上启动。 我们还将确保它当前已停止(如果进程已停止,此命令可能会失败。 这不是问题):
echo manual | sudo tee /etc/init/mesos-master.override sudo stop mesos-master
接下来,我们需要设置 IP 地址和主机名,就像我们为主服务器所做的那样。 这包括将每个节点的 IP 地址放入一个文件中,这次是在 /etc/mesos-slave
目录下。 我们也将使用它作为主机名,以便通过 Web 界面轻松访问服务:
echo 192.168.2.51 | sudo tee /etc/mesos-slave/ip sudo cp /etc/mesos-slave/ip /etc/mesos-slave/hostname
再次,将每个从服务器的单独 IP 地址用于第一个命令。 这将确保它被绑定到正确的接口。
现在,我们已经准备好启动我们的 Mesos slaves 了。 我们只需要开启服务:
sudo start mesos-slave
在您的每台从属机器上执行此操作。
要查看您的从属服务器是否成功在您的集群中注册,请返回到您的一台主服务器的端口 5050
:
http://192.168.2.1:5050
您现在应该在界面中看到“3”处的活动从站数量:
您还可以看到界面中的可用资源已更新,以反映您从机的池化资源:
要获取有关每台从机的更多信息,您可以单击界面顶部的“从机”链接。 这将为您提供每台机器的资源贡献的概述,以及每个从站的页面链接:
在 Mesos 和 Marathon 上启动服务
Marathon 是 Mesosphere 用于安排长时间运行任务的实用程序。 很容易将 Marathon 视为 Mesosphere 集群的初始化系统,因为它处理启动和停止服务、调度任务以及确保应用程序在出现故障时能够恢复。
您可以通过几种不同的方式将服务和任务添加到 Marathon。 我们将只涵盖基本服务。 Docker 容器将在以后的指南中处理。
通过 Web 界面启动服务
让服务在集群上快速运行的最直接的方法是通过 Marathon Web 界面添加应用程序。
首先,访问您的一个主服务器上的 Marathon Web 界面。 请记住,Marathon 接口在端口 8080
上:
http://192.168.2.1:8080
从这里,您可以单击右上角的“新应用程序”按钮。 这将弹出一个叠加层,您可以在其中添加有关新应用程序的信息:
填写应用程序要求的字段。 唯一必填的字段是:
- ID:用户选择的唯一ID,用于标识进程。 这可以是任何你想要的,但必须是独一无二的。
- Command:这是 Marathon 将运行的实际命令。 这是将被监视并在失败时重新启动的过程。
使用此信息,您可以设置一个简单的服务,它只打印“hello”并休眠 10 秒。 我们称之为“你好”:
当您返回该界面时,服务将从“Deploying”变为“Running”:
每隔 10 秒左右,“Tasks/Instances”读数将随着睡眠量过去和服务停止而从“1/1”变为“0/1”。 Marathon 然后再次自动重新启动任务。 我们可以在端口 5050
的 Mesos Web 界面中更清楚地看到这个过程:
http://192.168.2.1:5050
在这里,您可以看到进程完成并重新启动:
如果您在任何任务上单击“Sandbox”,然后单击“stdout”,您可以看到正在生成的“hello”输出:
通过 API 启动服务
我们也可以通过 Marathon 的 API 提交服务。 这涉及传入一个 JSON 对象,该对象包含叠加层包含的所有字段。
这是一个相对简单的过程。 同样,唯一需要的字段是进程标识符的 id
和包含要运行的实际命令的 cmd
。
因此,我们可以使用以下信息创建一个名为 hello.json
的 JSON 文件:
nano hello.json
在内部,最低限度的规格如下所示:
{ "id": "hello2", "cmd": "echo hello; sleep 10" }
这项服务可以正常工作。 但是,如果我们真的想模拟我们在 Web UI 中创建的服务,我们必须添加一些额外的字段。 这些在 Web UI 中是默认的,我们可以在这里复制它们:
{ "id": "hello2", "cmd": "echo hello; sleep 10", "mem": 16, "cpus": 0.1, "instances": 1, "disk": 0.0, "ports": [0] }
完成后保存并关闭 JSON 文件。
接下来,我们可以使用 Marathon API 提交它。 目标是我们在端口 8080
上的 master 的 Marathon 服务之一,端点是 /v2/apps
。 数据负载是我们的 JSON 文件,我们可以通过使用 -d
标志和 @
标志来指示文件,将其读入 curl
。
提交的命令如下所示:
curl -i -H 'Content-Type: application/json' -d@hello2.json 192.168.2.1:8080/v2/apps
如果我们查看 Marathon 界面,我们可以看到它已成功添加。 它似乎与我们的第一个服务具有完全相同的属性:
可以以与第一个服务完全相同的方式监视和访问新服务。
结论
此时,您应该已经启动并运行了一个生产就绪的 Mesosphere 集群。 我们此时只介绍了基本配置,但您应该能够看到利用 Mesosphere 系统的可能性。
在未来的指南中,我们将介绍如何在集群上部署 Docker 容器以及如何更深入地使用一些工具。