数据平台的云原生(Cloud Native)架构设计

2023-05-2217:47:27云计算与物联网Comments626 views字数 6584阅读模式

云原生(Cloud Native)是由Matt Stine在2013年提出的概念,其目标是为了解放开发和运维的工作,让应用能够更好的适合云架构。云原生是一种新的设计模式,它要求云原生应用具备可用性和伸缩性,能够制动或部署、发布和管理,可以随处运行,并且能够通过CI/CD来提升研发、测试和发布的效率。本篇介绍云原生架构设计。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

数据平台的云原生(Cloud Native)架构设计

— 云原生技术介绍 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

云原生在技术部分上依赖于在传统云计算的3层概念:基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。例如,敏捷的不可变基础设施交付类似于IaaS,用来提供计算网络存储等基础资源,这些资源是可编程且不可变的,直接通过API可以对外提供服务;有些应用通过PaaS服务本来就能组合成不同的业务能力,不一定需要从头开始建设;还有一些软件只需要“云”的资源就能直接运行起来为云用户提供服务,即SaaS能力,用户直接面对的就是原生的应用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

云原生应用,顾名思义,就是专门为在云平台上部署和运行而涉及的应用。采用云原生技术构造的应用,可以充分利用云平台来实现资源的按需分配和弹性伸缩;此外应用本身更加具备柔性,即在高并发压力下能够有效的缓解访问压力或者弹性扩展,并在压力过后有很好的恢复能力。此外,云原生需要充分考虑可扩展性和多租户能力,基于云原生构造的分布式系统需要能够扩展到成千上万个节点的能力,并且能够支持多租户和服务自愈。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

数据平台的云原生(Cloud Native)架构设计

企业数字化业务演进的一个重要过程就是应用开发模式的演进,或者说应用架构的演进。在过去的十几年中,互联网公司的应用架构大多经历了由单体式应用架构到更加灵活的分布式应用架构的转变。这其中的主要原因是因为互联网应用的业务简单,但是访问量大,数据量多,传统的单体架构已经无法满足日益增长的业务需求。而企业级应用虽然业务功能复杂,但是用户量、访问量小,并没有达到明显的技术瓶颈,因此许多企业的应用架构依旧停留在传统的单体应用架构。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

原生云平台的一个主要特性就是面向微服务设计,使用容器的方式来编排普通的Web应用或者微服务。对于没有数据存储的无状态服务,容器有多种编排方式进行编排和管理;但是对于有数据状态的服务,如数据库(MySQL)或者分布式存储服务(如HDFS),由于容器内的数据会随着容器的销毁而销毁,采用传统的编排方式,将无法保证数据状态的一致性和数据持久化。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

大数据和AI计算都涉及大量的数据和复杂的迭代运算,为了达到更好的性能,MapReduce、Spark和TensorFlow在架构中都特别注重“计算贴近数据”设计,一般会根据数据的位置来选择启动相应的计算服务,尽量让计算任务和数据任务在同一个节点上,这样就可以避免网络带宽带来的性能损失。而在容器模式下,不同的服务封装在不同的容器内,并且使用容器自身的网络;而容器网络一般采用重叠网络(Overlay Network)模式,因此容器内的应用并不能感知调度容器机器的物理拓扑,因此也就无法确定从哪个节点调度计算任务所在的容器。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

另外,大数据或者AI应用都是资源密集型应用,在运行时会对CPU、GPU、内存、磁盘、网络等资源进行动态地申请和释放。如某个应用可能会根据用户的输入生成一个Spark的机器学习任务,在大数据平台上生成若干个执行任务并申请一定的CPU和内存资源,如何及时地响应这些短生命周期服务的资源需求,也是当前各种原生云的调度系统无法有效支持的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

— 云原生架构的设计考量 

为了有效解决各种实际技术难题,重新设计云平台的调度系统成为必须考虑和完成的工作。相比较原生的Kubernetes调度系统,需要从以下方面重新设计云平台的调度系统。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

  • 支持本地存储并基于存储感知的容器调度

为了有效支持有状态的服务,如数据库服务(MySQL),分布式存储服务(HDFS,Elastic Search),本文设计了基于本地存储的存储服务。云储存将所有的存储资源抽象为一个存储池,每个节点的本地存储抽象为若干持久化存储池,而单个可以被容器申请的存储资源定义为Persistence Volume(PV)。每个PV只能被一个容器挂载,可以是任意大小,支持HDD(hard disk drive,硬盘驱动器)或SSD(solid state drive,固态硬盘),也支持HDD与SSD组成的分层式存储。有状态的容器服务在启动时会申请需要的PV资源(如大小、IOPS要求、SSD或HDD),调度器需要能够在ms内从平台内找到合适的机器将容器调度起来;如果容器因为各种原因不能正常工作,调度器能够检测到不健康的状态,同时根据数据的物理拓扑情况,选择合适的机器重启相应的容器。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

  • 网络物理拓扑的感知与实时调度能力

为了支持灵活弹性的调度,一般情况下云原生平台都为容器设计专门的网络空间,并且一般与主机网络保持透明。一般一个服务器节点上会有多个容器服务,因此主机IP的数量远小于容器IP的数量。在MapReduce、Spark和TensorFlow的设计中,在启动计算任务的时候,会根据数据存储的物理拓扑,来决定最终服务启动在哪个服务器上。但是在容器平台上,所有的任务都只能感知容器网络,而不能感知物理机器的IP,无法了解数据分布的物理拓扑,因此也就无法保证计算和数据的局部性。为了解决这个问题,在调度系统内增加了网络物理拓扑模块,实时地维护物理IP和容器IP的映射关系表。当有状态服务在申请调度的时候,可以通过IP映射表来找到可用于最终调度的物理机器。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

  • 动态标签能力与基于标签的调度能力

复杂的应用系统对调度系统有更多细节的要求,如多租户业务系统往往要求一个租户的所有服务尽量调度在同一批物理机器中;支持高可用的服务往往要求调度系统有反亲和性要求,即将一个服务的多个实例调度到不同的物理机器上,这样就不会发生一个物理机器宕机后影响多个高可用实例,从而导致服务不可用的情况。因此在调度系统中增加了动态打标签的能力和基于标签的调度,调度模块可以根据运行时的数据给物理机器和容器应用动态增加或删除标签,而调度系统根据标签的匹配度来选择更合适的调度策略。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

  • 应用依赖与运行参数的感知,以及基于参数的调度能力

分布式应用在微服务拆分后,每个服务就有比较复杂的依赖服务链以及影响的服务链,而每个微服务在运行时都可能发生运行参数变化、服务启停、重新调度等操作,这些变化不仅仅影响当前的微服务,还可能影响所有的依赖链的服务。因此调度系统中增加了应用配置感知模块,通过与全局的配置中心的数据交互,调度系统能够实时地感知一个应用变化的事件的所有影响情况,并根据多个可能的状态迁移图来选择最合适的调度策略。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

数据平台的云原生(Cloud Native)架构设计

类似于操作系统的调度模块,云平台的调度是整个云平台能够有效运行的关键技术。云平台的总体架构如上图所示,最底层是Kubernetes服务。在其上层运行着自研的几个产品或服务,其中配置中心用于实时地收集和管理云平台内运行的所有服务的配置参数,支持运维人员手工地对一些服务进行参数设置或管理;物理资源池是通过各个服务进行池化后的逻辑资源,如100 vcore/100 T Mem、20 GPU core等,应用申请的物理资源都会从这个资源池中逻辑地划分出去,在应用使用完结后再返还给资源池,平台会给不同的租户做资源配额限制;云存储服务是基于本地存储开发的分布式存储服务,会保留状态服务的数据,保证应用数据的最终持久化和灾备能力;云网络是自研的网络服务,提供应用和租户类似VPC(virtual private cloud,虚拟私有云)的网络能力,可以做到完整地资源隔离和SLA管控;标签中心用于实时地收集和管理各个应用、主机、资源的标签,支持动态的标签修改与实时调度触发。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

在此之上是云调度系统,它接收应用的输入,从配置中心、标签中心、云存储和网络服务中实时获取平台运行指标,以及从资源池中获取资源的使用情况,从而根据运行时的信息进行精确的调度决策。调度系统之上就是各类的应用服务,包括大数据、AI、数据库类,以及各种微服务。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

—调度系统架构—文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

本文设计的云平台的调度系统的内部架构如下图所示,包含元信息模块、对外服务模块以及调度决策模块。当一个应用通过Kubernetes API或者命令行(基于Kubectl)的方式启动的时候,它会传入一个指定服务编排方式的yaml文件以及启动应用需要的容器镜像在yaml文件中会指定当前应用需要的资源、调度相关的标注信息或者标签信息,以及对其他应用的依赖关系。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

数据平台的云原生(Cloud Native)架构设计

对外服务模块负责解析编排文件,同时负责完成应用的依赖解析和管理,生成对服务的依赖图;参数计算模块负责编排文件中和配置变量相关的计算并生成最终的资源需求;实例渲染模块最终生成一个完整的应用描述,并将这个描述文件提交给调度决策模块。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

元信息模块负责与Kubernetes平台交互,实时地维护用于调度的各种元数据。资源池数据主要包括当前集群的各种资源总量以及当前的使用情况,并可以精细到各个节点和硬盘级别;网络拓扑模块负责与容器网络进行交互,实时地维护当前容器网络与主机网络的拓扑;存储拓扑模块负责与云存储服务交互,实时记录当前存储池的各个存储卷(PV)的容量使用情况和IOPS(input/output operations per second,每秒进行读写操作的次数)/BPS;服务运行指标主要同步当前集群各个物理节点上各个容器的运行指标,以及各个物理机的各项资源的使用指标;配置元数据模块主要协助配置中心,维护各个应用的实时配置参数。因此,通过元信息模块,调度器能够维护当前云平台的各种调度决策数据,从而可以实时地根据运行数据进行最优化调度。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

在服务模块提交了实时渲染的应用描述请求后,调度系统会根据请求中的资源大小,通过内部的6个调度器来进行调度目标的选择。首先依赖调度器会解析应用的需求,同时遍历当前的服务元数据,查找是否有已经在运行的可以给当前应用依赖的微服务,如果有,则直接使用该服务并更新相应的配置参数,如果没有,则解析被依赖的服务的参数同时选择走一遍完整的调度流程;如果有嵌套服务依赖,则递归调用相关的调度逻辑直至所有依赖链的服务都处于运行状态。存储调度器提供基于存储感知的容器调度能力,它会解析应用是否有明确的本地数据的要求,如果有则从存储拓扑中找到合适的物理节点组,并将其他节点标记为此次调度无效;资源调度器负责找到有足够资源启动应用或者容器的物理节点组;网络调度器负责根据应用的网络IP要求选择满足网络规则的物理节点组;标签调度器负责选择满足各种标签规则的物理节点组。通过这5个调度器选择后的物理节点如果有多个,调度器则根据负载均衡的原则来选择合适的物理节点来启动这个容器;如果没有任何节点有足够的资源,SLA调度器会遍历被选择指定节点上已经在运行的所有容器,找到当前被优先级更低的应用占用的容器并选择kill等机制,循环此操作直到资源满足本次调度为止,从而实现高优先应用的抢占式的调度策略。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

  • 配置标签中心

由于每个服务运行时都可能发生重启或者迁移,以及API 网关等可能会动态地的设置运行参数等,为了让服务能够及时地感知各种运行参数,创建了一个统一的配置标签中心作为中心化的服务提供配置和标签元数据的管理和查询。应用程序使用的配置基于Kubernetes ConfigMap的方式来实现配置与容器镜像解耦。ConfigMap包含了labels和data属性,都是以Key-Value数据对的方式来保存。容器里可以直接引用相应的ConfigMap中的数据,而这些配置数据则存储在配置标签中心服务中。用户可以通过界面或者命令行的方式来修改配置的数值或者增加新的Key-Value,并且每当有任何配置数据修改后,Kubernetes会动态地修改每个节点的ConfigMap文件,并在短时间内让容器知晓相应的数据变化,从而实现中心化的动态配置和标签修改。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

  • 云存储服务

云平台中的存储服务Warpdrive提供一个中心化的Restful服务,可以支持外部服务对存储卷的实际使用情况的实时查询,因此调度器通过监听相关的接口来实时感知每个主机的存储卷使用事件,以及每个容器对物理节点的绑定关系。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

  • 云网络服务

网络服务也同样提供Restful API查询服务,使得调度器可以知晓各个容器IP和物理IP的使用情况,以及各个容器的网络防火墙规则等实时数据,因此调度器能够实时地感知云平台内的网络和存储实际运行情况。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

— 调度的总体流程—文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

对于调度策略模块,它的输入是应用的资源需求、标签属性、依赖关系和输入输出参数等信息,而输出就是选定的物理节点或者节点组,以及对应的容器的优先级信息,它同时依赖元数据模块提供的平台运行数据进行调度决策支撑。调度器的决策流程如下图所示。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

数据平台的云原生(Cloud Native)架构设计

调度器从任务调度队列获取待调度的任务,形成节点-任务映射表。其中,调度器持续对API服务器中创建的任务进行监听,并读取新的任务形成任务调度队列。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

  • 筛选阶段:调度器根据映射表以及预设筛选条件确定一组符合条件的目标物理节点。其中,预设筛选条件可以是当前任务所需的资源与物理节点上的剩余资源之间的匹配条件、当前任务所需的端口与物理节点上的端口之间的匹配条件,以及是否带有特殊标签等。如果当前任务配置了对持久化存储的需求或者对数据拓扑的感知,调度器也会考虑满足这些条件的节点。最终调度器会将满足上述所有筛选条件的节点整理出来进行下一步处理。
  • 优选阶段:调度器根据筛选阶段拿到的节点以及预设优选条件对各个物理节点进行评分,最终选择分数最高的作为目标物理节点。其中优选条件包括节点空闲资源越多,评分越高;节点保存的任务镜像越多,评分越高;任务亲和性/反亲和性越匹配,评分越高;同类任务分布越均匀,评分越高等。

通过上述两次筛选,选择出一个分数最高物理节点。调度器将当前任务与目标物理节点绑定,并将绑定的信息发送到API服务器。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

  • 基于优先级的抢占式调度方法

在平台的资源出现不足而有更高优先级的服务需要被调度的情况下,调度器就需要进行抢占式调度。在目前的实现中,抢占式调度提供了2种方式:调度阶段的资源抢占和运行阶段的资源抢占。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

调度阶段的资源抢占即在调度器筛选节点阶段,如果发现集群中所有节点都无法满足当前任务的资源需求时,调度器会在集群中选择节点,并试图抢占其中正在运行的低优先级的任务,算法优先选择具有低优先级且高资源需求任务的节点。抢占完成后调度器会再次尝试调度当前任务到目标节点上。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

调度阶段的资源抢占实际上是一种逻辑层面的抢占,依据是任务在启动时声明的资源请求,它可以帮助系统避免任何资源超配的现象,但同时也会造成一定程度的资源浪费。比如一个声明了10 core CPU的任务可能当前只消耗了2 core的CPU,此时完全不需要抢占掉它也可以让别的任务运行起来。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

基于此种考虑,又引入了运行阶段的资源抢占算法。运行阶段的资抢占度会忽略掉优先级低于当前任务的任务,即如果有必要可以完全抢占这些低优先级的任务,所以它们不在节点资源消耗的统计范围内。抢占阶段发生在物理节点上,当物理节点发现某种资源剩余小于预期值时,会对其上低优先级的任务进行清除,直到物理节点状态恢复正常。此种抢占方式基于物理节点的资源真实使用情况,可以保证集群资源最大程度利用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

  • 计算调度过程中的数据拓扑感知

在容器云计算环境下,分布式网络中的各个主机可以为一个或多个独立的网络,每个网络都可以包括一个或多个子网络,网络地址从该主机上的子网络中获得。当容器销毁时,容器的网络地址被回收,用于下次使用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

应用感知数据拓扑的方式如下图所示,当容器中的数据应用如Spark应用需要启动计算任务时,调度器会首先根据该服务的依赖找到其需要的数据应用的容器(如HDFS 数据节点),然后通过元信息模块查询其所在的物理节点的网络和存储信息。元信息模块通过对存储服务和网络服务的实时查询来获取和维护最新的元数据。一般情况下分布式存储有多个存储副本,会通过调度器的反亲和性保证都调度在不同的物理节点上,因此调度器会得到一个物理节点的列表。然后根据这几个节点的实际资源使用负载情况选择当前资源最低的节点来启动对应的计算服务容器。由于两个容器都在一个主机上,计算服务可以与存储服务通过本地网络进行数据传输,或者创建域套接字(Domain Socket)机制来提高数据读取速度,增强性能。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html

数据平台的云原生(Cloud Native)架构设计
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/yunda/41329.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/yunda/41329.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定