Mesos+Zookeeper+Marathon+Docker分布式集群管理最佳实践

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:
目录

 

  • Mesos简介

  • Zookeeper简介

  • Marathon简介

  • docker集群实践

  • Mesos集群部署

 

一、Mesos简介

 

Mesos是Apache下的开源分布式资源管理框架,它被称为分布式系统的内核。Mesos最初是由加州大学伯克利分校的AMPLab开发,后在Twitter得到广泛使用。

 

  • Mesos-Master:主要负责管理各个framework和slave,并将slave上的资源分配给各个framework。

  • Mesos-Slave:负责管理本节点上的各个mesos-task,比如:为各个executor分配资源。

  • Framework:计算框架,如:Hadoop、Spark、Kafaka、ElasticSerach等,通过MesosSchedulerDiver接入Mesos

  • Executor:执行器,就是安装到每个机器节点的软件,这里就是利用docker的容器来担任执行器的角色。具有启动销毁快,隔离性高,环境一致等特点。

 

Mesos-Master是整个系统的核心,负责管理接入Mesos的各个framework(由frameworks_manager管理)和slave(由slaves_manager管理),并将slave上的资源按照某种策略分配给framework(由独立插拔模块Allocator管理)。

 

Mesos-Slave负责接受并执行来自Mesos-master的命令、管理节点上的mesos-task,并为各个task分配资源。Mesos-slave将自己的资源量发送给mesos-master,由mesos-master中的Allocator模块决定将资源分配给哪个framework,当前考虑的资源有CPU和内存两种,也就是说,Mesos-slave会将CPU个数的内存量发送给mesos-master,而用户提交作业时,需要指定每个任务需要的CPU个数和内存。这样当任务运行时,mesos-slave会将任务放导包含固定资源Linux container中运行,以达到资源隔离的效果。很明显,master存在单点故障问题,为此Mesos采用了Zookeeper解决该问题。

 

Framework是指外部的计算框架,如果Hadoop、Mesos等,这些计算框架可通过注册的方式接入Mesos,以便Mesos进行统一管理和资源分配。Mesos要求可接入的框架必须有一个调度模块,该调度器负责框架内部的任务调度。当一个framework想要接入Mesos时,需要修改自己的调度器,以便向Mesos注册,并获取Mesos分配给自己的资源,这样再由自己的调度器将这些资源分配给框架中的任务,也就是说,整个Mesos系统采用了双层调度框架:第一层,由Mesos将资源分配给框架。第二层,框架自己的调度器将资源分配给自己内部的任务。

 

当前Mesos支持三中语言编写的调度器,分别是C++、Java、Python。为了向各种调度器提供统一的接入方式,Mesos内部采用C++实现了一个MesosSchedulerDriver(调度驱动器),framework的调度器可调用该driver中的接口与Mesos-master交互,完成一系列功能(如注册,资源分配等。)

 

Executor主要用于启动框架内部的task。由于不同的框架,启动task的接口或者方式不同,当一个新的框架要接入mesos时,需要编写一个Executor,告诉Mesos如何启动该框架中的task。为了向各种框架提供统一的执行器编写方式,Mesos内部采用C++实现了一个MesosExecutorDiver(执行器驱动器),framework可通过该驱动器的相关接口告诉Mesos启动task的方式。

 

整体架构如图1.1-1所示:

 

20160606102159654.jpg

图1.1-1总体架构

 

图1.1-1展示了Mesos的重要组成部分,Mesos由一个master进程管理运行着每个客户端节点的slave进程和跑任务的Mesos计算框架。

 

Mesos进程通过计算框架可以很细致的管理cpu和内存等,从而提供资源。每个资源提供都包含了一个清单(slave ID,resource1:amount1,resource2,amount2,…)master会根据现有的资源决定提供每个计算框架多少资源。例如公平分享或者根据优先级分享。

 

为了支持不同种的政策,master通过插件机制新增额一个allocation模块使之分配资源更简单方便。

 

一个计算框架运行在两个组建之上,一个是Scheduler,他是master提供资源的注册中心,另一个是Executor程序,用来发起在slave节点上运行计算框架的任务。master决定给每个计算框架提供多少计算资源,计算框架的调度去选择使用哪种资源。当一个计算框架接受了提供的资源,他会通过Mesos的任务描述运行程序。Mesos也会在相应的slave上发起任务。

 

资源提供案例,如图1.1-2所示:

 

20160606102209505.jpg

图1.1-2资源提供案例

 

下面我带大家一起熟悉图1.1-2的流程步骤:

 

  1. slave1报告给master他拥有4核cpu和4G剩余内存,Marathon调用allocation政策模块,告诉slave1计算框架1应该被提供可用的资源。

  2. master给计算框架1发送一个在slave上可用的资源描述。

  3. 计算框架的调度器回复给master运行在slave上两个任务相关信息,任务1需要使用2个CPU,内存1G,任务2需使用1个CPU,2G内存。

  4. 最后,master发送任务给slave,分配适当的给计算框架执行器,继续发起两个任务(图1.1-2虚线处),因为任有1个CPU和1G内存未分配,allocation模块现在或许提供剩下的资源给计算框架2。

 

除此之外,当任务完成,新的资源成为空闲时,这个资源提供程序将会重复。

 

二、Zookeeper简介

 

Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chuby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。

 

1.2.1Zookeeper角色

 

  • Leader(领导者):负责投票发起和决议,更新系统状态。

  • follower(跟随者):Follower用于接收客户请求并向客户端返回结果,在选主过程中参与投票。

  • ObServer(观察者):ObServer可以接受客户端连接,将写请求转发给Leader节点,但ObServer不参加投票过程,只同步Leader的状态,ObServer的目的是为了拓展系统,提高读取速度。

  • Client(客户端):请求发起方。

 

1.2.2Zookeeper工作原理

 

Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和Leader的状态同步以后,回复模式就结束了。状态同步保证了Leader和Server具有相同的系统状态。

 

为了保证事物的顺序一致性,Zookeeper采用了递增的事物ID号(zxid)来标识事物。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识Leader关系是否改变,每次一个Leader被选出来,它都会有每一个Server在工作过程中三种状态。

 

  • q   LOOKING:当前Server不知道Leader是谁,正在搜寻。

  • q   LEADING:当前Server即为选举出来的Leader。

  • q   FOLLOWING:Leader已经选举出来,当前Server与之同步。

 

1.2.3Zookeeper选举流程

 

当Leader崩溃或者Leader失去大多数的Follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的Leader,让所有的Server都恢复到一个正确的状态。

 

ZK的选举算法有两种:

  1. 基于Basic paxos实现

  2. 基于fast paxos算法实现

 

系统默认的选举算法为fast paxos。

 

1.2.4Zookeeper同步流程

 

选完Leader以后,zk就进入状态同步过程。

  • Leader等待server连接。

  • Follower连接Leader,将最大的zxid发送给Leader。

  • Leader根据Follower的zxid确定同步点。

  • 完成同步后通知Follower已经成为uptodate状态。

  • Follower收到uptodate消息后,又可以重新接受client的请求进行服务。

 

1.2.5Zookeeper工作流程

 

Leader三大功能:

  • 恢复数据

  • 维持与learner的心跳,接收learner请求并判断learner的请求消息类型

  • learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。

 

PING消息是指Learner的心跳信息;REQUEST消息是Follower发送的提议信息,包括写请求及同步请求;ACK消息是Follower的对提议的回复,超过半数的Follower通过,则commit该提议;REVALIDATE消息是用来延长SESSION有效时间。

 

Follower主要四大功能:

  • 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息)。

  • 接收Leader消息并进行处理。

  • 接收Client的请求,如果为写请求,发送给Leader进行投票。

  • 返回Client结果。

 

Follower的消息循环处理如下几种来自Leader的消息:

  • PING消息:心跳消息。

  • PROPOSAL消息:Leader发起的提案,要求Follower投票。

  • COMMIT消息:服务器端最新一次提案的信息。

  • UPTODATE消息:表明同步完成。

  • REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session还是允许其接受消息。

  • SYN消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。

 

三、Marathon简介

 

Marathon是一个Mesos框架,能够支持运行长服务,比如Web应用等。它是集群的分布式init.d能够原样运行任何Linux二进制发布版本,如Tomcat、Play等等。它也是一种私有的PaSS,实现服务的发现,为部署提供REST API服务,有授权和SSL、配置约束,通过HaProxy实现服务发现和负载平衡。

 

四、docker集群实践

 

1.4.1集群环境准备

 

20160606102222934.jpg

 

20160606102231848.jpg

 

1.4.2Zookeeper伪集群安装部署

 

部署Zookeeper需要java支持, 主流1.7,稳定最新1.8,开发最新1.9,这边选择yum安装即可支持Zookeeper

 

20160606102240516.jpg

 

1.4.2.1Zookeeper配置文件详解

 

20160606102247990.jpg

 

1.4.2.2Zookeeper配置文件修改

 

由于是伪集群的配置方式,B(IP地址)都是一样,所以不同的Zookeeper实例通信端口号不能一样,所以要给它分配不同的端口号。

 

20160606102254895.jpg

 

1、创建三个目录来存放Zookeeper的数据

 

20160606102301216.jpg

 

2、生成三份Zookeeper配置文件

 

20160606102308765.jpg

 

3、修改zk2、zk3对应的数据存放目录以及端口

 

20160606102317159.jpg

 

1.4.2.3Zookeeper角色查看

 

1、启动Zookeeper并查看角色

 

20160606102324746.jpg

 20160606102332428.jpg

 

2、连接Zookeeper

 

20160606102339698.jpg

 

五、Mesos集群部署

 

安装Mesosphere仓库,需要在Mesos Master和Mesos Slave节点安装。

 

1.5.1Mesos_Master部署

 

20160606102347804.jpg

 

1.5.2Mesos_Slave部署

 

20160606102355963.jpg

 

1.5.3Mesos_Web界面

 

访问:http://192.168.56.11:5050,如图1.5-1所示:

 

20160606102403166.jpg
图1.5-1Tasks表格没有任何条目

 

运行Mesos任务,可以在Web界面查看task如图1.5-2所示:

 

20160606102420435.jpg

 

20160606102413257.jpg

图1.5-2运行Mesos任务

 

1.5.4Marathon调用Mesos运行Docker容器

 

20160606102429757.jpg

 

通过marathon默认监听8080端口,通过marathon创建项目,如图1.5-3所示:

 

20160606102437423.jpg

图1.5-3Marathon界面

 

下面通过Mesos调度,使用marathon来创建一个nginx镜像的Docker容器,Marathon启动时会读取/etc/mesos/zk配置文件,Marathon通过Zookeeper来找到Mesos Master。

 

Marathon有自己的REST API,我们通过API的方式来创建一个Nginx的Docker容器。首先创建如下的配置文件nginx.json

 

20160606102446101.jpg

 

使用curl的方式调用

 

20160606102454820.jpg

 

访问Docker随机启动的端口31011,如图1.5-4所示:

 

20160606102501432.jpg
图1.5-4成功访问Nginx界面

 

在MarathonWeb界面查看,如图1.5-5所示:

 

20160606102508537.jpg

图1.5-5MarathonWeb界面查看Nginx已经在运行

 

在Mesos界面查看,如图1.5-6所示:

 

20160606102514533.jpg

图1.5-5Mesos界面查看Nginx Tasks

 

也可以点击Marathon左上角的创建进行创建容器。

 

注意:这里哪Nginx来举例,注册中心的marathon+mesos+docker集群是不适合用于服务的,也就是说不适合于对外开放端口的。比如说爬虫,因为不开放端口,需要做的仅仅是从队列中取资源,然后处理,存库。

 

这个仅仅是job的发布管理运行,还有没CI,也就是说持续集成,后期我会发布jenkins+docker+mesos+marathon+git持续集成的方案,如果将代码发布结合DCO框架。

 

作者介绍  徐亮伟 

  • 高级工程师,专攻自动化运维、监控、云计算领域。


本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2016-06-06

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
16天前
|
存储 监控 安全
【专栏】探讨Docker Compose的核心概念、使用方法及最佳实践,助你轻松驾驭容器编排的世界
【4月更文挑战第27天】Docker Compose是款轻量级容器编排工具,通过YAML文件统一管理多容器应用。本文分三部分深入讨论其核心概念(服务、网络、卷和配置)、使用方法及最佳实践。从快速入门到高级特性,包括环境隔离、CI/CD集成、资源管理和安全措施。通过案例分析展示如何构建多服务应用,助力高效容器编排与管理。
|
1月前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
125 2
|
5天前
|
存储 安全 持续交付
【Docker 专栏】Docker 镜像的版本控制与管理
【5月更文挑战第9天】本文探讨了Docker镜像版本控制与管理的重要性,包括可重复性、回滚能力、协作开发和持续集成。常用方法有标签、构建参数和版本控制系统。管理策略涉及定期清理、分层管理和镜像仓库。语义化标签、环境变量和配置文件在版本控制中有应用。版本系统与Docker结合能跟踪历史和促进协作。注意点包括优化镜像大小、确保安全性和兼容性。案例分析和未来趋势展示了持续发展的镜像管理技术,为Docker应用的稳定与进步保驾护航。
【Docker 专栏】Docker 镜像的版本控制与管理
|
4天前
|
监控 持续交付 Docker
使用Docker进行微服务架构的最佳实践
【5月更文挑战第10天】本文探讨了使用Docker实施微服务架构的最佳实践。首先,理解微服务架构是拆分小型独立服务的模式,借助Docker实现快速部署、高可移植性和环境一致性。Docker的优势在于服务扩展、容器编排、自动化构建与部署。最佳实践包括:定义清晰服务边界,使用Dockerfile和Docker Compose自动化构建,利用Docker Swarm或Kubernetes编排,实施服务发现和负载均衡,监控与日志记录,以及持续集成和持续部署。Docker虽重要,但需与其他技术结合以确保系统整体稳定性。
|
5天前
|
Java 数据库连接 Docker
【Docker 专栏】Docker 容器内环境变量的管理与使用
【5月更文挑战第9天】本文介绍了Docker容器中环境变量的管理与使用,环境变量用于传递配置信息和设置应用运行环境。设置方法包括在Dockerfile中使用`ENV`指令或在启动容器时通过`-e`参数设定。应用可直接访问环境变量或在脚本中使用。环境变量作用包括传递配置、设置运行环境和动态调整应用行为。使用时注意变量名称和值的合法性、保密性和覆盖问题。理解并熟练运用环境变量能提升Docker技术的使用效率和软件部署质量。
【Docker 专栏】Docker 容器内环境变量的管理与使用
|
6天前
|
数据可视化 Linux Docker
如何使用Docker部署Dashy并无公网ip远程访问管理界面
如何使用Docker部署Dashy并无公网ip远程访问管理界面
5 0
|
7天前
|
存储 数据管理 数据安全/隐私保护
【Docker专栏】Docker存储卷管理:数据持久化的关键
【5月更文挑战第7天】本文探讨了Docker容器中数据持久化的关键——存储卷,包括其独立于容器生命周期的特性、数据共享与迁移能力。Docker提供默认、命名、数据卷容器和挂载宿主机目录四种卷类型。创建与管理涉及`docker volume create`、`ls`、`run`等命令。最佳实践建议使用命名存储卷,定期备份,避免存储敏感数据,并清理未使用卷。了解和有效管理存储卷能提升容器灵活性和数据管理效率。
【Docker专栏】Docker存储卷管理:数据持久化的关键
|
7天前
|
监控 安全 数据库
【Docker专栏】Docker容器化应用的最佳实践
【5月更文挑战第7天】本文介绍了 Docker 容器化应用的关键最佳实践,包括使用官方基础镜像、保持镜像精简、以非 root 用户运行容器、安全扫描、编写高效 Dockerfile、环境隔离、使用数据卷、选择合适网络模式、设置资源限制、使用版本标签、容器编排以及文档和自动化部署。遵循这些实践可提升效率和安全性,同时要注意随着技术发展不断更新知识。
【Docker专栏】Docker容器化应用的最佳实践
|
7天前
|
存储 大数据 Apache
深入理解ZooKeeper:分布式协调服务的核心与实践
【5月更文挑战第7天】ZooKeeper是Apache的分布式协调服务,确保大规模分布式系统中的数据一致性与高可用性。其特点包括强一致性、高可用性、可靠性、顺序性和实时性。使用ZooKeeper涉及安装配置、启动服务、客户端连接及执行操作。实际应用中,面临性能瓶颈、不可伸缩性和单点故障等问题,可通过水平扩展、集成其他服务和多集群备份来解决。理解ZooKeeper原理和实践,有助于构建高效分布式系统。
|
13天前
|
存储 Linux 文件存储
Linux使用Docker部署Traefik容器并实现远程访问管理界面-1
Linux使用Docker部署Traefik容器并实现远程访问管理界面