Mesos 是一套成熟的分布式资源管理系统,应用场景非常广泛。

今天我们来学习 Mesos 的基本架构原理,并亲自动手部署一套 Mesos 集群环境。

Mesos 架构之基本概念

首先我们来看看,一个典型的 Mesos 集群包含的组件,以及各组件之间的关系。

以下是 Mesos 架构示意图:

Mesos Architecture

从图中可以看出 master 和 agent 进程,可以看到有执行任务所需的 framework,以及存储集群元数据的 zookeeper。

Master 和 Agent

Mesos 的进程包含 master 和 agent 两种角色。

master 管理整个集群的资源,依据策略为各个框架分配资源,调度所有节点少的 agent 进程。

agent 汇报并注册节点的资源状况,并管理本地执行的计算任务,启动/停止计算进程。

Mesos Framework

计算任务通过 Mesos 框架的形式提交到 mesos 集群。

Mesos 框架包括两部分:在 master 节点上注册的任务调度器 scheduler,和在 agent 上运行的任务进程 worker。

在分配资源方案,mesos-master 进程和 scheduler 有不同的分工。 分配资源时,master 决定给框架分配多少资源,scheduler 则从拿到的资源中具体来选择使用哪个资源来创建任务。

分配资源后,框架将任务的描述信息发给 mesos,由 mesos 调度在对应的 agent 上启动计算任务。

Zookeeper 和 HA

Zookeeper 在生产系统中用于存储元数据。

生产环境中,通过多节点的 Zookeeper 方案可以保证元数据达到较高可用性。 一般部署奇数个(3/5/7) Zookeeper 节点。 数量为奇数是为了防止选举 leader 时出现脑裂。 对于不同级别的可用性要求,一般部署 3 或者 5 个即可满足需求。

关于 zookeeper 集群,可以参考 zookeeper 官方文档

Mesos 之动手实践

方案

先确定下我们目标,部署一个基本的 Mesos 集群环境,包含的组件:

  • 1个 Zookeeper 进程
  • 1个 mesos-master 进程
  • 1个 mesos-agent 进程

系统环境

我们使用 mesosphere 提供的安装包,在 CentOS 7 系统上安装 mesos 及相关工具。

yum install -y http://repos.mesosphere.com/el-testing/7/noarch/RPMS/mesosphere-el-repo-7-3.noarch.rpm && \
yum update -y && \
yum install -y mesos mesosphere-zookeeper

如果有 docker 环境,还可以直接用这个事先做好的 docker 镜像来试用:

docker pull liulantao/mesos
docker run -i -t —rm —entrypoint /bin/bash liulantao/mesos

启动 Zookeeper

启动 zookeeper。 命令如下:

service start zookeeper

默认的 zookeeper 访问地址为 zk://127.0.0.1:2181

生产环境中,zookeeper 一般需要多节点组成高可用集群,可以参考官方文档对配置文件进行修改。

启动 mesos-master

启动 mesos master,指定使用 zookeeper 的访问地址,并指定本地工作目录。 命令如下:

mesos-master --quorum=1 --zk=zk://127.0.0.1:2181/mesos --ip=127.0.0.1 --work_dir=/var/lib/mesos/master

可以使用额外参数,如 --hostname 指定主机名或 ip,--cluster 指定集群名。

更多启动选项请参考:Mesos Configuration

Mesos master UI

mesos master 启动时进程会监听在指定的端口,默认是 5050。 所以,刚启动的 master 地址就是 http://127.0.0.1:5050

在浏览器打开 http://127.0.0.1:5050,可以看到 mesos 管理界面。

Mesos Master UI

在这个界面里,我们能看到整个集群的资源分配情况和框架的状态。 现在所有资源还是空,也没有任何进程。

启动 mesos-agent

启动 mesos agent,指定 master 地址,指定工作目录。 命令如下:

mesos-agent --master=127.0.0.1:5050 --work_dir=/var/lib/mesos/slave

可以使用额外参数,如 --containerizers 指定支持的容器技术。

更多启动选项请参考:Mesos Configuration

再打开 master UI,可以看到 Agents 数量变为 1。点击顶部的 Agents 标签,可以看到新加入的 agent 信息。

测试

安装测试框架

官方提供的测试框架例子在源码的 src/examples/java 目录下。 源码包可以通过下载 tar 包或者 Github 获得。

# 安装依赖包
$ sudo wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
$ sudo yum install -y epel-release
$ sudo yum groupinstall -y "Development Tools"
$ sudo yum install -y apache-maven python-devel java-1.8.0-openjdk-devel zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel cyrus-sasl-md5 apr-devel subversion-devel apr-util-devel maven

# 切换到源码目录
$ cd mesos

# 项目准备工作
$ ./bootstrap

# 开发进行编译
$ mkdir build && cd build
$ ../configure
$ make

执行测试框架

在 build 目录下,执行测试框架,命令如下:

./src/examples/java/test-framework 127.0.0.1:5050

执行完毕后,进程会自动退出。

查看测试结果

从 Master UI 上,打开 Frameworks 标签页,有 Completed Frameworks 一栏有执行成功的记录。

点击 framework id 进入详情页,能看到框架下各个 task 执行成功的情况。

Mesos Framework Detail

总结

通过以上过程,我们学会了:

  • Mesos 架构的基本概念
    • master 和 agent
    • framework
    • zookeeper 和 HA
  • 实践
    • 安装 mesos
    • 启动 mesos-master
    • 使用 mesos-ui
    • 启动 mesos-agent
    • 运行测试 framework