Apache Mesos(8)-部署生产系统的考虑
作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/
前面我们安装部署了Mesos集群,并且通过Marathon框架运行了几个任务。但是如果将Mesos集群用于生产,就需要考虑更多的问题。本篇我们探索将Mesos集群用于生产的一些最佳实践。虽然本篇并不能包括生产系统需要考虑的所有问题,但也为部署、管理Mesos生产集群提供了一些参考。
部署生产系统的考虑
生产系统部署概览
对于生产系统,需要最少3个Mesos masters和3个ZooKeeper ensemble组成一个高可用的集群。ZooKeeper集群可以部署在单独的物理机上,也可以为了简单,部署在与Mesos masters相同的机器上。当把这些服务部署到专用的物理机、虚拟机或者云提供商提供的云主机上时,一定要考虑在硬件级别的冗余。就是说如果您有自己的数据中心,这些服务应该部署到位于不同机柜,连接到不同的网络交换机以及不同的电力线路的机器上。如果使用的是虚拟机或云环境,确保使用一定的策略,来确保这些虚拟机运行在不同的hypervisors或不同的可用区里。
MESOS MASTERS
如果计划将Mesos集群的部署跨越到多个数据中心,要确保这些不同数据中心之间的网络延时较低。否则,在不同数据中心的Masters彼此通信时会出现超时,即如果leading master不能在registry_store_timeout
(默认:5s)时间内写入到standby masters上时,Mesos的注册更新便会失败。如果考虑增加这个延时,也同时考虑增加registry_fetch_timeout
(默认:1分钟)的数值。根据环境的不同,也可以考虑在不同的数据中心部署不同的Mesos集群,然后在这些集群间进行负载均衡。
ZOOKEEPER ENSEMBLE
在ZooKeeper的集群(被称为ensemble)里,需要保持一个quorum(法定人数)。集群可以同时容纳的失败节点,取决于你的环境和你个用户提供的SLA。如果需要创建一个可以容纳F个失败节点的集群,则需要部署(2xF+1)个节点。通常情况下集群的节点数都是奇数,一般推荐部署从5个节点开始的用于生产环境的集群,它可以在一个节点下线进行维护时,整个集群还可以容纳一个节点失败的能力。
日志
服务生成的日志文件可以和服务本身一样重要。当问题产生时,详细可用的日志文件对故障的处理是非常重要的。
定位和解析日志文件
服务的日志文件
关于管理日志,Mesos给系统管理员提供了很大的灵活性。事件可以写到磁盘上Mesos管理的日志文件中,或者是系统日志(syslog)中。Mesos的安装包默认的配置确保Mesos master和slave服务将日志发送给syslog,以便可以被日志管理服务如Logstash或Splunk进行收集和分析。
Mesos master和slave都可以使用–log_dir来配置日志文件的存储位置。通常设置为/var/log/mesos
,但也可以省略该配置使日志发送到standard error(标准错误输出)位置。如果Mesos为你管理日志文件,它将根据文件的大小来进行自动轮换,不过你应该确保定期删除这些旧的文件。
任务的日志文件
在每个任务的sandbox中,Mesos提供了两个默认的日志文件:stdout和stderr。这允许管理员通过web界面查看任务或者命令的控制台输出,而不用实际登录到运行此任务的节点上去查看。这些日志文件和其它任务需要的文件一起存储在任务的work_dir,它是通过slave的--work_dir
来配置的。如果slave的work_dir被配置为/var/lib/mesos,则到任务的sandbox的路径类似于下面这样:
/var/lib/mesos/slaves
└── <slave-id>/
└── frameworks/
└── <framework-id>/
└── executors/
└── <task-name>/
└── runs/
├── <run-id>/
│ ├── stderr
│ └── stdout
└── latest
与Mesos服务的日志文件不同的是,当Mesos slave在旧的sandbox目录里进行垃圾收集时,这些文件自动清除。垃圾收集默认是一周一次,但根据可用的磁盘空间大小可能更频繁的进行。
配置日志文件
Mesos提供了很多配置选项用来配置日志,这些选项包括:
- log_dir—日志文件在磁盘上的存储路径。如果没有指定,将不会向磁盘写入,而将事件发送到stderr。该选项可以用在master和slave上,没有默认值。
- logging_level—只记录此级别(或高于)的日志信息。可能的值包括(级别依次递增):INFO, WARNING, 和ERROR。此选项可以用于master和slave,默认值为INFO。
- work_dir—当在slave上配置时,此选项指定某框架的工作目录(sandbox),它包含任务的stdout和stderr日志文件。默认值为/tmp/mesos。
- external_log_file—指定到外部管理的日志文件的路径,用来再web界面上显示和HTTP API。可以用于master和slave上,没有默认值。
- quiet—当指定后,没有日志输出到stderr。可以用于master和slave上,此配置默认不指定。
- logbufsecs—在日志写入磁盘前,缓存日志信息的秒数。可以用于master和slave上,默认值为0(立即将日志信息写入磁盘)。
搭建日志基础设施,可以使用Elasticsearch, Logstash, and Kibana (ELK) stack,用来收集、分析和索引日志条目,方便将日志条目以数据的方式进行搜索和可视化。使用上面这些选项可以使Mesos的日志和您的日志基础设施相适应,不管你使用的是何种日志基础设施。
监视Mesos和ZooKeeper集群
可以使用各种监视系统如Nagios、Zabbix等来监视Mesos集群中的服务正常运行。而且Mesos有丰富的基于JSON的HTTP API,可以用来查询集群健康状态的更多信息。可以使用下面的链接来查询关于API终端的更多信息:
更多信息可以参考http://mesos.apache.org/documentation/latest/monitoring/。
监视Mesos master
除了基本的主机监视(CUP,内存,磁盘,网络)和进程监视(Mesos-master服务)外,Mesos master的法定人数的状态对整个集群能否正常工作也有关键的影响。OpenTable团队提供了一个Nagios check脚本,通过它可以监视leading master的下述状态:
- 基本健康检查
- 注册了最少数目的slave
- 注册了某个框架
另外,Mesos提供了广泛的REST API,可以用来查询集群健康状态的更多信息,如:
- 使用了的资源
- 收到和处理过的Framework的信息(如果认证被启用)
- 系统负载
- 连接了的slaves
监视Mesos slave
虽然slave不像master那样负责保证法定人数和决策将任务分配到集群中的哪里,但对slave的正确监控,可以确保集群不会出现没有资源可分配或没有磁盘空间等警报。下面是一些对Mesos slave监控的建议:
- 确保Mesos-slave进程正常运行(端口5051可访问)
- 确保docker进程正常运行(如果使用docker的话)
- 监视基础信息,包括CUP、内存、磁盘、和网络使用状态,如果可以生成不同时间的状态图表最好。
- 监视每个容器的指标(CPU、内存、磁盘、网络)
和Master类似,slave也提供了广泛的REST API,但不同的是,slave的API返回的是该slave自己的信息,而不是整个集群的指标。通过slave的API终端,不但可以得到OS级别的资源使用率的信息,而且可以得到在某个slave上运行的容器内部的信息。
监视ZooKeeper
可以使用开源工具Exhibitor监控ZooKeeper集群,它提供了如下功能:
- 确保实例启动并且对请求做出响应。
- 执行备份和恢复
- 管理集群的配置
- 通过REST API和web界面浏览ZNodes树。
除了Exhibitor,还有很多监控脚本与ZooKeeper一起分发。check_zookeeper.py脚本可以用做Nagios check。当然也可以通过一系列查询ZooKeeper的内置命令编写自己的Nagios监控脚本。
这些内置命令是一系列四个字符的命令,通过Netcat工具发送到ZooKeeper实例上,例如假设ZooKeeper实例在2181端口进行监听,可以通过如下命令:
$ echo 'ruok' | nc zookeeper-ip 2181
如果返回imok字符串,说明服务正在运行。
ZooKeeper的四字符命令列表
修改master的法定人数
当修改master的法定人数时,有一些需要注意的事项:Mesos master通过--quorum
配置选项修改了集群的法定人数后,需要重启masters以使修改生效。另外,需要确保集群中master的数量不超过其对应的法定人数的数量(对应关系见下表)。和任何其它的生产服务一样,确保在预生产环境测试修改,之后再谨慎地对生产系统进行修改。
{% asset_img 1.png “Mesos master的法定人数”%}
增加masters
假如我们想将masters的数量从3增加到5,可以通过下面的步骤进行:
- 当前,有3个masters正在以
--quorum=2
运行。重新配置每个masters,使--quorum=3
并重新启动每个master进程。 - 添加两个masters,这两个master都以
--quorum=3
启动。
减少masters
假如将masters的数量从5减少到3,可以通过下面的步骤进行:
- 当前,有5个masters正在以
--quorum=3
运行。从集群中去掉2个master,并确保它们不会重新上线加入集群。 - 重新用
--quorum=2
配置剩下的3个masters,重启每个master。
取代masters
如果需要取代一个现有的master(删除一个master,在它的位置再添加一个master并且保持当前配置的quorum数),应该可以进行此操作而不用停机。步骤如下:
- 当前,有3个masters正在以
--quorum=2
运行。去掉你想取代的master,并确保它不会重新上线加入集群(可以用删除虚拟机,擦除硬盘等手段)。 - 提供一个新的master,并以和其它master相同的quorum配置,这里是
--quorum=2
。 - 启动这个master服务,使replicated log和已经存在的masters同步。
本篇我们探索了一些将Mesos集群用于生产的最佳实践。虽然并没有列出生产系统中应考虑的所有问题,如怎样实施安全和访问控制,怎样进行滚动升级等,但也对Mesos生产集群给出了一些参考。