From 2cd0fac44bf45aa0ccb95e6b93fda13285a87025 Mon Sep 17 00:00:00 2001 From: Kang Huaishuai Date: Sun, 20 Dec 2020 22:58:09 +0800 Subject: [PATCH] remove mesos Signed-off-by: Kang Huaishuai --- .github/workflows/ci.yaml | 1 - SUMMARY.md | 8 - mesos/README.md | 6 - mesos/_images/marathon.png | Bin 13638 -> 0 bytes mesos/_images/marathon_basic0.png | Bin 27087 -> 0 bytes mesos/_images/mesos-architecture.png | Bin 46092 -> 0 bytes mesos/_images/mesos.png | Bin 28889 -> 0 bytes mesos/architecture.md | 83 ------ mesos/configuration.md | 172 ------------ mesos/framework.md | 89 ------ mesos/installation.md | 387 --------------------------- mesos/intro.md | 20 -- mesos/monitor.md | 110 -------- mesos/summary.md | 7 - 14 files changed, 883 deletions(-) delete mode 100644 mesos/README.md delete mode 100644 mesos/_images/marathon.png delete mode 100644 mesos/_images/marathon_basic0.png delete mode 100644 mesos/_images/mesos-architecture.png delete mode 100644 mesos/_images/mesos.png delete mode 100644 mesos/architecture.md delete mode 100644 mesos/configuration.md delete mode 100644 mesos/framework.md delete mode 100644 mesos/installation.md delete mode 100644 mesos/intro.md delete mode 100644 mesos/monitor.md delete mode 100644 mesos/summary.md diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 445529d..0806578 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -87,7 +87,6 @@ jobs: cp -r install/_images .vuepress/dist/install cp -r introduction/_images .vuepress/dist/introduction cp -r kubernetes/_images .vuepress/dist/kubernetes - cp -r mesos/_images .vuepress/dist/mesos cp -r underly/_images .vuepress/dist/underly echo "include: [_images]" > .vuepress/dist/_config.yml diff --git a/SUMMARY.md b/SUMMARY.md index 414e65c..e3ef168 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -170,14 +170,6 @@ * [附录五:如何调试 Docker](appendix/debug.md) * [附录六:资源链接](appendix/resources.md) * [归档](archive/README.md) - * [Mesos - 优秀的集群资源调度平台](mesos/README.md) - * [Mesos 简介](mesos/intro.md) - * [安装与使用](mesos/installation.md) - * [原理与架构](mesos/architecture.md) - * [Mesos 配置项解析](mesos/configuration.md) - * [日志与监控](mesos/monitor.md) - * [常见应用框架](mesos/framework.md) - * [本章小结](mesos/summary.md) * [Docker Machine](machine/README.md) * [安装](machine/install.md) * [使用](machine/usage.md) diff --git a/mesos/README.md b/mesos/README.md deleted file mode 100644 index ec9b7f4..0000000 --- a/mesos/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Mesos - 优秀的集群资源调度平台 -Mesos 项目是源自 UC Berkeley 的对集群资源进行抽象和管理的开源项目,类似于操作系统内核,用户可以使用它很容易地实现分布式应用的自动化调度。 - -同时,Mesos 自身也很好地结合和主持了 Docker 等相关容器技术,基于 Mesos 已有的大量应用框架,可以实现用户应用的快速上线。 - -本章将介绍 Mesos 项目的安装、使用、配置以及核心的原理知识。 \ No newline at end of file diff --git a/mesos/_images/marathon.png b/mesos/_images/marathon.png deleted file mode 100644 index 130c6649f0d0a3b3ed1552ef05d0c1af194bb8a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13638 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 diff --git a/mesos/_images/marathon_basic0.png b/mesos/_images/marathon_basic0.png deleted file mode 100644 index 2b8f920a0605a322030c565002425ff75baf1051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27087 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 HO~`)%avHv` diff --git a/mesos/architecture.md b/mesos/architecture.md deleted file mode 100644 index 22b1d85..0000000 --- a/mesos/architecture.md +++ /dev/null @@ -1,83 +0,0 @@ -## 原理与架构 - -首先,再次需要强调 Mesos 自身只是一个资源调度框架,并非一整套完整的应用管理平台,所以只有 Mesos 自己是不能干活的。但是基于 Mesos,可以比较容易地为各种应用管理框架或者中间件平台(作为 Mesos 的应用)提供分布式运行能力;同时多个框架也可以同时运行在一个 Mesos 集群中,提高整体的资源使用效率。 - -Mesos 对自己定位范围的划分,使得它要完成的任务很明确,其它任务框架也可以很容易的与它进行整合。 - -### 架构 -下面这张基本架构图来自 Mesos 官方。 - -![mesos 的基本架构](_images/mesos-architecture.png) - -可以看出,Mesos 采用了经典的主-从(master-slave)架构,其中主节点(管理节点)可以使用 zookeeper 来做 HA。 - -Mesos master 服务将运行在主节点上,Mesos slave 服务则需要运行在各个计算任务节点上。 - -负责完成具体任务的应用框架们,跟 Mesos master 进行交互,来申请资源。 - -### 基本单元 -Mesos 中有三个基本的组件:管理服务(master)、任务服务(slave)以及应用框架(framework)。 - -#### 管理服务 - master -跟大部分分布式系统中类似,主节点起到管理作用,将看到全局的信息,负责不同应用框架之间的资源调度和逻辑控制。应用框架需要注册到管理服务上才能被使用。 - -用户和应用需要通过主节点提供的 API 来获取集群状态和操作集群资源。 - -#### 任务服务 - slave -负责汇报本从节点上的资源状态(空闲资源、运行状态等等)给主节点,并负责隔离本地资源来执行主节点分配的具体任务。 - -隔离机制目前包括各种容器机制,包括 LXC、Docker 等。 - -#### 应用框架 - framework -应用框架是实际干活的,包括两个主要组件: - -* 调度器(scheduler):注册到主节点,等待分配资源; -* 执行器(executor):在从节点上执行框架指定的任务(框架也可以使用 Mesos 自带的执行器,包括 shell 脚本执行器和 Docker 执行器)。 - -应用框架可以分两种:一种是对资源的需求是会扩展的(比如 Hadoop、Spark 等),申请后还可能调整;一种是对资源需求大小是固定的(MPI 等),一次申请即可。 - -### 调度 -对于一个资源调度框架来说,最核心的就是调度机制,怎么能快速高效地完成对某个应用框架资源的分配,是核心竞争力所在。最理想情况下(大部分时候都无法实现),最好是能猜到应用们的实际需求,实现最大化的资源使用率。 - -Mesos 为了实现尽量优化的调度,采取了两层(two-layer)的调度算法。 - -#### 算法基本过程 -调度的基本思路很简单,master 先全局调度一大块资源给某个 framework,framework 自己再实现内部的细粒度调度,决定哪个任务用多少资源。两层调度简化了 Mesos master 自身的调度过程,通过将复杂的细粒度调度交由 framework 实现,避免了 Mesos master 成为性能瓶颈。 - -调度机制支持插件机制来实现不同的策略。默认是 Dominant Resource Fairness(DRF)。 - -*注:DRF 算法细节可以参考论文《Dominant Resource Fairness: Fair Allocation of Multiple Resource Types》。其核心思想是对不同类型资源的多个请求,计算请求的主资源类型,然后根据主资源进行公平分配。* - -#### 调度过程 -调度通过 offer 发送的方式进行交互。一个 offer 是一组资源,例如 `<1 CPU, 2 GB Mem>`。 - -基本调度过程如下: - -* 首先,slave 节点会周期性汇报自己可用的资源给 master; -* 某个时候,master 收到应用框架发来的资源请求,根据调度策略,计算出来一个资源 offer 给 framework; -* framework 收到 offer 后可以决定要不要,如果接受的话,返回一个描述,说明自己希望如何使用和分配这些资源来运行某些任务(可以说明只希望使用部分资源,则多出来的会被 master 收回); -* 最后,master 则根据 framework 答复的具体分配情况发送给 slave,以使用 framework 的 executor 来按照分配的资源策略执行任务。 - -具体给出一个例子,某从节点向主节点汇报自己有 `<4 CPU, 8 GB Mem>` 的空闲资源,同时,主节点看到某个应用框架请求 `<3 CPU, 6 GB Mem>`,就创建一个 offer `` 把满足的资源发给应用框架。应用框架(的调度器)收到 offer 后觉得可以接受,就回复主节点,并告诉主节点希望运行两个任务:一个占用 `<1 CPU, 2 GB Mem>`,一个占用 一个占用 `<2 CPU, 4 GB Mem>`。主节点收到任务信息后分配任务到从节点上进行运行(实际上是应用框架的执行器来负责执行任务)。任务运行结束后资源可以被释放出来。 - -剩余的资源还可以继续分配给其他应用框架或任务。 - -应用框架在收到 offer 后,如果 offer 不满足自己的偏好(例如希望继续使用上次的 slave 节点),则可以选择拒绝 offer,等待 master 发送新的 offer 过来。另外,可以通过过滤器机制来加快资源的分配过程。 - -#### 过滤器 -framework 可以通过过滤器机制告诉 master 它的资源偏好,比如希望分配过来的 offer 有哪个资源,或者至少有多少资源等。 - -过滤器可以避免某些应用资源长期分配不到所需要的资源的情况,加速整个资源分配的交互过程。 - -#### 回收机制 -为了避免某些任务长期占用集群中资源,Mesos 也支持回收机制。 - -主节点可以定期回收计算节点上的任务所占用的资源,可以动态调整长期任务和短期任务的分布。 - -### HA - -从架构上看,最为核心的节点是 master 节点。除了使用 ZooKeeper 来解决单点失效问题之外,Mesos 的 master 节点自身还提供了很高的鲁棒性。 - -Mesos master 节点在重启后,可以动态通过 slave 和 framework 发来的消息重建内部状态,虽然可能导致一定的时延,但这避免了传统控制节点对数据库的依赖。 - -当然,为了减少 master 节点的负载过大,在集群中 slave 节点数目较多的时候,要避免把各种通知的周期配置的过短。实践中,可以通过部署多个 Mesos 集群来保持单个集群的规模不要过大。 diff --git a/mesos/configuration.md b/mesos/configuration.md deleted file mode 100644 index bacec5d..0000000 --- a/mesos/configuration.md +++ /dev/null @@ -1,172 +0,0 @@ -## Mesos 配置项解析 - -Mesos 支持在运行时通过命令行参数形式提供的配置项。如果是通过系统服务方式启动,也支持以配置文件或环境变量方式给出。当然,实际上最终是提取为命令行参数传递给启动命令。 - -Mesos 的配置项分为三种类型:通用项(master 和 slave 都支持),只有 master 支持的,以及只有 slave 支持的。 - -Mesos 配置项比较多,下面对一些重点配置进行描述。少数为必备项,意味着必须给出配置值;另外一些是可选配置,自己带有默认值。 - -### 通用项 -通用项数量不多,主要涉及到服务绑定地址和日志信息等,包括: - -* `--advertise_ip=VALUE` 可以通过该地址访问到服务,比如应用框架访问到 master 节点; -* `--advertise_port=VALUE` 可以通过该端口访问到服务; -* `--external_log_file=VALUE` 指定存储日志的外部文件,可通过 Web 界面查看; -* `--firewall_rules=VALUE` endpoint 防火墙规则,`VALUE` 可以是 JSON 格式或者存有 JSON 格式的文件路径; -* `--ip=VALUE` 服务绑定到的IP 地址,用来监听外面过来的请求; -* `--log_dir=VALUE` 日志文件路径,如果为空(默认值)则不存储日志到本地; -* `--logbufsecs=VALUE` buffer 多少秒的日志,然后写入本地; -* `--logging_level=VALUE` 日志记录的最低级别; -* `--port=VALUE` 绑定监听的端口,master 默认是 5050,slave 默认是 5051。 - -### master 专属配置项 -这些配置项是针对主节点上的 Mesos master 服务的,围绕高可用、注册信息、对应用框架的资源管理等。用户应该根据本地主节点资源情况来合理的配置这些选项。 - -用户可以通过 `mesos-master --help` 命令来获取所有支持的配置项信息。 - -必须指定的配置项有三个: - -* `--quorum=VALUE` 必备项,使用基于 replicated-Log 的注册表(即利用 ZooKeeper 实现 HA)时,参与投票时的最少节点个数; -* `--work_dir=VALUE` 必备项,注册表持久化信息存储位置; -* `--zk=VALUE` 如果主节点为 HA 模式,此为必备项,指定 ZooKeepr 的服务地址,支持多个地址,之间用逗号隔离,例如 `zk://username:password@host1:port1,host2:port2,.../path`。还可以为存有路径信息的文件路径。 - - -可选的配置项有: - -* `--acls=VALUE` ACL 规则或所在文件; -* `--allocation_interval=VALUE` 执行 allocation 的间隔,默认为 1sec; -* `--allocator=VALUE` 分配机制,默认为 HierarchicalDRF; -* `--[no-]authenticate` 是否允许非认证过的 framework 注册; -* `--[no-]authenticate_slaves` 是否允许非认证过的 slaves 注册; -* `--authenticators=VALUE` 对 framework 或 salves 进行认证时的实现机制; -* `--cluster=VALUE` 集群别名,显示在 Web 界面上供用户识别的; -* `--credentials=VALUE` 存储加密后凭证的文件的路径; -* `--external_log_file=VALUE` 采用外部的日志文件; -* `--framework_sorter=VALUE` 给定 framework 之间的资源分配策略; -* `--hooks=VALUE` master 中安装的 hook 模块; -* `--hostname=VALUE` master 节点使用的主机名,不配置则从系统中获取; -* `--[no-]log_auto_initialize` 是否自动初始化注册表需要的 replicated 日志; -* `--modules=VALUE` 要加载的模块,支持文件路径或者 JSON; -* `--offer_timeout=VALUE` offer 撤销的超时; -* `--rate_limits=VALUE` framework 的速率限制,即 query per second (qps); -* `--recovery_slave_removal_limit=VALUE` 限制注册表恢复后可以移除或停止的 slave 数目,超出后 master 会失败,默认是 100%; -* `--slave_removal_rate_limit=VALUE slave` 没有完成健康度检查时候被移除的速率上限,例如 1/10mins 代表每十分钟最多有一个; -* `--registry=VALUE` 注册表信息的持久化策略,默认为 `replicated_log` 存放本地,还可以为 `in_memory` 放在内存中; -* `--registry_fetch_timeout=VALUE` 访问注册表失败超时; -* `--registry_store_timeout=VALUE` 存储注册表失败超时; -* `--[no-]registry_strict` 是否按照注册表中持久化信息执行操作,默认为 false; -* `--roles=VALUE` 集群中 framework 可以所属的分配角色; -* `--[no-]root_submissions` root 是否可以提交 framework,默认为 true; -* `--slave_reregister_timeout=VALUE` 新的 lead master 节点选举出来后,多久之内所有的 slave 需要注册,超时的 salve 将被移除并关闭,默认为 10mins; -* `--user_sorter=VALUE` 在用户之间分配资源的策略,默认为 drf; -* `--webui_dir=VALUE` webui 实现的文件目录所在,默认为 `/usr/local/share/mesos/webui`; -* `--weights=VALUE` 各个角色的权重; -* `--whitelist=VALUE` 文件路径,包括发送 offer 的 slave 名单,默认为 None; -* `--zk_session_timeout=VALUE` session 超时,默认为 10secs; -* `--max_executors_per_slave=VALUE` 配置了 `--with-network-isolator` 时可用,限制每个 slave 同时执行任务个数。 - -下面给出一个由三个节点组成的 master 集群典型配置,工作目录指定为 `/tmp/mesos`,集群名称为 `mesos_cluster`。 - -```sh -mesos-master \ ---zk=zk://10.0.0.2:2181,10.0.0.3:2181,10.0.0.4:2181/mesos \ ---quorum=2 \ ---work_dir=/tmp/mesos \ ---cluster=mesos_cluster -``` - - -### slave 专属配置项 -slave 节点支持的配置项是最多的,因为它所完成的事情也最复杂。这些配置项既包括跟主节点打交道的一些参数,也包括对本地资源的配置,包括隔离机制、本地任务的资源限制等。 - -用户可以通过 `mesos-slave --help` 命令来获取所有支持的配置项信息。 - -必备项就一个: - -* `--master=VALUE` 必备项,master 所在地址,或对应 ZooKeeper 服务地址,或文件路径,可以是列表。 - -以下为可选配置项: - -* `--attributes=VALUE` 机器属性; -* `--authenticatee=VALUE` 跟 master 进行认证时候的认证机制; -* `--[no-]cgroups_enable_cfs` 采用 CFS 进行带宽限制时候对 CPU 资源进行限制,默认为 false; -* `--cgroups_hierarchy=VALUE` cgroups 的目录根位置,默认为 `/sys/fs/cgroup`; -* `--[no-]cgroups_limit_swap` 限制内存和 swap,默认为 false,只限制内存; -* `--cgroups_root=VALUE` 根 cgroups 的名称,默认为 mesos; -* `--container_disk_watch_interval=VALUE` 为容器进行硬盘配额查询的时间间隔; -* `--containerizer_path=VALUE` 采用外部隔离机制(`--isolation=external`)时候,外部容器机制执行文件路径; -* `--containerizers=VALUE` 可用的容器实现机制,包括 mesos、external、docker; -* `--credential=VALUE` 加密后凭证,或者所在文件路径; -* `--default_container_image=VALUE` 采用外部容器机制时,任务缺省使用的镜像; -* `--default_container_info=VALUE` 容器信息的缺省值; -* `--default_role=VALUE` 资源缺省分配的角色; -* `--disk_watch_interval=VALUE` 硬盘使用情况的周期性检查间隔,默认为 1mins; -* `--docker=VALUE` docker 执行文件的路径; -* `--docker_remove_delay=VALUE` 删除容器之前的等待时间,默认为 6hrs; -* `--[no-]docker_kill_orphans` 清除孤儿容器,默认为 true; -* `--docker_sock=VALUE` docker sock 地址,默认为 `/var/run/docker.sock`; -* `--docker_mesos_image=VALUE` 运行 slave 的 docker 镜像,如果被配置,docker 会假定 slave 运行在一个 docker 容器里; -* `--docker_sandbox_directory=VALUE` sandbox 映射到容器里的哪个路径; -* `--docker_stop_timeout=VALUE` 停止实例后等待多久执行 kill 操作,默认为 0secs; -* `--[no-]enforce_container_disk_quota` 是否启用容器配额限制,默认为 false; -* `--executor_registration_timeout=VALUE` 执行应用最多可以等多久再注册到 slave,否则停止它,默认为 1mins; -* `--executor_shutdown_grace_period=VALUE` 执行应用停止后,等待多久,默认为 5secs; -* `--external_log_file=VALUE` 外部日志文件; -* `--fetcher_cache_size=VALUE` fetcher 的 cache 大小,默认为 2 GB; -* `--fetcher_cache_dir=VALUE` fetcher cache 文件存放目录,默认为 /tmp/mesos/fetch; -* `--frameworks_home=VALUE` 执行应用前添加的相对路径,默认为空; -* `--gc_delay=VALUE` 多久清理一次执行应用目录,默认为 1weeks; -* `--gc_disk_headroom=VALUE` 调整计算最大执行应用目录年龄的硬盘留空量,默认为 0.1; -* `--hadoop_home=VALUE` hadoop 安装目录,默认为空,会自动查找 HADOOP_HOME 或者从系统路径中查找; -* `--hooks=VALUE` 安装在 master 中的 hook 模块列表; -* `--hostname=VALUE` slave 节点使用的主机名; -* `--isolation=VALUE` 隔离机制,例如 `posix/cpu,posix/mem`(默认)或者 `cgroups/cpu,cgroups/mem`、`external` 等; -* `--launcher_dir=VALUE` mesos 可执行文件的路径,默认为 `/usr/local/lib/mesos`; -* `--image_providers=VALUE` 支持的容器镜像机制,例如 'APPC,DOCKER'; -* `--oversubscribed_resources_interval=VALUE` slave 节点定期汇报超配资源状态的周期; -* `--modules=VALUE` 要加载的模块,支持文件路径或者 JSON; -* `--perf_duration=VALUE` perf 采样时长,必须小于 perf_interval,默认为 10secs; -* `--perf_events=VALUE` perf 采样的事件; -* `--perf_interval=VALUE` perf 采样的时间间隔; -* `--qos_controller=VALUE` 超配机制中保障 QoS 的控制器名; -* `--qos_correction_interval_min=VALUE` Qos 控制器纠正超配资源的最小间隔,默认为 0secs; -* `--recover=VALUE` 回复后是否重连旧的执行应用,reconnect(默认值)是重连,cleanup 清除旧的执行器并退出; -* `--recovery_timeout=VALUE` slave 恢复时的超时,太久则所有相关的执行应用将自行退出,默认为 15mins; -* `--registration_backoff_factor=VALUE` 跟 master 进行注册时候的重试时间间隔算法的因子,默认为 1secs,采用随机指数算法,最长 1mins; -* `--resource_monitoring_interval=VALUE` 周期性监测执行应用资源使用情况的间隔,默认为 1secs; -* `--resources=VALUE` 每个 slave 可用的资源,比如主机端口默认为 [31000, 32000]; -* `--[no-]revocable_cpu_low_priority` 运行在可撤销 CPU 上容器将拥有较低优先级,默认为 true。 -* `--slave_subsystems=VALUE` slave 运行在哪些 cgroup 子系统中,包括 memory,cpuacct 等,缺省为空; -* `--[no-]strict` 是否认为所有错误都不可忽略,默认为 true; -* `--[no-]switch_user` 用提交任务的用户身份来运行,默认为 true; -* `--work_dir=VALUE` framework 的工作目录,默认为 /tmp/mesos。 - -下面这些选项需要配置 `--with-network-isolator` 一起使用(编译时需要启用 ` --with-network-isolator` 参数)。 - -* `--ephemeral_ports_per_container=VALUE` 分配给一个容器的临时端口的最大数目,需要为 2 的整数幂(默认为 1024); -* `--eth0_name=VALUE` public 网络的接口名称,如果不指定,根据主机路由进行猜测; -* `--lo_name=VALUE` loopback 网卡名称; -* `--egress_rate_limit_per_container=VALUE` 每个容器的输出流量限制速率限制(采用 fq_codel 算法来限速),单位是字节每秒; -* `--[no-]-egress_unique_flow_per_container` 是否把不同容器的流量当作彼此不同的流,避免彼此影响(默认为 false); -* `--[no-]network_enable_socket_statistics` 是否采集每个容器的 socket 统计信息,默认为 false。 - -下面给出一个典型的 slave 配置,容器为 Docker,监听在 `10.0.0.10` 地址;节点上限制 16 个 CPU、64 GB 内存,容器的非临时端口范围指定为 [31000-32000],临时端口范围指定为 [32768-57344];每个容器临时端口最多为 512 个,并且外出流量限速为 50 MB/s。 - -```sh -mesos-slave \ ---master=zk://10.0.0.2:2181,10.0.0.3:2181,10.0.0.4:2181/mesos \ ---containerizers=docker \ ---ip=10.0.0.10 \ ---isolation=cgroups/cpu,cgroups/mem,network/port_mapping \ ---resources=cpus:16;mem:64000;ports:[31000-32000];ephemeral_ports:[32768-57344] \ ---ephemeral_ports_per_container=512 \ ---egress_rate_limit_per_container=50000KB \ ---egress_unique_flow_per_container -``` - -为了避免主机分配的临时端口跟我们指定的临时端口范围冲突,需要在主机节点上进行配置。 -```sh -$ echo "57345 61000" > /proc/sys/net/ipv4/ip_local_port_range -``` - -*注:非临时端口是 Mesos 分配给框架,绑定到任务使用的,端口号往往有明确意义;临时端口是系统分配的,往往不太关心具体端口号。* diff --git a/mesos/framework.md b/mesos/framework.md deleted file mode 100644 index 2430d4a..0000000 --- a/mesos/framework.md +++ /dev/null @@ -1,89 +0,0 @@ -## 常见应用框架 - -应用框架是实际干活的,可以理解为 Mesos 之上跑的 `应用`。应用框架注册到 Mesos master 服务上即可使用。 - -用户大部分时候,只需要跟应用框架打交道。因此,选择合适的应用框架十分关键。 - -Mesos 目前支持的应用框架分为四大类:长期运行任务(以及 PaaS)、大数据处理、批量调度、数据存储。 - -随着 Mesos 自身的发展,越来越多的框架开始支持 Mesos,下面总结了目前常用的一些框架。 - -### 长期运行的服务 - -#### [Aurora](http://aurora.incubator.apache.org) - -利用 Mesos 调度安排的任务,保证任务一直在运行。 - -提供 REST 接口,客户端和 webUI(8081 端口) - -#### [Marathon](https://github.com/mesosphere/marathon) - -一个私有 PaaS 平台,保证运行的应用不被中断。 - -如果任务停止了,会自动重启一个新的相同任务。 - -支持任务为任意 bash 命令,以及容器。 - -提供 REST 接口,客户端和 webUI(8080 端口) - -#### [Singularity](https://github.com/HubSpot/Singularity) - -一个私有 PaaS 平台。 - -调度器,运行长期的任务和一次性任务。 - -提供 REST 接口,客户端和 webUI(7099、8080 端口),支持容器。 - -### 大数据处理 -#### [Cray Chapel](https://github.com/nqn/mesos-chapel) - -支持 Chapel 并行编程语言的运行框架。 - -#### [Dpark](https://github.com/douban/dpark) - -Spark 的 Python 实现。 - -#### [Hadoop](https://github.com/mesos/hadoop) - -经典的 map-reduce 模型的实现。 - -#### [Spark](http://spark.apache.org) - -跟 Hadoop 类似,但处理迭代类型任务会更好的使用内存做中间状态缓存,速度要快一些。 - -#### [Storm](https://github.com/mesos/storm) - -分布式流计算,可以实时处理数据流。 - -### 批量调度 -#### [Chronos](https://github.com/airbnb/chronos) - -Cron 的分布式实现,负责任务调度,支持容错。 - -#### [Jenkins](https://github.com/jenkinsci/mesos-plugin) - -大名鼎鼎的 CI 引擎。使用 mesos-jenkins 插件,可以将 jenkins 的任务被 Mesos 集群来动态调度执行。 - -#### [JobServer](http://www.grandlogic.com/content/html_docs/jobserver.html) - -基于 Java 的调度任务和数据处理引擎。 - -#### [GoDocker](https://bitbucket.org/osallou/go-docker) - -基于 Docker 容器的集群维护工具。提供用户接口,除了支持 Mesos,还支持 Kubernetes、Swarm 等。 - -### 数据存储 - -#### [ElasticSearch](https://github.com/mesos/elasticsearch) - -功能十分强大的分布式数据搜索引擎。 - -一方面通过分布式集群实现可靠的数据库,一方面提供灵活的 API,对数据进行整合和分析。ElasticSearch + LogStash + Kibana 目前合成为 ELK 工具栈。 - -#### [Hypertable](https://code.google.com/p/hypertable) - -高性能的分布式数据库,支持结构化或者非结构化的数据存储。 - -#### [Tachyon](http://tachyon-project.org/) - -内存为中心的分布式存储系统,利用内存访问的高速提供高性能。 diff --git a/mesos/installation.md b/mesos/installation.md deleted file mode 100644 index 0a60a18..0000000 --- a/mesos/installation.md +++ /dev/null @@ -1,387 +0,0 @@ -## Mesos 安装与使用 -以 Mesos 结合 Marathon 应用框架为例,来看下如何快速搭建一套 Mesos 平台。 - -Marathon 是可以跟 Mesos 一起协作的一个 framework,基于 Scala 实现,可以实现保持应用的持续运行。 - -另外,Mesos 默认利用 ZooKeeper 来进行多个主节点之间的选举,以及从节点发现主节点的过程。一般在生产环境中,需要启动多个 Mesos master 服务(推荐 3 或 5 个),并且推荐使用 supervisord 等进程管理器来自动保持服务的运行。 - -ZooKeeper 是一个分布式集群中信息同步的工具,通过自动在多个节点中选举 `leader`,保障多个节点之间的某些信息保持一致性。 - -### 安装 -安装主要需要 mesos、zookeeper 和 marathon 三个软件包。 - -Mesos 也采用了经典的主-从结构,一般包括若干主节点和大量从节点。其中,mesos master 服务和 zookeeper 需要部署到所有的主节点,mesos slave 服务需要部署到所有从节点。marathon 可以部署到主节点。 - -安装可以通过源码编译、软件源或者 Docker 镜像方式进行,下面分别进行介绍。 - -#### 源码编译 - -源码编译方式可以保障获取到最新版本,但编译过程比较费时间。 - -首先,从 apache.org 开源网站下载最新的源码。 - -```sh -$ git clone https://git-wip-us.apache.org/repos/asf/mesos.git -``` - -其中,主要代码在 `src` 目录下,应用框架代码在 `frameworks` 目录下,文档在 `docs` 目录下,`include ` 中包括了跟 Mesos 打交道使用的一些 API 定义头文件。 - -安装依赖,主要包括 Java 运行环境、Linux 上的自动编译环境等。 - -```sh -$ sudo apt-get update -$ sudo apt-get install -y openjdk-8-jdk autoconf libtool \ -build-essential python-dev python-boto libcurl4-nss-dev \ -libsasl2-dev maven libapr1-dev libsvn-dev -``` - -后面就是常规 C++ 项目的方法,configure 之后利用 Makefile 进行编译和安装。 - -```sh -$ cd mesos -$ ./bootstrap -$ mkdir build -$ cd build && ../configure --with-network-isolator -$ make -$ make check && sudo make install -``` - -#### 软件源安装 - -通过软件源方式进行安装相对会省时间,但往往不是最新版本。 - -这里以 Ubuntu 系统为例,首先添加软件源地址。 - -```sh -$ 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 -``` - -刷新本地软件仓库信息并安装 zookeeper、mesos、marathon 三个软件包。 - -```sh -$ sudo apt-get -y update && sudo apt-get -y install zookeeper mesos marathon -``` - -注意,Marathon 最新版本需要 jdk 1.8+ 的支持。如果系统中有多个 Java 版本,需要检查配置默认的 JDK 版本符合要求。 - -```sh -$ sudo update-alternatives --config java -``` - -安装 Mesos 成功后,会在 `/usr/sbin/` 下面发现 `mesos-master` 和 `mesos-slave` 两个二进制文件,分别对应主节点上需要运行的管理服务和从节点上需要运行的任务服务。 - -用户可以手动运行二进制文件启动服务,也可以通过 `service` 命令来方便进行管理。 - -例如,在主节点上重启 Mesos 管理服务: - -```sh -$ sudo service mesos-master restart -``` - -通过 `service` 命令来管理,实际上是通过调用 `/usr/bin/mesos-init-wrapper` 脚本文件进行处理。 - -#### [基于 Docker](https://github.com/sekka1/mesosphere-docker) - -需要如下三个镜像。 - -* ZooKeeper:https://registry.hub.docker.com/u/garland/zookeeper/ -* Mesos:https://registry.hub.docker.com/u/garland/mesosphere-docker-mesos-master/ -* Marathon:https://registry.hub.docker.com/u/garland/mesosphere-docker-marathon/ - -其中 mesos-master 镜像在后面将分别作为 master 和 slave 角色进行使用。 - -首先,拉取三个镜像。 - -```sh -$ docker pull garland/zookeeper -$ docker pull garland/mesosphere-docker-mesos-master -$ docker pull garland/mesosphere-docker-marathon -``` - -导出主节点机器的地址到环境变量。 - -```sh -$ HOST_IP=10.0.0.2 -``` - -在主节点上启动 Zookeepr 容器。 - -```sh -docker run -d \ --p 2181:2181 \ --p 2888:2888 \ --p 3888:3888 \ -garland/zookeeper -``` - -在主节点上启动 Mesos Master 服务容器。 - -```sh -docker run --net="host" \ --p 5050:5050 \ --e "MESOS_HOSTNAME=${HOST_IP}" \ --e "MESOS_IP=${HOST_IP}" \ --e "MESOS_ZK=zk://${HOST_IP}:2181/mesos" \ --e "MESOS_PORT=5050" \ --e "MESOS_LOG_DIR=/var/log/mesos" \ --e "MESOS_QUORUM=1" \ --e "MESOS_REGISTRY=in_memory" \ --e "MESOS_WORK_DIR=/var/lib/mesos" \ --d \ -garland/mesosphere-docker-mesos-master -``` - -在主节点上启动 Marathon。 - -```sh -docker run \ --d \ --p 8080:8080 \ -garland/mesosphere-docker-marathon --master zk://${HOST_IP}:2181/mesos --zk zk://${HOST_IP}:2181/marathon -``` - -在从节点上启动 Mesos slave 容器。 - -```sh -docker run -d \ ---name mesos_slave_1 \ ---entrypoint="mesos-slave" \ --e "MESOS_MASTER=zk://${HOST_IP}:2181/mesos" \ --e "MESOS_LOG_DIR=/var/log/mesos" \ --e "MESOS_LOGGING_LEVEL=INFO" \ -garland/mesosphere-docker-mesos-master:latest -``` - -接下来,可以通过访问本地 8080 端口来使用 Marathon 启动任务了。 - - -### 配置说明 - -下面以本地通过软件源方式安装为例,解释如何修改各个配置文件。 - -#### ZooKeepr - -ZooKeepr 是一个分布式应用的协调工具,用来管理多个主节点的选举和冗余,监听在 2181 端口。推荐至少布置三个主节点来被 ZooKeeper 维护。 - -配置文件默认都在 `/etc/zookeeper/conf/` 目录下。比较关键的配置文件有两个:`myid` 和 `zoo.cfg`。 - -myid 文件会记录加入 ZooKeeper 集群的节点的序号(1-255之间)。`/var/lib/zookeeper/myid` 文件其实也是软连接到了该文件。 - -比如配置某节点序号为 1,则需要在该节点上执行: - -```sh -$ echo 1 | sudo dd of=/etc/zookeeper/conf/myid -``` - -节点序号在 ZooKeeper 集群中必须唯一,不能出现多个拥有相同序号的节点。 - -另外,需要修改 zoo.cfg 文件,该文件是主配置文件,主要需要添加上加入 ZooKeeper 集群的机器的序号和对应监听地址。 - -例如,现在 ZooKeeper 集群中有三个节点,地址分别为 `10.0.0.2`、`10.0.0.3`、`10.0.0.4`,序号分别配置为 `2`、`3`、`4`。 - -则配置如下的三行: - -```sh -server.2=10.0.0.2:2888:3888 -server.3=10.0.0.3:2888:3888 -server.4=10.0.0.4:2888:3888 -``` - -其中第一个端口 2888 负责从节点连接到主节点的;第二个端口 3888 则负责主节点进行选举时候通信。 - -也可以用主机名形式,则需要各个节点 `/etc/hosts` 文件中都记录地址到主机名对应的映射关系。 - -完成配置后,启动 ZooKeeper 服务。 - -```sh -$ sudo service zookeeper start -``` - -#### Mesos - -Mesos 的默认配置目录有三个: - -* /etc/mesos/:主节点和从节点都会读取的配置文件,最关键的是 zk 文件存放主节点的信息; -* /etc/mesos-master/:只有主节点会读取的配置,等价于启动 mesos-master 命令时候的默认选项; -* /etc/mesos-slave/:只有从节点会读取的配置,等价于启动 mesos-master 命令时候的默认选项。 - -最关键的是需要在所有节点上修改 `/etc/mesos/zk`,写入主节点集群的 ZooKeeper 地址列表,例如: - -```sh -zk://10.0.0.2:2181,10.0.0.3:2181,10.0.0.4:2181/mesos -``` - -此外,`/etc/default/mesos`、`/etc/default/mesos-master`、`/etc/default/mesos-slave` 这三个文件中可以存放一些环境变量定义,Mesos 服务启动之前,会将这些环境变量导入进来作为启动参数。格式为 `MESOS_OPTION_NAME`。 - -下面分别说明在主节点和从节点上的配置。 - -##### 主节点 - -一般只需要关注 `/etc/mesos-master/` 目录下的文件。默认情况下目录下为空。 - -该目录下文件命名和内容需要跟 mesos-master 支持的命令行选项一一对应。可以通过 `mesos-master --help` 命令查看支持的选项。 - -例如某个文件 `key` 中内容为 `value`,则在 mesos-master 服务启动的时候,会自动添加参数 `--key=value` 给二进制命令。 - -例如,mesos-master 服务默认监听在 loopback 端口,即 `127.0.0.1:5050`,我们需要修改主节点监听的地址,则可以创建 /etc/mesos-master/ip 文件,在其中写入主节点监听的外部地址。 - -为了正常启动 mesos-master 服务,还需要指定 `work_dir` 参数(表示应用框架的工作目录)的值,可以通过创建 /etc/mesos-master/work_dir 文件,在其中写入目录,例如 ` /var/lib/mesos`。工作目录下会生成一个 `replicated_log` 目录,会存有各种同步状态的持久化信息。 - -以及指定 quorum 参数的值,该参数用来表示 ZooKeeper 集群中要求最少参加表决的节点数目。一般设置为比 ZooKeeper 集群中节点个数的半数多一些(比如三个节点的话,可以配置为 `2`)。 - -此外,要修改 Mesos 集群的名称,可以创建 `/etc/mesos-master/cluster` 文件,在其中写入集群的别名,例如 `MesosCluster`。 - -总结下,建议在 `/etc/mesos-master` 目录下,配置至少四个参数文件:`ip`、`quorum`、`work_dir`、`cluster`。 - -修改配置之后,需要启动服务即可生效。 -```sh -$ sudo service mesos-master start -``` - -更多选项可以参考后面的配置项解析章节。 - -主节点服务启动后,则可以在从节点上启动 mesos-slave 服务来加入主节点的管理。 - -##### 从节点 -一般只需要关注 `/etc/mesos-slave/` 目录下的文件。默认情况下目录下为空。 - -文件命名和内容也是跟主节点类似,对应二进制文件支持的命令行参数。 - -建议在从节点上,创建 `/etc/mesos-slave/ip` 文件,在其中写入跟主节点通信的地址。 - -修改配置之后,也需要重新启动服务。 - -```sh -$ sudo service mesos-slave start -``` - -更多选项可以参考后面的配置项解析章节。 - -#### Marathon -Marathon 作为 Mesos 的一个应用框架,配置要更为简单,必需的配置项有 `--master` 和 `--zk`。 - -安装完成后,会在 /usr/bin 下多一个 marathon shell 脚本,为启动 marathon 时候执行的命令。 - -配置目录为 `/etc/marathon/conf`(需要手动创建),此外默认配置文件在 `/etc/default/marathon`。 - -我们手动创建配置目录,并添加配置项(文件命名和内容跟 Mesos 风格一致),让 Marathon 能连接到已创建的 Mesos 集群中。 - -```sh -$ sudo mkdir -p /etc/marathon/conf -$ sudo cp /etc/mesos/zk /etc/marathon/conf/master -``` - -同时,让 Marathon 也将自身的状态信息保存到 ZooKeeper 中。创建 `/etc/marathon/conf/zk` 文件,添加 ZooKeeper 地址和路径。 - -```sh -zk://10.0.0.2:2181,10.0.0.2:2181,10.0.0.2:2181/marathon -``` - -启动 marathon 服务。 - -```sh -$ sudo service marathon start -``` - -### 访问 Mesos 图形界面 - -Mesos 自带了 Web 图形界面,可以方便用户查看集群状态。 - -用户在 Mesos 主节点服务和从节点服务都启动后,可以通过浏览器访问主节点 5050 端口,看到类似如下界面,已经有两个 slave 节点加入了。 - -![mesos 界面查看加入的 slave 节点](_images/mesos.png) - -通过 Slaves 标签页能看到加入集群的从节点的信息。 - -如果没有启动 Marathon 服务,在 Frameworks 标签页下将看不到任何内容。 - -### 访问 Marathon 图形界面 - -Marathon 服务启动成功后,在 Mesos 的 web 界面的 Frameworks 标签页下面将能看到名称为 marathon 的框架出现。 - -同时可以通过浏览器访问 8080 端口,看到 Marathon 自己的管理界面。 - -![marathon 图形管理界面](_images/marathon.png) - -此时,可以通过界面或者 REST API 来创建一个应用,Marathon 会保持该应用的持续运行。 - -![marathon 查看任务支持的参数](_images/marathon_basic0.png) - -通过界面方式可以看到各任务支持的参数(包括资源、命令、环境变量、健康检查等),同时可以很容易地修改任务运行实例数进行扩展,非常适合进行测试。 - -如果要更自动化地使用 Marathon,则需要通过它的 REST API 进行操作。 - -一般的,启动新任务需要先创建一个定义模板(JSON 格式),然后发到指定的 API。 - -例如,示例任务 basic-0 的定义模板为: - -```json -{ - "id": "basic-0", - "cmd": "while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done", - "cpus": 0.1, - "mem": 10.0, - "instances": 1 -} -``` - -该任务申请资源为 0.1 个单核 CPU 资源和 10 MB 的内存资源,具体命令为每隔五秒钟用 shell 打印一句 `Hello Marathon`。 - -可以通过如下命令发出 basic-0 任务到 Marathon 框架,框架会分配任务到某个满足条件的从节点上,成功会返回一个 json 对象,描述任务的详细信息。 - -```sh -$ curl -X POST http://marathon_host:8080/v2/apps -d @basic-0.json -H "Content-type: application/json" -{"id":"/basic-0","cmd":"while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done","args":null,"user":null,"env":{},"instances":1,"cpus":0.1,"mem":10,"disk":0,"executor":"","constraints":[],"uris":[],"storeUrls":[],"ports":[0],"requirePorts":false,"backoffSeconds":1,"backoffFactor":1.15,"maxLaunchDelaySeconds":3600,"container":null,"healthChecks":[],"dependencies":[],"upgradeStrategy":{"minimumHealthCapacity":1,"maximumOverCapacity":1},"labels":{},"acceptedResourceRoles":null,"version":"2015-12-28T05:33:05.805Z","tasksStaged":0,"tasksRunning":0,"tasksHealthy":0,"tasksUnhealthy":0,"deployments":[{"id":"3ec3fbd5-11e4-479f-bd17-813d33e43e0c"}],"tasks":[]}% -``` - -Marathon 的更多 REST API 可以参考本地自带的文档:`http://marathon_host:8080/api-console/index.html`。 - -此时,如果运行任务的从节点出现故障,任务会自动在其它可用的从节点上启动。 - -此外,目前也已经支持基于 Docker 容器的任务。需要先在 Mesos slave 节点上为 slave 服务配置 `--containerizers=docker,mesos` 参数。 - -例如如下面的示例任务: - -```json -{ - "id": "basic-3", - "cmd": "python3 -m http.server 8080", - "cpus": 0.5, - "mem": 32.0, - "container": { - "type": "DOCKER", - "volumes": [], - "docker": { - "image": "python:3", - "network": "BRIDGE", - "portMappings": [ - { - "containerPort": 8080, - "hostPort": 31000, - "servicePort": 0, - "protocol": "tcp" - } - ], - "privileged": false, - "parameters": [], - "forcePullImage": true - } - } -} -``` - -该任务启动一个 `python:3` 容器,执行 `python3 -m http.server 8080` 命令,作为一个简单的 web 服务,实际端口会映射到宿主机的 31000 端口。 - -注意区分 hostPort 和 servicePort,前者代表任务映射到的本地可用端口(可用范围由 Mesos slave 汇报,默认为 31000 ~ 32000);后者作为服务管理的端口,可以被用作一些服务发行机制使用进行转发,在整个 Marathon 集群中是唯一的。 - -任务执行后,也可以在对应 slave 节点上通过 Docker 命令查看容器运行情况,容器将以 `mesos-SLAVE_ID` 开头。 - -```sh -$ docker container ls -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -1226b4ec8d7d python:3 "/bin/sh -c 'python3 " 3 days ago Up 3 days 0.0.0.0:10000->8080/tcp mesos-06db0fba-49dc-4d28-ad87-6c2d5a020866-S10.b581149e-2c43-46a2-b652-1a0bc10204b3 -``` diff --git a/mesos/intro.md b/mesos/intro.md deleted file mode 100644 index a33a5b7..0000000 --- a/mesos/intro.md +++ /dev/null @@ -1,20 +0,0 @@ -## 简介 -Mesos 最初由 UC Berkeley 的 AMP 实验室于 2009 年发起,遵循 Apache 协议,目前已经成立了 Mesosphere 公司进行运营。Mesos 可以将整个数据中心的资源(包括 CPU、内存、存储、网络等)进行抽象和调度,使得多个应用同时运行在集群中分享资源,并无需关心资源的物理分布情况。 - -如果把数据中心中的集群资源看做一台服务器,那么 Mesos 要做的事情,其实就是今天操作系统内核的职责:抽象资源 + 调度任务。Mesos 项目是 Mesosphere 公司 Datacenter Operating System (DCOS) 产品的核心部件。 - -Mesos 项目主要由 C++ 语言编写,项目官方地址为 [https://mesos.apache.org](https://mesos.apache.org),代码仍在快速演化中,已经发布了正式版 1.0.0 版本。 - -Mesos 拥有许多引人注目的特性,包括: -* 支持数万个节点的大规模场景(Apple、Twitter、eBay 等公司实践); -* 支持多种应用框架,包括 Marathon、Singularity、Aurora 等; -* 支持 HA(基于 ZooKeeper 实现); -* 支持 Docker、LXC 等容器机制进行任务隔离; -* 提供了多个流行语言的 API,包括 Python、Java、C++ 等; -* 自带了简洁易用的 WebUI,方便用户直接进行操作。 - -值得注意的是,Mesos 自身只是一个资源抽象的平台,要使用它往往需要结合运行其上的分布式应用(在 Mesos 中被称作框架,framework),比如 Hadoop、Spark 等可以进行分布式计算的大数据处理应用;比如 Marathon 可以实现 PaaS,快速部署应用并自动保持运行;比如 ElasticSearch 可以索引海量数据,提供灵活的整合和查询能力…… - -大部分时候,用户只需要跟这些框架打交道即可,完全无需关心底下的资源调度情况,因为 Mesos 已经自动帮你实现了。这大大方便了上层应用的开发和运维。 - -当然,用户也可以基于 Mesos 打造自己的分布式应用框架。 diff --git a/mesos/monitor.md b/mesos/monitor.md deleted file mode 100644 index 641b38d..0000000 --- a/mesos/monitor.md +++ /dev/null @@ -1,110 +0,0 @@ -## 日志与监控 - -Mesos 自身提供了强大的日志和监控功能,某些应用框架也提供了针对框架中任务的监控能力。通过这些接口,用户可以实时获知集群的各种状态。 - -### 日志配置 -日志文件默认在 `/var/log/mesos` 目录下,根据日志等级带有不同后缀。 - -用户可以通过日志来调试使用中碰到的问题。 - -一般的,推荐使用 `--log_dir` 选项来指定日志存放路径,并通过日志分析引擎来进行监控。 - - -### 监控 - -Mesos 提供了方便的监控接口,供用户查看集群中各个节点的状态。 - -#### 主节点 -通过 `http://MASTER_NODE:5050/metrics/snapshot` 地址可以获取到 Mesos 主节点的各种状态统计信息,包括资源(CPU、硬盘、内存)使用、系统状态、从节点、应用框架、任务状态等。 - -例如查看主节点 `10.0.0.2` 的状态信息,并用 jq 来解析返回的 json 对象。 - -```sh -$ curl -s http://10.0.0.2:5050/metrics/snapshot |jq . -{ - "system/mem_total_bytes": 4144713728, - "system/mem_free_bytes": 153071616, - "system/load_5min": 0.37, - "system/load_1min": 0.6, - "system/load_15min": 0.29, - "system/cpus_total": 4, - "registrar/state_store_ms/p9999": 45.4096616192, - "registrar/state_store_ms/p999": 45.399272192, - "registrar/state_store_ms/p99": 45.29537792, - "registrar/state_store_ms/p95": 44.8336256, - "registrar/state_store_ms/p90": 44.2564352, - "registrar/state_store_ms/p50": 34.362368, - ... - "master/recovery_slave_removals": 1, - "master/slave_registrations": 0, - "master/slave_removals": 0, - "master/slave_removals/reason_registered": 0, - "master/slave_removals/reason_unhealthy": 0, - "master/slave_removals/reason_unregistered": 0, - "master/slave_reregistrations": 2, - "master/slave_shutdowns_canceled": 0, - "master/slave_shutdowns_completed": 1, - "master/slave_shutdowns_scheduled": 1 -} -``` - -#### 从节点 - -通过 `http://SLAVE_NODE:5051/metrics/snapshot` 地址可以获取到 Mesos 从节点的各种状态统计信息,包括资源、系统状态、各种消息状态等。 - -例如查看从节点 `10.0.0.10` 的状态信息。 - -```sh -$ curl -s http://10.0.0.10:5051/metrics/snapshot |jq . -{ - "system/mem_total_bytes": 16827785216, - "system/mem_free_bytes": 3377315840, - "system/load_5min": 0.11, - "system/load_1min": 0.16, - "system/load_15min": 0.13, - "system/cpus_total": 8, - "slave/valid_status_updates": 11, - "slave/valid_framework_messages": 0, - "slave/uptime_secs": 954125.458927872, - "slave/tasks_starting": 0, - "slave/tasks_staging": 0, - "slave/tasks_running": 1, - "slave/tasks_lost": 0, - "slave/tasks_killed": 2, - "slave/tasks_finished": 0, - "slave/executors_preempted": 0, - "slave/executor_directory_max_allowed_age_secs": 403050.709525191, - "slave/disk_used": 0, - "slave/disk_total": 88929, - "slave/disk_revocable_used": 0, - "slave/disk_revocable_total": 0, - "slave/disk_revocable_percent": 0, - "slave/disk_percent": 0, - "containerizer/mesos/container_destroy_errors": 0, - "slave/container_launch_errors": 6, - "slave/cpus_percent": 0.025, - "slave/cpus_revocable_percent": 0, - "slave/cpus_revocable_total": 0, - "slave/cpus_revocable_used": 0, - "slave/cpus_total": 8, - "slave/cpus_used": 0.2, - "slave/executors_registering": 0, - "slave/executors_running": 1, - "slave/executors_terminated": 8, - "slave/executors_terminating": 0, - "slave/frameworks_active": 1, - "slave/invalid_framework_messages": 0, - "slave/invalid_status_updates": 0, - "slave/mem_percent": 0.00279552715654952, - "slave/mem_revocable_percent": 0, - "slave/mem_revocable_total": 0, - "slave/mem_revocable_used": 0, - "slave/mem_total": 15024, - "slave/mem_used": 42, - "slave/recovery_errors": 0, - "slave/registered": 1, - "slave/tasks_failed": 6 -} -``` - -另外,通过 `http://MASTER_NODE:5050/monitor/statistics.json` 地址可以看到该从节点上容器网络相关的统计数据,包括进出流量、丢包数、队列情况等。获取方法同上,在此不再演示。 \ No newline at end of file diff --git a/mesos/summary.md b/mesos/summary.md deleted file mode 100644 index 53d5891..0000000 --- a/mesos/summary.md +++ /dev/null @@ -1,7 +0,0 @@ -## 本章小结 - -本章讲解了 Mesos 的安装使用、基本原理和架构,以及支持 Mesos 的重要应用框架。Mesos 最初设计为资源调度器,然而其灵活的设计和对上层框架的优秀支持,使得它可以很好的支持大规模的分布式应用场景。结合 Docker,Mesos 可以很容易部署一套私有的容器云。 - -除了核心功能之外,Mesos 在设计上有许多值得借鉴之处,比如它清晰的定位、简洁的架构、细致的参数、高度容错的可靠,还有对限速、监控等的支持等。 - -Mesos 作为一套成熟的开源项目,可以很好的被应用和集成到生产环境中。但它的定位集中在资源调度,往往需要结合应用框架或二次开发。 \ No newline at end of file