Mesos
16.1 Mesos 配置项解析
Mesos 支持在运行时通过命令行参数形式提供的配置项。如果是通过系统服务方式启动,也支持以配置文件或环境变量方式给出。当然,实际上最终是提取为命令行参数传递给启动命令。
Mesos 的配置项分为三种类型:通用项(master 和 slave 都支持),只有 master 支持的,以及只有 slave 支持的。
Mesos 配置项比较多,下面对一些重点配置进行描述。少数为必备项,意味着必须给出配置值;另外一些是可选配置,自己带有默认值
1. 通用项
通用项数量不多,主要涉及到服务绑定地址和日志信息等,包括:
配置项 | 说明 |
---|---|
-- 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。 |
2. 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。
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
3. 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。
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
为了避免主机分配的临时端口跟我们指定的临时端口范围冲突,需要在主机节点上进行配置。
echo "57345 61000" > /proc/sys/net/ipv4/ip_local_port_range
注:非临时端口是 Mesos 分配给框架,绑定到任务使用的,端口号往往有明确意义;临时端口是系统分配的,往往不太关心具体端口号。
16.2 日志与监控
Mesos 自身提供了强大的日志和监控功能,某些应用框架也提供了针对框架中任务的监控能力。通过这些接口,用户可以实时获知集群的各种状态。
1. 日志配置
日志文件默认在 /var/log/mesos
目录下,根据日志等级带有不同后缀。用户可以通过日志来调试使用中碰到的问题。
一般的,推荐使用 --log_dir
选项来指定日志存放路径,并通过日志分析引擎来进行监控。
2. 监控
Mesos 提供了方便的监控接口,供用户查看集群中各个节点的状态。
2.1 主节点
通过 http://MASTER_NODE:5050/metrics/snapshot
地址可以获取到 Mesos 主节点的各种状态统计信息,包括资源(CPU、硬盘、内存)使用、系统状态、从节点、应用框架、任务状态等。
例如查看主节点 10.0.0.2 的状态信息,并用 jq 来解析返回的 json 对象。
$ 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
}
2.2 从节点
通过 http://SLAVE_NODE:5051/metrics/snapshot
地址可以获取到 Mesos 从节点的各种状态统计信息,包括资源、系统状态、各种消息状态等。
例如查看从节点 10.0.0.10 的状态信息。
$ 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/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
地址可以看到该从节点上容器网络相关的统计数据,包括进出流量、丢包数、队列情况等。获取方法同上,在此不再演示。
16.3 常见应用框架
应用框架是实际干活的,可以理解为 Mesos 之上跑的应用。应用框架注册到Mesos master 服务上即可使用。用户大部分时候,只需要跟应用框架打交道。因此,选择合适的应用框架十分关键。
Mesos 目前支持的应用框架分为四大类:长期运行任务(以及 PaaS)、大数据处理、批量调度、数据存储。随着 Mesos 自身的发展,越来越多的框架开始支持 Mesos,下面总结了目前常用的一些框架。
分类 | 框架 | 说明 |
---|---|---|
长期运行的服务 | Aurora | 利用 Mesos 调度安排的任务,保证任务一直在运行。提供 REST 接口,客户端和 webUI(8081 端口) |
长期运行的服务 | Marathon | 一个私有 PaaS 平台,保证运行的应用不被中断。如果任务停止了,会自动重启一个新的相同任务。支持任务为任意 bash 命令,以及容器。提供 REST 接口,客户端和 webUI(8080 端口) |
长期运行的服务 | Singularity | 一个私有 PaaS 平台。调度器,运行长期的任务和一次性任务。提供 REST 接口,客户端和 webUI(7099、8080 端口),支持容器。 |
大数据处理 | Cray Chapel | 支持 Chapel 并行编程语言的运行框架。 |
大数据处理 | Dpark | Spark 的 Python 实现。 |
大数据处理 | Hadoop | 经典的 map-reduce 模型的实现。 |
大数据处理 | Spark | 跟 Hadoop 类似,但处理迭代类型任务会更好的使用内存做中间状态缓存,速度要快一些。 |
大数据处理 | Storm | 分布式流计算,可以实时处理数据流。 |
批量调度 | Chronos | Cron 的分布式实现,负责任务调度,支持容错。 |
批量调度 | Jenkins | 大名鼎鼎的 CI 引擎。使用 mesos-jenkins 插件,可以将 jenkins 的任务被 Mesos 集群来动态调度执行。 |
批量调度 | JobServer | 基于 Java 的调度任务和数据处理引擎。 |
批量调度 | GoDocker | 基于 Docker 容器的集群维护工具。提供用户接口,除了支持 Mesos,还支持 Kubernetes、Swarm 等。 |
数据存储 | ElasticSearch | 功能十分强大的分布式数据搜索引擎。一方面通过分布式集群实现可靠的数据库,一方面提供灵活的 API,对数据进行整合和分析。ElasticSearch + LogStash + Kibana 目前合成为 ELK 工具栈。 |
数据存储 | Hypertable | 高性能的分布式数据库,支持结构化或者非结构化的数据存储。 |
数据存储 | Tachyon | 内存为中心的分布式存储系统,利用内存访问的高速提供高性能。 |