本章简要介绍 Apache Mesos 和集群计算框架,并会逐步讲解如何在单节点和多节点上搭建 Mesos。 还会讲述如何使用 Vagrant 在 Amazon EC2 上搭建 Mesos 集群。 本书通篇会交替使 用 Apache Mesos 和 Mesos 两个术语。 本章包括如下内容:
现代应用程序高度依赖于数据。 企业生成并处理的数据呈指数级增长,这逐渐改变了我们 存储及处理数据的方式。 当为存储和处理数据规划现代基础架构时,已经无法仅仅通过购 买硬件扩容来解决问题了。 批量处理、 流处理、 面向用户服务、 图像处理及实时分析,这 些不同的框架变得和支撑它们运行的硬件同样重要。 这些框架才是数据中心世界里的支柱应用程序。
大数据的规模和多样性导致,对于现代工作负载而言,传统的扩容策略已经落伍。 因此, 大型企业转向分布式处理,把大量计算机当成单个巨型机器来使用。 很多资源需求各异的 应用程序共享集群,多种架构之间高效共享资源的关键是力争达到资源的高利用率。 需要 将所有的小型机器整合成单个大型计算机。 Mesos 天生就是这些计算机集群的核心。
传统做法是,各种框架分别单独运行,在框架间静态划分资源,这样会导致资源的使用效 率很低。 将大量日常机器当作单个大型机器使用,能够在所有框架之间弹性地共享资源, 这些需求都要求集群计算框架。 Mesos 的灵感来源于集群内多个框架之间共享资源和提供 资源隔离性的想法。
在现代集群里,不同的框架所要求的计算需求会非常不同,企业需要运行多种框架,并在其间共享数据和资源。 资源管理程序面临巨大的挑战和互为矛盾的目标:
Mesos 是集群管理器,力争通过在多种框架之间动态共享资源来优化资源使用率。 该项目 于 2009 年由位于 Berkeley 的加利福尼亚大学发起,已经在很多公司的生产环境上使用过, 包括 Twitter 和 Airbnb。 2013 年 7 月,在该项目孵化大概两年时,就成为 Apache 的最高级 别项目。
Mesos 在多种不同类型的工作之间共享机器(或者节点)的可用资源,如下图所示。 Mesos 可以看作是数据中心的内核,提供所有节点资源的统一视图,所起的作用类似于操作系统 内核在单台机器上的作用,可以无缝地访问多节点资源。 Mesos 提供了帮助构建数据中心 应用程序的核心程序,其核心组件是可伸缩的两阶段调度程序。 Mesos API 允许访问各种 不同的应用程序,而无须向 Mesos 核心程序提供特定领域的信息。因为关注于内核,Mesos 不会遇到中央式调度器天然存在的各种问题。
Mesos 作为数据中心内核
下列组件对于理解 Mesos 的整体架构至关重要。 本节会做简要介绍,之后第 6 章会更加详
细地探讨整体架构的细节。
master 负责在 slave 资源和框架之间进行调度。 任何时候,Mesos 只有一个活动的 master, 由 ZooKeeper 使用分布式一致性算法选举产生。 如果 Mesos 配置运行在容错模式下,会 通过分布式主选举协议选出一个 master,其他 slave 则处在待命模式。 从设计角度来讲, Mesos master 本身不会用来做任何重负载计算,这样简化了 master 的设计。 它以资源 offer 的形式将 slave 的资源提供给框架,并且根据已接受的 offer 在 slave 上启动任务。 它同时也 负责任务和框架之间的所有通信。
slave 是 Mesos 集群里真正工作的节点。 它们管理单个节点上的资源,遵守资源政策来适应业务优先级。 slave 管理各种资源,比如 CPU、内存、端口等,同时执行框架递交的任务。
框架是运行在 Mesos 上的应用程序,解决特定的问题。 每一种框架都包括调度程序和执行 程序。 调度程序负责决定接受还是拒绝资源 offer。 执行程序是资源消费者,运行在 slave 上,负责运行任务。
Mesos 给开发人员和运维人员都带来了巨大的好处。 它将不同的框架整合到统一的基础框 架上,不仅能够节约基础架构的花费,而且给运维团队带来了便利,也帮助开发人员简化 了基础架构的接口,最终有助于业务上的成功。 下面是企业应该使用 Mesos 的几点原因:
和传统的虚拟化基础架构相比,Mesos 有明显的优势:
既然我们已经了解了使用 Mesos 的优势,那么就来创建一个单节点的 Mesos 集群,开始Mesos 的探索之旅吧。
Mesos 可以在 Linux 和 Mac OS X 上运行。尝试使用 Mesos 的最简方式是搭建一台单机器的 Mesos,我们就从这里开始。 目前,Mesos 并没有为不同的操作系统提供二进制包,需要使 用者下载源代码进行编译。 社区里有编译好的可用二进制包。
Homebrew 是 Mac 上 Linux 风格的软件包管理器。Homebrew 支持 Mesos 的安装,在本地进
行编译。 Mac 上安装 Mesos 需要如下步骤:
1)安装 Homebrew,从 http://brew.sh/ 下载。
2) Homebrew 要求安装 Java。 Mac 自带 Java,因此只需确保 JAVA HOME 设置正确。
3) 使用 Homebrew 安装 Mesos,键入如下命令:
mac@master:˜ $ brew install mesos
虽然 Homebrew 提供了在 Mac 上搭建 Mesos 的方式,不过生产环境还是推荐在 Linux 上运行。
从 Fedora 21 开始,Fedora 仓库里包含 Mesos 软件包。其中,mesos-master 和 mesos-slave 软件包分别安装在 master 和 slave 上。 mesos 软件包包含 master 和 slave 的软件程序。 在版本
¿=21 的 Fedora 上安装 mesos 软件包,使用如下命令:
fedora@master:˜ $ sudo yum install -y mesos
现在就可以按照之后“启动 Mesos”小节的步骤来运行 Mesos。 对于版本小于 21 的 Fedora, 需要安装依赖软件包,然后编译源代码后进行安装,这种方式类似于 CentOS,会在后文中 详细介绍。
Mesos 要求安装如下依赖软件包:
另外,如果想从 git 库构建 Mesos 的话,还需要 autoconf(版本 1.12)和 libtool。 Mesos 的 安装在不同操作系统上有些区别,我们会详细介绍在 Ubuntu 14.10 和 CentOS 6.5 上安装 Mesos 的具体步骤。 在其他操作系统上的步骤与之类似。
按照下述步骤在 CentOS 上安装所需依赖软件包:
1)目前,CentOS 默认仓库不提供 >=1.8 的 SVN 库,需要手动添加所需仓库。 在/etc/yum.repos.d/ 下创建文件 wandisco-svn.repo,并添加如下行:
centos@master:˜ $ sudo vim /etc/yum.repos.d/wandisco-svn.repo
[WandiscoSVN] name=Wandisco SVN Repo
baseurl=http://opensource.wandisco.com/centos/6/svn-1.8/RPMS/$base arch/
enabled=1 gpgcheck=0
然后使用如下命令安装 libsvn:
centos@master:˜ $ sudo yum groupinstall -y "Development Tools"
2) Maven 的安装需要先下载,然后解压缩,并且放到 PATH 里。 如下命令会在下载完
成后将文件解压缩到 /opt 目录,并将 mvn 链接到 /usr/bin:
centos@master:˜ $ wget http://mirror.nexcess.net/apache/maven/maven
-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz
centos@master:˜ $ sudo tar -zxf apache-maven-3.0.5-bin.tar.gz -C
/opt/
centos@master:˜ $ sudo ln -s /opt/apache-maven-3.0.5/bin/mvn
/usr/bin/mvn
3)使用如下命令安装其他依赖软件包:
centos@master:˜ $ sudo yum install -y python-devel
java-1.7.0-openjdk-devel zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel cyrus-sasl-md5 apr-devel subversion-devel
使用如下命令在 Ubuntu 上安装所需依赖软件包:
ubuntu@master:˜ $ sudo apt-get -y install build-essential openjdk-6-jdk python-dev python-boto libcurl4-nss-dev libsasl2-dev libapr1-dev libsvn-dev maven
一旦所需软件都安装完成,就可以按照如下步骤构建 Mesos:
1)从 http://mesos.apache.org/downloads/ 下载最新的稳定版本。撰写本书时, 最新版本是 0.21.0。 将文件 mesos-0.21.0.tar.gz 保存到某个目录下。 打开终 端,进入之前保存文件的目录,或者直接在终端运行如下命令下载 Mesos:
ubuntu@master:˜$ wget http://www.apache.org/dist/mesos/0.21.0/mesos
-0.21.0.tar.gz
2)使用如下命令解压缩 Mesos,并进入解压缩后的目录。 注意第二个命令会删除下载的 .tar 文件,并将解压缩的目录重命名,去掉版本号。
ubuntu@master:˜ $ tar -xzf mesos-*.tar.gz
ubuntu@master:˜ $ rm mesos-*.tar.gz ; mv mesos-* mesos
ubuntu@master:˜ $ cd mesos
3)创建 build 目录。该目录会包含编译后的 Mesos 二进制文件。该步骤是可选的,但 是推荐执行。这样可以将 build 出的文件发布到各个 slave,而无须在每个 slave 上都 编译一次:
ubuntu@master:˜/mesos $ mkdir build
ubuntu@master:˜/mesos $ cd build
4)运行 configure 脚本配置安装:
ubuntu@master:˜/mesos/build $ ../configure
configure 脚本支持构建环境的调优,可以运行 configure --help 查看详细参 数列表。 缺失了任何依赖的软件包,configure 脚本都会报告出来,用户可以回头重 新安装缺失的软件包。 一旦配置成功,就可以进入下一步。
5)使用 make 完成编译。 这一步可能会花一些时间。 第二个命令是 make check:
ubuntu@master:˜/mesos/build $ make ubuntu@master:˜/mesos/build $ make check
make check 会构建出示例框架。 现在就已经可以在 build 目录下直接运行 Mesos而无须进行安装了。
6)使用如下命令安装 Mesos:
ubuntu@master:˜/mesos/build $ make install
下表是 Mesos 提供的一系列命令:
安装完成后,就可以使用 mesos-local 命令启动本地 Mesos 集群,该命令会在单个进程里同
时启动 master 和 slave 程序,可以帮助快速检查 Mesos 是否正确安装。
启动 Mesos 进程。 首先,需要为 Mesos replicated log 创建目录,并赋予目录读写权限:
ubuntu@master:˜ $ sudo mkdir -p /var/lib/mesos
ubuntu@master:˜ $ sudo chown ‘whoami‘ /var/lib/mesos
如下命令会使用上面创建的目录,启动 master:
ubuntu@master:˜ $ mesos-master --work_dir=/var/lib/mesos
I1228 07:29:16.367847 2900 main.cpp:167] Build: 2014-12-26 06:31:26 by
ubuntu
I1228 07:29:16.368180 2900 main.cpp:169] Version: 0.21.0
I1228 07:29:16.387505 2900 leveldb.cpp:176] Opened db in 19.050311ms I1228 07:29:16.390425 2900 leveldb.cpp:183] Compacted db in 2.731972ms
...
I1228 07:29:16.474812 2900 main.cpp:292] Starting Mesos master
...
I1228 07:29:16.488203 2904 master.cpp:318] Master 20141228-072916-2517893
22-5050-2900 (ubuntu-master) started on master:5050
...
I1228 07:29:16.510967 2903 master.cpp:1263] The newly elected leader is master@master:5050 with id 20141228-072916-251789322-5050-2900
I1228 07:29:16.511157 2903 master.cpp:1276] Elected as the leading master!
...
上面的输出里显示了 build 版本、 master 使用的各种配置及集群里的 master ID。 slave 程序 应该能连上 master。slave 程序可以通过 --master 参数指定 master 的 IP 地址或者主机名。本 书假定运行 master 的机器主机名为 master,读者实际操作时需要根据机器情况使用正确的 主机名或者 IP 地址。
ubuntu@master:˜ $ mesos-slave --master=master:5050
I1228 07:33:32.415714 4654 main.cpp:142] Build: 2014-12-26 06:31:26 by
vagrant
I1228 07:33:32.415992 4654 main.cpp:144] Version: 0.21.0
I1228 07:33:32.416199 4654 containerizer.cpp:100] Using isolation: posix/
cpu,posix/mem
I1228 07:33:32.443282 4654 main.cpp:165] Starting Mesos slave
I1228 07:33:32.447244 4654 slave.cpp:169] Slave started on 1)@ master:5051 I1228 07:33:32.448254 4654 slave.cpp:289] Slave resources: cpus(*):2; mem(*):1961; disk(*):35164; ports(*):[31000-32000]
I1228 07:33:32.448619 4654 slave.cpp:318] Slave hostname: master
I1228 07:33:32.462025 4655 slave.cpp:602] New master detected at master@ master5050
...
如上输出证明 slave 已经连接上了 master,并且列出了 slave 资源。 至此,集群启动成功,已经有一个运行着的 slave 以供随时运行框架。
Mesos 包含了多种使用 C++、 Java 和 Python 编写的示例测试框架。 这些框架可以用来验证集群是否配置正确。 如下测试框架使用 C++ 运行五个示例应用。 使用如下命令运行:
ubuntu@master:˜/mesos/build/src $ ./test-framework --master=master:5050 I1228 08:53:13.303910 6044 sched.cpp:137] Version: 0.21.0
I1228 08:53:13.312556 6065 sched.cpp:234] New master detected at master@
master:5050
I1228 08:53:13.313287 6065 sched.cpp:242] No credentials provided. Attempting to register without authentication
I1228 08:53:13.316956 6061 sched.cpp:408] Framework registered with 20141228-085231-251789322-5050-5407-0001
Registered!
Received offer 20141228-085231-251789322-5050-5407-O3 with mem(*):1961;
disk(*):35164; ports(*):[31000-32000]; cpus(*):2
Launching task 0 using offer 20141228-085231-251789322-5050-5407-O3 Launching task 1 using offer 20141228-085231-251789322-5050-5407-O3 Task 0 is in state TASK_RUNNING
Task 0 is in state TASK_FINISHED Task 1 is in state TASK_RUNNING Task 1 is in state TASK_FINISHED
Received offer 20141228-085231-251789322-5050-5407-O4 with mem(*):1961;
disk(*):35164; ports(*):[31000-32000]; cpus(*):2
Launching task 2 using offer 20141228-085231-251789322-5050-5407-O4
Launching task 3 using offer 20141228-085231-251789322-5050-5407-O4 Task 2 is in state TASK_RUNNING
Task 2 is in state TASK_FINISHED Task 3 is in state TASK_RUNNING Task 3 is in state TASK_FINISHED
Received offer 20141228-085231-251789322-5050-5407-O5 with mem(*):1961;
disk(*):35164; ports(*):[31000-32000]; cpus(*):2
Launching task 4 using offer 20141228-085231-251789322-5050-5407-O5 Task 4 is in state TASK_RUNNING
Task 4 is in state TASK_FINISHED
I1228 08:53:15.337805 6059 sched.cpp:1286] Asked to stop the driver I1228 08:53:15.338147 6059 sched.cpp:752] Stopping framework
’20141228-085231-251789322-5050-5407-0001’
I1228 08:53:15.338543 6044 sched.cpp:1286] Asked to stop the driver
如上输出显示框架连接到 master,并从 slave 接收了资源 offer。同时也显示了所启动任务的各种状态。 Java 示例框架在目录 src/example/java 下。
ubuntu@master:˜/mesos/build/src/examples/java $ ./test-framework master:5050
I1228 08:54:39.290570 7224 sched.cpp:137] Version: 0.21.0
I1228 08:54:39.302083 7250 sched.cpp:234] New master detected at master@ master:5050
I1228 08:54:39.302613 7250 sched.cpp:242] No credentials provided. Attempting to register without authentication
I1228 08:54:39.307786 7250 sched.cpp:408] Framework registered with 20141228-085231-251789322-5050-5407-0002
Registered! ID = 20141228-085231-251789322-5050-5407-0002
Received offer 20141228-085231-251789322-5050-5407-O6 with cpus: 2.0 and mem: 1961.0
Launching task 0 using offer 20141228-085231-251789322-5050-5407-O6 Launching task 1 using offer 20141228-085231-251789322-5050-5407-O6 Status update: task 1 is in state TASK_RUNNING
Status update: task 0 is in state TASK_RUNNING Status update: task 1 is in state TASK_FINISHED Finished tasks: 1
Status update: task 0 is in state TASK_FINISHED Finished tasks: 2
Received offer 20141228-085231-251789322-5050-5407-O7 with cpus: 2.0 and mem: 1961.0
Launching task 2 using offer 20141228-085231-251789322-5050-5407-O7 Launching task 3 using offer 20141228-085231-251789322-5050-5407-O7 Status update: task 2 is in state TASK_RUNNING
Status update: task 2 is in state TASK_FINISHED Finished tasks: 3
Status update: task 3 is in state TASK_RUNNING Status update: task 3 is in state TASK_FINISHED Finished tasks: 4
Received offer 20141228-085231-251789322-5050-5407-O8 with cpus: 2.0 and mem: 1961.0
Launching task 4 using offer 20141228-085231-251789322-5050-5407-O8 Status update: task 4 is in state TASK_RUNNING
Status update: task 4 is in state TASK_FINISHED Finished tasks: 5
I1228 08:54:41.788455 7248 sched.cpp:1286] Asked to stop the driver I1228 08:54:41.788652 7248 sched.cpp:752] Stopping framework
’20141228-085231-251789322-5050-5407-0002’
I1228 08:54:41.789008 7224 sched.cpp:1286] Asked to stop the driver
类似地,Python 示例框架在目录 src/example/python 下,输出还会显示 frameworkId和各种任务状态:
ubuntu@master:˜/mesos/build/src/examples/python $./test-framework master: 5050
I1228 08:55:52.389428 8516 sched.cpp:137] Version: 0.21.0
I1228 08:55:52.422859 8562 sched.cpp:234] New master detected at master@ master:5050
I1228 08:55:52.424178 8562 sched.cpp:242] No credentials provided. Attempting to register without authentication
I1228 08:55:52.428395 8562 sched.cpp:408] Framework registered with 20141228-085231-251789322-5050-5407-0003
Registered with framework ID 20141228-085231-251789322-5050-5407-0003
Received offer 20141228-085231-251789322-5050-5407-O9 with cpus: 2.0 and mem: 1961.0
Launching task 0 using offer 20141228-085231-251789322-5050-5407-O9 Launching task 1 using offer 20141228-085231-251789322-5050-5407-O9 Task 0 is in state TASK_RUNNING
Task 1 is in state TASK_RUNNING Task 0 is in state TASK_FINISHED
Received message: ’data with a /x00 byte’ Task 1 is in state TASK_FINISHED
Received message: ’data with a /x00 byte’
Received offer 20141228-085231-251789322-5050-5407-O10 with cpus: 2.0 and mem: 1961.0
Launching task 2 using offer 20141228-085231-251789322-5050-5407-O10 Launching task 3 using offer 20141228-085231-251789322-5050-5407-O10 Task 2 is in state TASK_RUNNING
Task 2 is in state TASK_FINISHED Task 3 is in state TASK_RUNNING Task 3 is in state TASK_FINISHED
Received message: ’data with a /x00 byte’ Received message: ’data with a /x00 byte’
Received offer 20141228-085231-251789322-5050-5407-O11 with cpus: 2.0 and mem: 1961.0
Launching task 4 using offer 20141228-085231-251789322-5050-5407-O11 Task 4 is in state TASK_RUNNING
Task 4 is in state TASK_FINISHED
All tasks done, waiting for final framework message Received message: ’data with a /x00 byte’
All tasks done, and all messages received, exiting
I1228 08:55:54.136085 8561 sched.cpp:1286] Asked to stop the driver I1228 08:55:54.136147 8561 sched.cpp:752] Stopping framework
’20141228-085231-251789322-5050-5407-0003’
I1228 08:55:54.136261 8516 sched.cpp:1286] Asked to stop the driver
Mesos 提供 Web UI 来展示 Mesos 集群信息。 可以从 <master-host>:<port> 处访问。 示例中是 http://master:5050 。报告里包括 slave、聚合资源、框架等信息。如下是 Web 接口的截图:
Mesos Web 接口
手动重复之前介绍的步骤,在每个 slave 节点上启动 mesos-slave,从而启动整个集群, 但是在大规模集群上,这样的手动操作既费时又容易出错。 Mesos 的 deploy 目录包含一系 列脚本,可以用来在集群上部署 Mesos。 这些脚本依赖于 SSH 完成部署。 需要搭建免密码 登录的 SSH。 下面开始搭建集群,包括两个 slave 节点(slave1、slave2)和一个 master 节点(master)。
在所有节点上都安装好所需依赖软件包之后,完成集群配置,确保节点机器之间可以互相
访问。 如下命令会生成 SSH 密钥,并将其复制到 slave 上:
ubuntu@master:˜ $ ssh-keygen -f ˜/.ssh/id_rsa -P "" ubuntu@master:˜ $ ssh-copy-id -i ˜/.ssh/id_rsa.pub ubuntu@slave1 ubuntu@master:˜ $ ssh-copy-id -i ˜/.ssh/id_rsa.pub ubuntu@slave2
将编译后的 Mesos 复制到两个 slave 上,放到和 master 相同的目录下:
ubuntu@master:˜ $ scp -R build slave1:[install-prefix]
ubuntu@master:˜ $ scp -R build slave2:[install-prefix]
在 [install-prefix]/var/mesos/deploy/masters 目录创建 masters 文件,可以使用任意编辑器,每一行表示一个 master,在本节示例中,只有一行,如下:
ubuntu@master:˜ $ cat [install-prefix]/var/mesos/deploy/masters master
类似地,slaves 文件列出所有想用作 Mesos slave 的节点:
ubuntu@master:˜ $ cat [install-prefix]/var/mesos/deploy/slaves slave1
slave2
现在,可以使用 mesos-start-cluster 脚本启动整个集群,使用 mesos-stop-cluster停止集群:
ubuntu@master:˜ $ mesos-start-cluster.sh
也可以顺序调用 mesos-start-masters 和 mesos-start-slaves, 这样也能正确地 在 master 节点和 slave 节点上启动相应程序。 该脚本会读取 [install-prefix]/var/ mesos/deploy/mesos-deploy-env.sh 里的环境配置。 另外,为了更好地进行配置管 理,master 和 slave 的配置参数可以分别定义到独立的 [install-prefix]/var/mesos/ deploy/mesos-master-env.sh 和 [install-prefix]/var/mesos/deploy/mesos- slave-env.sh 文件中。
Amazon 的 Elastic Compute Cloud(EC2)借助于虚拟机技术,提供了按使用情况付费的 资源访问计算能力,是试验 Mesos 的绝佳方式。 Mesos 提供脚本辅助实现在 EC2 上创建各 种不同配置的 Mesos 集群。mesos-ec2 脚本位于 ec2 目录下,允许启动、运行作业,卸载 整个 Mesos 集群。 注意,即使没有构建 Mesos,我们也可以使用该脚本,但是需要安装版 本 >=2.6 的 Python。 可以使用不同名称管理多个集群。
要使用 ec2 脚本, 需要 AWS 密钥对、 access key 和 access secret。 通过环境变量定义 access key 和 access secret。 使用 AWS 管理控制台( https://console.aws.amazon. com/console/home)创建并下载密钥对,并赋予 600 权限:
ubuntu@local:˜ $ chmod 600 my-aws-key.pem
ubuntu@local:˜ $ export AWS_ACCESS_KEY_ID=<your-access-key>
ubuntu@local:˜ $ export AWS_SECRET_ACCESS_KEY=<your-secret-key>
现在就可以使用 Mesos 提供的 EC2 脚本来启动新集群了,使用如下命令:
ubuntu@local:˜/mesos/ec2 $ ./mesos-ec2 -k <your-key-pair> -i
<your-identity-file> -s 3 launch ec2-test
这会启动一个名为 ec2-test,有三个 slave 的集群。 脚本执行完毕后,会打印出 Mesos 的 Web UI 链接,格式类似于 <master-hostname>:8080。访问这个 Web 接口可以验证集群 是否已经启动。 该脚本还提供了一些列参数,下表列举了其中一些。 可以运行 mesos-ec2--help 来查看所有可用参数:
可以使用 login 操作,通过集群名称登录到已启动的集群上,命令如下:
ubuntu@local:˜/mesos/ec2 $ ./mesos-ec2 -k <your-key-pair> -i
<your-identity-file> login ec2-test
该脚本还会在 /root/ephemeral-hdfs/ 目录下搭建 HDFS 实例,可以通过命令使用该实例。
最后,如下命令可以终止集群。 在终止某个集群前一定要备份好重要数据: ubuntu@local:˜/mesos/ec2 $ ./mesos-ec2 destroy ec2-test
该脚本还支持高级功能,比如用 EBS 后台实例来暂停和重启集群。 任何不清楚的地方请参 照 Mesos 文档。 另外要注意,Mesosphere( http://mesosphere.com )提供了在 Amazon EC2、 Google Cloud 及其他平台上创建弹性 Mesos 集群的便捷方式,和对 Mesos 的商业支 持。
Vagrant 提供了很好的方式来创建便携的虚拟环境,使用它可以很容易地在虚拟机里运行Mesos。 本节讲解如何使用 Vagrant 在虚拟机上创建单节点和多节点 Mesos 集群:
1)从 https://www.vagrantup.com/download.html 上下载并安装 Vagrant。Vagrant可以运行在所有主流操作系统上。
2)使用 Vagrant 插件搭建 Vagrant。 执行如下命令完成安装:
ubuntu@local:˜ $ vagrant plugin install vagrant-omnibus vagrant-berkshelf vagrant-hosts vagrant-cachier vagrant-aws
3)从 https://github.com/everpeace/vagrant-mesos/ 下载 Vagrant 配置文件,或者使用 git 克隆文件,并 cd 到目录下:
ubuntu@local:˜ $ git clone https://github.com/everpeace/vagrant- mesos.git ; cd vagrant-mesos
4)对于单节点集群搭建,cd 到 standalone 目录,运行 vagrant up 命令。 这样会 创建一台运行 Mesos master、 slave 和 ZooKeeper 实例的虚拟机。 从 http://192. 168.33.10:5050: 可以访问到 Mesos UI:
ubuntu@local:˜ $ cd standalone ; vagrant up
5)对于多节点集群搭建,cd 到 multinode 目录。 在 cluster.yml 文件里配置创建 多少台虚拟机用于 Mesos master、slave 和 ZooKeeper 实例。默认会创建五个虚拟机, 一台运行 ZooKeeper,两台运行 Mesos master 实例,两台运行 Mesos slave 实例。 从 http://172.31.1.11:5050 可以访问多节点环境的 Mesos Web UI:
ubuntu@local:˜ $ cd multinode ; vagrant up
6)Mesos 集群已经启动并运行。 可以通过 vagrant ssh 命令登录到这些机器上。 单 节点集群里使用 master 和 slave 作为主机名,而在多节点集群里,主机名是 master1、slave1 等:
ubuntu@local:˜ $ vagrant ssh master # to login to master
ubuntu@local:˜ $ vagrant ssh slave # to login to slave
7)可以使用 halt 命令停止虚拟机。 之后使用 up 命令再次启动虚拟机及整个 Mesos 集群。 最后,destroy 命令会删除所有 Vagrant 创建的虚拟机。 注意,必须相应地 在 standalone 或者 multinode 目录下执行 vagrant destroy 命令:
ubuntu@local:˜ $ vagrant halt
ubuntu@local:˜ $ vagrant destroy
Vagrant 搭建方式也允许很多不同的配置,同时支持启动 Amazon EC2 上的 Mesos 集群。 仓库里包含的 vagrant 文件和 README 文件里有更多详细内容。
虽然还是个较新的项目,Mesos 已经拥有了表现出色的社区( http://mesos.apache. org/community/)。 小型和大型企业都有很多使用 Mesos 的成功案例( http://mesos.apache.org/docume ... esos/ )。 企业可以使用 Mesos 干 很多事情,从网络服务的数据分析到数据存储框架。
很多企业将 Mesos 用于生产环境来简化基础架构管理。 本节列举了一些案例,介绍这些公司是如何使用 Mesos 的。
Twitter 是 Mesos 的第一位使用者,其在 Apache 还处于孵化阶段时就向促进 Mesos 项目发 展伸出援手。 Twitter 是一个实时社交平台,在可靠的基础架构的帮助下,解决了著名的“失 败鲸”难题。 Twitter 将 Mesos 作为其整个基础架构的基础,在 Mesos 平台上运行各种各样 的作业,包括分析、 广告平台、 预输入服务和消息基础架构。 所有 Twitter 构建的新服务 都是 Mesos 支撑的,更为重要的是,Mesos 帮助改变了开发人员对分布式环境资源的理 解。 现在开发人员会考虑使用资源的共享池,而不是像以前那样只考虑单台机器的资源。 Twitter 还构建了 Aurora 调度框架来管理在 Mesos 上长期运行的服务。
HubSpot 制造集客营销的产品。 HubSpot 在 Amazon EC2 上运行 Mesos,支持 150 多种不同 类型的服务。 Mesos 改进了资源使用率,在无须运行服务的多个拷贝的前提下确保了高可 用性,降低了基础架构的花费。 HubSpot 意识到使用 Mesos 开发人员能够更快地启动新服 务,服务能够更可靠更容易扩展。 HubSpot 在 Mesos 上创建了 Singularity 框架,并且构建 了平台即服务(Platform-as-a-Servie,PaaS)来促进服务的标准化部署。
Airbnb 是社区驱动的租赁公司,也是 Mesos 的最早使用者之一。 Airbnb 在 Mesos 上使 用 Hadoop、 Spark、 Kafka 及 Cassandra 和 Rails 这样的服务来完成数据分析。 Airbnb 也为 Mesos 创建了 Chronos 调度框架,本书会在第 5 章里详细讨论 Aurora 和 Chronos。
Twitter 的代码构建在 Ruby on Rails 和 JBoss-esque 框架上, 天生就是基于服务的, 而 Airbnb,从另一方面,更多地使用 Mesos 进行数据处理,天然是 ETL。 Twitter 在私有基 础架构上,使用 Solaris Zone 将 Mesos 运行在物理硬件上。 而 Airbnb 使用 AWS 上基于 VMware 和 Xen hypervisor 的虚拟机。这些案例都有力地证明了 Mesos 提供了通用且易于使 用的 API,能够胜任现代分布式基础框架的内核这一角色,可以在多种不同的硬件上运行, 并在其上为多种框架提供服务。
在 http://mesos.apache.org/documentation/latest/ 上有很多与 Mesos 相关的在 线文档,详细讲解了 Mesos 的绝大部分内容。 当文档信息不够时,Mesos 的用户邮件列表 是很好的平台,它使用户可以和其他成员交互,也是 Mesos 社区的关键组成部分。 用户邮 件列表( user@mesos.apache.org )和开发者邮件列表( dev@mesos.apache.org )都 非常活跃,可以讨论 Mesos 的开发和使用问题。
本章首先讲解了现代集群管理框架的概述,随后又演示了如何搭建 Mesos 集群。 至此,已 经可以在 Mesos 上运行多种框架了,接下来的几章会对它们进行深入介绍。 下一章将介绍 Mesos 上的 Hadoop 框架。