双11特刊 | 全面云原生化,数据库实例独共享混部 最高降低30%成本

简介:2021年双十一是阿里巴巴集团的核心应用全面云化的第二年。今年在保证稳定性的前提下,主要探索如何利用云原生的技术优势,降低成本,提升资源利用率。在今年大促中,针对核心集群采用独享共享实例混部,统一了底层资源,结合交易业务云盘化使得混部单元大促成本下降30%+。

引言

2021年双十一是阿里巴巴集团的核心应用全面云化的第二年。今年在保证稳定性的前提下,主要探索如何利用云原生的技术优势,降低成本,提升资源利用率。在今年大促中,针对核心集群采用独享共享实例混部,统一了底层资源,结合交易业务云盘化使得混部单元大促成本下降30%+

云原生数据库管控

随着云原生技术的普及,越来越多的应用开始运行在Kubernetes上,Kubernetes有一统应用交付界面的趋势。数据库产品内部也在全面推进云原生,期望通过资源池化及与云基础设施深度集成释放数据库产品能力,数据库管控本全面基于Kubernetes来编排DB实例。由于单一的Kubernetes集群规模限制无法满足DB实例的部署规模,所以我们设计了一套多集群的调度编排系统,能够支持多个Kubernetes集群的资源调度。

接入Kubernetes集群的Node,数据库不同的产品会在以下2种模式下根据业务特定自行选择:

  • 单实例独占ECS Node:节点实例独占,资源调度工作有ECS完成,特点是节点间隔离性较好,但是由于ECS的资源严格限制,也导致了一些在稳定性和性能的问题
  • ECS资源池模式:数据库团队维护一个由较大规格的ECS组成的资源池,由数据库的二次调度在资源池内进行调度。特点是可以在多Pod间协调资源,提升产品的稳定性和性能。

对于第二种,构建ECSPool由数据库团队进行二次调度的场景下,要求采用cgroup隔离组的模式进行实例Pod的资源限制,对于云上的客户而言,存在两种实例形态:

  • 独享:采用cgroup里面cpu-set的模式来进行cpu资源的绑定
  • 共享:采用cgroup隔离组的里面的cpu-share来进行资源隔离,并一定程度上镜像cpu资源的超卖。

底层的ECS资源池会根据两种不同隔离模式严格划分,分为独占资源池和共享资源池。某一个Node,一旦分配了独享实例就不再允许分配共享实例,严格划分了两个独立的资源池。

1637044729506-6c229c6f-8611-4457-970c-b8815323abd8.png

一般情况下,资源池由阿里云数据库团队来进行统一调度。由于节点池足够大,区分不同的资源池并不会产生资源利用不佳的情况。但对于服务于企业级的客户而言,由于不与其他客户进行混合部署,这种严格区分的模式资源利用率就不是最佳。举个例子:客户由4个实例,2个采用共享模式,2个需要采用独占模式;按照之前的调度逻辑,客户则必须采购4台机器才能完成实例的部署。因此,为了解决上面的问题,我们希望能够将核心实例和非核心实例混部部署在同一台机器上。同时核心实例采用CPUSet的方式保证独享部分CPU核心,非核心实例采用CPUShare的方式共享剩余的CPU核心,实现资源的充分利用。

CPUSet和CPUShare模式混部方案

独享共享混部的前提是独享实例的性能不受影响,因为必须对共享实例使用的资源进行限制。在Kubernetes中,通过cgroup可以限制pod可以使用的cpu和memory的上下限。其中,对于内存的限制比较简单,给pod设置一个内存最大可用内存,一旦超过内存上限就会触发OOM。对于cpu的限制,Kubernetes采用cfs quota来限制进程在单位时间内可用的时间片。当独享和共享实例在同一台node节点上的时候,一旦实例的工作负载增加,可能会导致独享实例工作负载在不同的cpu核心上来回切换,影响独享实例的性能。所以,为了不影响独享实例的性能,我们希望在同一个node上,独享实例和共享实例的cpu能够分开绑定,互不影响。

Kubernetes原生混部实现

在linux中,通过cgroup的cpuset子系统可以实现绑定进程到指定的CPU上面,docker也有相关的启动参数来支持绑定容器到指定的CPU上。

--cpuset-cpus=""  CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems=""  Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems.

Kubernetes 从1.8版本以后,提供了CPU Manager特性来支持cpuset的能力。从Kubernetes 1.12版本开始到目前的1.22版本,该特性还是Beta版。CPU Manager是kubelet中的一个模块,主要工作就是给某些符合绑核策略的containers绑定到指定的cpu上,从而提升这些CPU敏感型任务的性能。

目前CPU Manager支持两种Policy,分别为none和static,通过kubelet --cpu-manager-policy设置,未来会增加dynamic policy做Container生命周期内的cpuset动态调整。

none: 为cpu manager的默认值,相当于没有启用cpuset的能力。cpu request对应到cpu share,cpu limit对应到cpu quota。
static: 允许为节点上具有某些资源特征的 pod 赋予增强的 CPU 亲和性和独占性。kubelet将在Container启动前分配绑定的cpu set,分配时还会考虑cpu topology来提升cpu affinity

static策略管理一个共享CPU资源池,最初该资源池包含节点上所有的CPU资源。可用的独占性CPU资源数量等于节点的CPU总量减去通过 --kube-reserved 或 --system-reserved 参数保留的CPU 。从1.17版本开始,CPU保留列表可以通过 kublet 的 '--reserved-cpus' 参数显式地设置。 通过 '--reserved-cpus' 指定的显式CPU列表优先于使用 '--kube-reserved' 和 '--system-reserved' 参数指定的保留CPU。 通过这些参数预留的 CPU是以整数方式,按物理内 核 ID 升序从初始共享池获取的。 共享池是 BestEffort 和 Burstable pod 运行 的 CPU集合。Guaranteed pod中的容器,如果声明了非整数值的CPU requests,也将运行在共享池的CPU上。只有Guaranteed pod中指定了整数型CPUrequests 的容器,才会被分配独占CPU资源。

Kubernetes作为通用的容器编排平台,其提供的绑核功能,具有一定的局限性:

  • 需要显示开启,且pod的QoS必须是Guaranteed级别,数据库实例资源超卖,pod的request和limit设置不同。
  • kubelet的CPU分配策略固定且不支持灵活扩展,不能满足独共享混部的调度场景。
  • 不支持动态放开绑核限制。在大促的时候,为了提高数据库性能,有时需要临时放开实例的资源限制,kubelet不支持放开绑核。

调度平台混部实现方案

Kubernetes默认的绑核能力,其中绑核策略是放在kubelet里面,不易修改和扩展,而针对不同的业务场景,绑核策略可能不同,放在调度测统一管理更加合适。由于kubelet仅负责执行绑核,而具体的绑核策略需要由上层业务来指定;因此在创建CPUSet模式的pod的时候,我们给pod打上annotaion,kubelet在启动容器之前,就会将pod绑定指定的CPU上。

  annotations:alloc-spec: |{"cpu": "Spread"}alloc-status: '{"cpu":[0,1]}'

alloc-spec:指定具体的分配策略,支持以下几种模式:

  • Spread:在物理核上打散绑定逻辑核,在同物理核对端的逻辑上适宜放置压力小的应用,统一调度也提供了应用间物理核堆叠约束的编排算法。
  • SameCoreFirst:同物理核绑定优先,尽量讲逻辑核分配在相同的物理核上。
  • BindAllCPUs:绑定所有的 CPU 核。

alloc-status:绑定的具体cpu核数。

当调度器在节点上分配或者释放 CPUSet 模式的 Pod 之后,CPUShare Pod 可使用的 CPU 核数量将发生变化,可以通过修改节点的annotation来告知 kubelet可share节点的范围:

kind: Node
metadata:name: xxannotations:cpu-sharepool: '{"cpuIDs":[0,1,2,3,4,5,6,99,100,101,102,103]}'

要实现独享共享混部,只需要给独享实例指定为CPUSet模式,共享实例指定为CPUShare模式,就可以实现共享和独享实例CPU分开绑定,互不干扰。但该方案有以下限制:对Kubernetes原生的kubelet组件进行了定制开发,这就限制了在通用环境下的部署。

基于调度器和扩展控制器的混部实现方案

上面分析了Kubernetes原生和调度平台的混部实现方案。从分析结果看,都无法完全满足数据库这边对于实现独享共享混部方案的绑核需求,我们希望在不修改Kubernetes源码的基础上,能够支持不同的绑核策略。

在介绍我们的实现方案前,先介绍下混部在数据库管控架构下主要涉及到的三个组件。

  • 调度器:调度器具有全局的资源视图,能够根据业务指定的调度策略,分配不同的CPU核心。当前支持的CPU调度策略包括:独共享、NUMA亲和性和反亲和性,IO多队列分布等
  • 控制器:负责将调度器分配的CPU核心设置到pod的annotation上,并对业务提供查询接口
  • cgroup-controller:以daemonset的方式部署在每个node节点上,watch本节点的pod资源,当发现pod的annotation上有绑核信息时,修改pod对应的cgroup cpuset配置,完成绑核。

这套架构和原生Kubernetes集群相比,最大的区别有两个地方,第一:多Kubernetes集群调度,解决数据库规模化对单集群的约束;第二:数据库资源调度与实例创建逻辑解耦,资源调度发生在pod的创建之前。在实例创建的时候,先通过调度器调度分配资源,成功后,业务才会发起任务流拉起实例。

调度器

调度器的核心流程和Kubernetes调度器流程类似(Filter -> Ranker -> Assume -> Process pod)

  • Filter    : 过滤不符合要求的Node
  • Ranker  : 计算Node分值并选择分值最高的Node
  • Sync Process Pod :异步处理资源申请(云盘、安全组、ENI等)

在独共享混部中,调度器负责为独享实例分配具体的CPU核心,CPU核心的分配策略支持业务自定义。在集团的独共享混部场景中,主要实现了以下逻辑流程:

Node CPU data/state初始化和同步

IO队列分布信息和具体的物理机型号有关,node节点在上线的时候,会由将node的IO队列信息打到node的annotation上,调度器会watch到node节点的IO队列信息,并进行有效性校验并初始化。当调度器会watch到annotation变化,且满足以下两个条件会更新CPU信息。

  • CPU是弹升
  • 原IO队列CPU分布和新的IO队列相同CPU分布完全一致

独享实例绑核IO队列打散

在选择独享实例CPU核心的时候,会考虑按IO队列打散。

1636979167674-e3dd18bb-a9ea-47db-9f01-2629eb437e49.png

打散策略依赖node的cpu分配优先级(上图箭头指向是优先级由高到低)

混部Filter编排

调度器解耦不同Filter,以插件化编排的方式实现定义不同业务的Pipline

应用维度全部做反亲和处理

无论独享还是共享,同一应用在同一台机器上只有1个节点,确保集群维度在单机故障时的影响最多1/N

resourceSet.spec.scheduleConfig.policy.machineMaxList.N.key = ${APP_NAME}
resourceSet.spec.scheduleConfig.policy.machineMaxList.N.value = 1

申请一个inver业务的Pod(machineMaxKey=inve、value=1)过程如下

1636979855771-c14d9997-10d7-4d10-90cb-acb0422e987e.png

共享独享CPU混合调度

未分配的主机(104C),预留8C,最大可分配是96C。调度两个32C的共享实例,再释迁移一个32C的共享实例流程如下图

1636982307230-b593ac57-cce6-4c35-b8ca-ed27f17791d0-1.png

单个ECS独享实例可售最大CPU比例为2/3:即96核物理CPU可售卖的最大独享CPU为64核,剩余32核按固定超卖比超卖给其他实例 (独享实例不可占用整台机器)

1636982334421-0da0a484-274c-4ea3-a73d-3972c068762e.png

可售独享实例CPU计算: 可售CPU=min(a,b)

a.   可售CPU规格=单机可售物理CPU-max(共享实例规格)*2
b.   可售CPU规格 = 【单机可售CPU - sum(共享实例已售CPU)】/超卖比

控制器

控制器为业务屏蔽了底层Kubernetes资源接口,业务所有的操作全部由控制器来统一进行转换。在独共享混部方案里面,控制器负责将调度器分配的绑核信息更新到pod的annotation上,并在pod启动的时候校验启动的绑核信息是否正确。同时在大促场景中,一旦独享实例出现性能瓶颈,需要能够临时占用整机的cpu资源,控制器负责向业务提供临时放开CPU绑核的限制的接口。

  #独享实例pod需要指定的annotationannotations:cpu-isolate-mode: exclusive #指定为独享实例custom-cgroup-info: '{"engine":{"cpuset":"2-3"}}' #指定具体容器绑定的cpu核心exclude-reserve-cpuset: "true" #是否需要扣除node上预留的cpu核心release-isolate-mode: "true" #是否需要临时放开绑核限制,如果设置了可以绑定除了预留所有cpu核心,大促时候的应急预案

cgroup-controller

cgroup-controller是Kubernetes里面的一个扩展控制器,它通过daemonset的方式部署在Kubernetes集群里面,它将宿主机上的/sys/fs/cgroup/目录挂载到容器内,在watch到pod需要绑核时,根据pod的qos等级,找到对应的cgroup配置路径,直接修改cgroup的配置文件。

     volumes:- hostPath:path: /var/run/type: "Directory"name: docker-sock- hostPath:path: /sys/fs/cgroup/type: "Directory"name: cgroups

在独共享混部的方案里面,cgroup-controller除了需要能够为独享实例绑定CPU核心以外,还需要维护共享实例的CPU资源池。cgroup-controller会记录当前节点上独享CPU和共享CPU的核心分布,当节点上的独享实例发生变化时,动态调整node上共享pod的可用的CPU列表。例如,当前node节点预留CPU:[0-1],调度了一个独享实例占用CPU:[2-3],cgroup-controller会计算当前node节点上的共享CPU=总的CPU-node预留-独享CPU,并将共享pod全部绑定到共享CPU核心上。当再调度一个独享pod,cgroup-controller会更新共享CPU核心,并刷新主机上所有共享POD绑定的CPU核心。

1637068774721-2cb49843-ddeb-4456-aad0-1ccf053395f4.png

cgroup-controller通过直接修改pod的cgroup配置来实现动态调整pod的资源配额,虽然不需要浸入kubernetes源码,但也存在以下几个问题:

  • cgroup-controller只能在容器启动后,才能修改容器的资源配额
  • 当独享实例发现变化时,会动态刷新共享实例的CPU绑核,对共享实例的性能可能存在一定的影响

cgroup-controller能够直接操作DB实例cgroup的资源限额,能够直接影响DB实例的数据面,所以在具体执行修改时会做一些必要的安全检查。比如在设置独享实例的绑定的CPU时,会校验绑定的核心是否满足IO队列分布,绑定的CPU核心是否超过单节点可售卖独享CPU的核心数等。

原文链接
本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IPv6时代,中小企业该如何布局?

简介:IPv6要为全世界的每一粒沙子都分配一个IP,你的企业跟上了吗? 11月中旬,中央网信办等部门联合印发了《关于开展IPv6技术创新和融合应用试点工作的通知》,联合组织开展IPv6技术创新和融合应用试点工作,…

Gartner 发布新兴技术研究:深入洞悉元宇宙

供稿 | Gartner出品 | CSDN云计算根据Gartner预测,2026年全球30%的企业机构将拥有元宇宙产品和服务。元宇宙是一个由独立但相互连接的网络所组成的持久、沉浸式数字环境,但目前尚未确定这些网络将使用的通信协议。元宇宙能够实现持久、去中心化、可互操作…

并发场景下的幂等问题——分布式锁详解

简介:本文从钉钉实人认证场景的一例数据重复问题出发,分析了其原因是因为并发导致幂等失效,引出幂等的概念。针对并发场景下的幂等问题,提出了一种实现幂等可行的方法论,结合通讯录加人业务场景对数据库幂等问题进行了…

双11特刊|十年磨一剑,云原生多模数据库Lindorm 2021双11总结

前言 2021 年,转眼 Lindorm 已经在阿里发展了十年的时间,从基于 HBase 深度改造的 Lindorm 1.0 版本,到全面重构,架构大幅升级的 Lindorm 2.0 版本;从单一的宽表引擎,到支持搜索、时序、文件等多种结构化数…

怎么样升级成为鸿蒙系统,手机升级成为鸿蒙系统第一手体验怎么样?-电脑自学网...

自从华为鸿蒙系统上线以来,除了6月2日发布会爆料出鸿蒙细节、功能之外,还给部分华为手机提供了鸿蒙系统的升级包。不知道大家有没有升级?其实很多小伙伴处于观望状态,因为新系统的缺点不可避免,升级了系统就再也回不去…

换个姿势看 hooks,灵感来源组合和 HOC 模式下逻辑视图分离新创意

作者 | 👽来源 | 前端Sharing前言懂得 JSX 本质的同学都知道它只不过是一种语法糖,会被 babel 处理成 createElement 的形式,最后再变成常规的 js 对象。所以,我们就可以在 js 逻辑层面对 element 对象做处理,自定义 …

双11特刊 | 云数据库RDS如何顺滑应对流量洪峰

简介:从绿色低碳到硬核科技,看RDS如何用绿色科技助力2021“双11”? 双十一回顾 从平台到商家,再从物流到客户手中,云数据库RDS支撑着双11集团电商的在线业务。RDS首次对集团核心业务进行国产化技术演进试点&#xff…

双11专刊|云原生数据仓库AnalyticDB支撑双11,大幅提升分析实时性和用户体验

简介:2021年双十一刚刚落幕,已连续多年稳定支持双十一大促的云原生数据仓库AnalyticDB,今年双十一期间仍然一如既往的稳定。除了稳定顺滑的基本盘之外,AnalyticDB还有什么亮点呢?下面我们来一一揭秘。 一 前言 2021年…

html传输的数值表示的含义,数字传递游戏的意义与感悟_传数字游戏心得体会

在大学生入职培训期间,曾组织他们做了一场小游戏,游戏规则如下:1、80名学生平均分成8组,排成8列,统一面向讲台做好;2、主持人向每组的最后一名队员提供一个数字(数字一般为3位或4位数,不确定&am…

德勤2022技术趋势:IT自我颠覆、技术跨界融合创新

作者 | 宋慧 出品 | CSDN云计算 IT 技术,一直处于快速发展与变化中。 基于对前沿技术的观察分析与自身实践,国际机构德勤管理咨询每年发布对于未来 18-24 个月的的重要技术趋势。2021 年 CSDN 曾报道 德勤2021技术趋势:繁琐、点状的匠人AI时…

双11特刊|购物车实时显示到手价,看云原生内存数据库Tair如何提升用户体验?

阿里云自研内存数据库Tair诞生于2009年,是一种支持高并发低延迟访问的云原生内存数据库,完全兼容Redis,已历经多年双11大促考验,提供核心在线访问加速能力,显著提升系统吞吐量。 作为双11大促承载流量洪峰的利器&…

Dubbo-Admin 正式支持 3.0 服务治理

简介:Dubbo 相信大家并不陌生,是一款微服务开发框架,它提供了 RPC 通信与微服务治理两大关键能力。大家在日常开发中更多使用的是 Dubbo 提供的 RPC 通信这一部分能力,而对其提供的服务治理的能力使用相对少一些,本文的…

vue将文本渲染html,vue2.0 之文本渲染-v-html、v-text

vue2.0 之文本渲染-v-html、v-text1、index.html代码vuedemo2、main.js代码import Vue from ‘vue‘import App from ‘./App‘Vue.config.productionTip false/* eslint-disable no-new */new Vue({el: ‘#app‘,render: h > h(App)})render: h > h(App)是ES6的语法&am…

如何成为真正的数字化企业,锐捷网络发布数字原力觉醒计划

编辑 | 宋慧 出品 | CSDN 云计算 什么样的企业可称为数字化企业? 因为疫情等各类不确定因素,数字化的浪潮正深刻改变着企业。所有企业都需考虑转型、创新、增长,这三个问题。深耕中国企业级市场多年的IT技术厂商锐捷网络,以“点线…

2021中国数字服务大会 | 阿里云混合云新一代运维演进与实践

简介:12月3日,2021中国数字服务大会顺利召开,大会以“数字服务、跨界融合、协同创新”为主题,邀请产学研界嘉宾,举办行业与学术论坛,共话数字服务的挑战和机遇。阿里云作为云厂商代表应邀参会,并…

冲压模板自动标注LISP_干货满满!超实用冲压模具资料,加薪必看!

一般的冲压模具都是由:上下托板、上下垫脚、上下模座:一般用A3、Q235等“软料”做成,起支撑整个模具、方便架模、落料等作用。上、下模板:上、下模板起固定刀口、入块、入子、顶料销等作用,外定位、内定位、浮升引导销…

安谋科技四周年献礼,提前完成五年规划目标

自2018年4月正式独立运营以来,安谋科技一直以服务中国的科技产业、建设中国本土的研发能力、赋能中国本土半导体生态为核心使命。值此公司成立四周年之际,安谋科技宣布已提前超额完成了合资公司落地深圳时设立的五年规划目标。 回顾四年来走过的历程&am…

开源微服务编排框架:Netflix Conductor

简介:本文主要介绍netflix conductor的基本概念和主要运行机制。 作者 | 夜阳 来源 | 阿里技术公众号 本文主要介绍netflix conductor的基本概念和主要运行机制。 一 简介 netflix conductor是基于JAVA语言编写的开源流程引擎,用于架构基于微服务的流…

直播回顾:如何对付臭名昭著的 IO 夯?诊断利器来了 | 龙蜥技术

简介:听到IO夯总是让人头疼,那有没有可以分析IO夯问题的利器? 编者按:sysAK(system analyse kit),是龙蜥社区(OpenAnolis)系统运维 SIG 下面的一个开源项目,…

cad致命错误如何处理_Golang 如何优雅地处理错误

- 后端早读课翻译计划 第二篇- 本文提供了一个优雅的处理 Golang 中错误的方法,解决了 Golang error 只有字符串信息的局限性,提供了上下文信息、错误类型判断的功能。尽管 go 具有一个简单的错误模型,但是乍一看,事情并没有那么容…