云上的资源丰富,可以尽可能地把更多的服务器组织起来,作为一个统一的资源,为多个用户提供服务。而如何组织,就是分布式体系结构的范畴了。
很多场景下,请求都会汇总到一台服务器上,由这台服务器统一协调请求和其他服务器之间的关系。这种由一台服务器统一管理其他服务器的方式,就是分布式体系结构中的集中式结构(也称为 Master/Slave 架构)。
集中式结构是由一台或多台服务器组成中央服务器,系统内的所有数据都存储在中央服务器中,系统内所有的业务也均先由中央服务器处理。多个节点服务器与中央服务器连接,并将自己的信息汇报给中央服务器,由中央服务器统一进行资源和任务调度:中央服务器根据这些信息,将任务下达给节点服务器;节点服务器执行任务,并将结果反馈给中央服务器。
集中式结构最大的特点,就是部署结构简单。因为集中式系统的中央服务器往往是多个具有较强计算能力和存储能力的计算机,为此中央服务器进行统一管理和调度任务时,无需考虑对任务的多节点部署,而节点服务器之间无需通信和协作,只要与中央服务器通信协作即可,具体示意图如下所示:
Borg 是 Google 内部使用的集群管理系统,采用了典型的集中式结构,负责提交、调度、开始、重启和管理 Google 运行在其上的所有应用。
在 Borg 中,一个集群称为一个 Cell,每个 Cell 里面有一个 Leader,称为 BorgMaster,即为中央服务器;其他服务器为节点服务器或从服务器,被称为 Borglet。
BorgMaster 由两个进程组成,一个是 Borgmaster 主进程,一个是独立的 scheduler 进程:
Borglet是运行在每个节点机器的一个 agent,负责任务的拉起、停止、重启等,并管理和搜集本服务器资源,将任务的状态、服务器状态等信息上报给 BorgMaster。而 BorgMaster 会周期性地轮询每个 Borglet,以获取节点服务器的状态和资源信息等。
Borg 的整体架构示意图如下所示:
Borg 的主要用户是 Google 的开发者以及运行 Google 应用和服务的系统管理员(网站可靠性工程师,简称 SRE)。用户以 Job 的形式向 Borg 提交工作,每个 Job 由运行一个或多个运行相同程序的 Task 组成。每个 Job 运行在一个 Borg Cell 中,并将一组机器当做一个单元进行管理。
Borg 可以运行各种各样的任务,这些任务主要分为两类:
这些负载通常在 Cell 之间混合分布,每个 Cell 随着主要租户以及时间的不同会运行各种不同的应用:批处理类型的 Job 来了又走,而许多面向终端用户的 Job 又期望一个能长时间使用的模式。
Borg 主要有三大优点:
Borg 并不是第一个解决这些问题的系统,但却是少数能在这么大规模处理这些问题的同时,还能实现这样的弹性和完整性的系统之一。
Kubernetes 是 Google 开源的容器集群管理系统,是 Borg 的一个开源版本。Kubernetes 是用于自动部署、扩展和管理容器化应用程序的开源系统。核心是在集群的节点上运行容器化应用,可以进行自动化容器操作,包括部署、调度和在节点间弹性伸缩等。
Kubernetes 也是典型的集中式结构,一个 Kubernetes 集群,主要由 Master 节点和 Worker 节点组成,以及客户端命令行工具 kubectl 和其他附加项。
Master 节点运行在中心服务器上,Master 节点由 API Server、Scheduler、Cluster State Store 和 Control Manger Server 组成,负责对集群进行调度管理:
Worker 节点作为真正的工作节点,运行在从节点服务器,包括 kubelet 和 kube-proxy 核心组件,负责运行业务应用的容器。
Kubernetes 架构示意图如下所示:
Kube DNS 负责为整个集群提供 DNS 服务;CNI 是 Container Network Interface 的一个标准的通用接口,用于连接容器管理系统和网络插件。
与 Borg 不同的是,Kubernetes 主要是一个容器编排引擎,不仅支持 Docker,还支持 Rocket。
在容器管理方面,Kubernetes 有很多优势:
Apache 旗下的开源分布式资源管理框架 Mesos 被称为是分布式系统的内核,最初由加州大学伯克利分校的 AMPLab 开发,后在 Twitter 得到广泛使用。
Mesos 的开发受到了 Borg 系统的启发,也是采用的典型的集中式架构。Mesos 与 Borg 不同之处在于,Borg 的 Master 直接对接用户应用,用户可以向 Borg 的 Master 直接请求任务。但 Mesos 不可以,Mesos 只负责底层资源的管理和分配,并不涉及存储、 任务调度等功能,因此 Mesos Master 对接的是 Spark、Hadoop、Marathon 等框架,用户的任务需要提交到这些框架上。因此 Mesos 的任务调度框架是双层结构。
在 Mesos 中,一个集群包括 Mesos Master 和多个 Mesos Agent。Mesos Master 运行在中央服务器,Mesos Agent 运行在节点服务器上。
Mesos Master 负责收集和管理所有 Agent 所在服务器的资源和状态,并且对接 Spark、Hadoop 等框架,将集群中服务器的资源信息告知给这些框架,以便这些框架进行任务资源匹配和调度。Mesos Agent 负责任务的拉起、停止、重启等,并负责收集所在服务器的资源 (比如 CPU、内存等) 信息和状态,上报给 Mesos Master。
Mesos Master 通常采用一主两备的方式,以方便故障处理和恢复。而 Mesos Master 的选主策略,采用的是分布式选举的 ZAB 算法。
Mesos 对接的是框架,并且可以同时对接多个框架。
Mesos 具有如下优势:
随着分布式应用程序和微服务的流行,越来越多的用户正在寻找一种技术,来帮助他们管理这些复杂的应用程序。而 Mesos 为数据中心带来的这些好处,就使得越来越多的人关注 Mesos 及其相关项目。
容器技术解决了服务打包发布、资源隔离的问题。Kubernetes 的设计主要针对的就是容器,Mesos 本身只负责资源管理,不负责任务调度。但 Mesos 可以对接不同的框架,Mesos+Marathon 可以支持容器调度和部署。Marathon 支持容器的调度,将容器部署请求发给 Mesos Master,Mesos Master 再将请求转发给 Mesos Agent,Mesos Agent 的执行器会将容器拉起。
目前,Mesos+Marathon 支持的容器,主要包括 Docker 和 cgroups。
Borg 是 Google 公司内部使用的集群管理系统,既可以执行长服务,也可以执行批处理任务,是一个具有强大功能的、复杂的集群管理系统。
Kubernetes 是 Borg 的简化开源版,是一个正在兴起的集群管理系统。Mesos 和 Kubernetes 都是为帮助应用程序在群集环境中运行而创建的,Kubernetes 更加专注于运行容器群集,具有更多功能。
Mesos 是非常典型的开源集群管理系统。在 Mesos 之上,可以搭载诸如 Spark、Hadoop 等框架,甚至可以在 Mesos 上集成 Kubernetes,扩展性强。
这三种集群管理系统虽然具有不同的功能组件,但整体框架采用的都是集中式架构。
Kubernetes 由于其成熟的社区、丰富的文档,适合新手。