10月13日,2016杭州·云栖大会主论坛上,阿里云首席架构师唐洪以《飞天,互联网规模的操作系统》为题进行了主题演讲。在他看来,飞天,通过与数据密集型学科的紧密合作重新定义人们对计算的认知界线。
以下是演讲全文:
唐洪:各位尊敬的领导,各位尊敬的来宾,各位在互联网上观看大会的朋友们,大家中午好,很高兴今天有机会跟大家聊一聊飞天,大家也知道,从2009年开始,飞天的研发已经走过了7个年头。在这7年里,我们跟大家分享过飞天是什么,也曾经用不同的名字来描述飞天,它是一个超级计算机,它是一个大规模的分布式计算系统,它是一个操作系统,今天大会的主题是“飞天·进化”,其实这些名字背后也意味着我们对于“飞天”理解的进化。
我想从我今天演讲的标题开始,飞天:互联网规模的操作系统。我想这个名字也代表了我们对飞天的理解的又一次进化。
大家都知道,操作系统是用来管理硬件设备的,所以一个互联网规模的操作系统,它顾名思义就是要管理互联网规模的基础设施,那怎么样才叫做互联网规模的基础设施?它首先是指阿里巴巴遍布在全球的几十个数据中心,我们将数据中心以区域为单位组织起来,今天阿里巴巴的数据中心遍布在全球的几十个数据中心,我们把数据中心以region为单位组织起来。今天阿里巴巴的数据中心遍布了世界的15个region,在大陆有五个区域,在大陆之外我们已经上线和以及即将上线的有十个区域,在遍布世界各地的数据中心之间,我们有专线联系,这些专线就构成了阿里巴巴的骨干网,通过阿里巴巴骨干网我们可以在阿里巴巴的数据中心之间进行海量的数据传输和服务的数据传递。此外,我们的数据中心也和运营商之间有专线联系,这样就把阿里巴巴的数据中心和整个互联网联系在了一起,这张网也叫做阿里巴巴的传输网。
最后,我们还有遍布在世界各地的600多个POP节点,构成了阿里巴巴的边际网络,通过部署在阿里巴巴的边际网络的CDN服务,终端用户可以很便捷地访问部署在云上的服务,这就是互联网规模的基础设施。
我这里想强调的是,今天飞天管理的是这张图上画的基础设施,并且在这个世界上只有一份飞天在跑,而且我想说的是跟传统的操作系统不一样的是,传统的操作系统在升级硬件时,它是需要重启的,但我们在升级飞天的时候是不可以重启的,也就是说飞天具备在持续运行的时候就能够扩展其基础设施的能力,这也是和传统的操作系统不一样的地方。为了说明飞天是一个操作系统,我想最好的办法是把飞天和传统的PC操作系统作一个对比。
这张图上画的是PC操作系统的几个层次,首先是PC操作系统的内核,它负责管理硬件设备,在它之上拥有账号管理和权限控制,在这之上是系统调用层,这是操作系统为上层应用提供的公共服务接口,通常它是很少改变系统调用接口的,这也是操作系统为上层的应用保持兼容性的很重要的关键。再往上是输入/输出系统,它是操作和外界进行数据交换和信息同步的通道。
最后说一下应用商店,可能在十年前的教科书里边,应用商店还不是操作系统的一部分,但今天越来越多的主流操作系统都已经将应用商店变成了它的一个有机组成部分。
相对应的,我们可以看一下在飞天,每个层次也跟PC操作系统各个层次相对应,首先,对应操作系统的内核是飞天的内核层,飞天的内核是跑在每个数据中心里边的,负责把数据中心的服务器集群组成一台超级计算机。在内核层上面是飞天的云服务层,元服务的意思就是服务的服务,包括账号管理、认证授权、计量和结算,我想强调的是,飞天的账号体系是全球统一的,并且我还想强调的是飞天元服务层的数据是存在好多个不同的数据中心里边的,也就是说,当任何一个数据中心出现问题的时候,飞天还可以正常地运行。
对于传统PC操作系统的系统调用层是飞天的云服务层,飞天的云服务包含了各种云服务的WEB API,跟系统调用一样,飞天的WEB API也是不可以随意改变的。对应于PC操作系统的输出输入子系统是飞天的接入层,这里包括了数据传输、内容分发和混合云的网络接入等等服务。最后是云市场,云市场是飞天的应用商店。下面我想展开讲一下飞天的系统架构。
首先是内核层,飞天的内核层对应的是几个进行支持分布式系统开发的最基本的模块,包括分布式的协调服务、安全管理,日志采集以及监控报警等,我想强调一下,大家可以看到,安全管理在飞天内核的最底层,它是飞天最基本的能力。另外我想强调一下飞天的监控报警、诊断也是飞天最基本的能力,分布式系统的开发是软件开发里边最难的工程挑战,很有可能你在线上发生的故障是很难在测试环境里出现的,所以飞天底层为上层应用提供了非常详细的监控事件的收集,并且它可以回溯到问题发生的那一刻的现场帮助工程师诊断问题,在此之上,飞天还有两个最基本的服务,一个是盘古,一个是伏羲,盘古是飞天的存储管理,伏羲是飞天的资源调度。此外在边上还有一个很重要的服务,叫做天基。天基的意思叫做飞天的基础,它是飞天的自动化运维服务;盘古、伏羲和天基我待会儿会稍微讲一下。
接下来看一下飞天的云服务,飞天的WEBAPI包括60多款产品,首先是飞天的核心服务它包括了存储、计算、数据库和网络等,在这之上,飞天还提供了丰富的连接和编排服务,这些连接和编排服务将这些核心的服务很轻易地组合起来,能够很方便地在云上开发应用,最后飞天提供了数据智能和安全等方向的很多高级服务,因时间关系,我就不一一展开。
最后我想讲一下云市场,飞天在2011年推出第一个云产品的时候,我们同时推出了云市场,并且当时的云市场我们只是很单一地应用包装的方式,就是虚拟机镜像,今天我们的云市场除了虚拟机镜像之外,还支持容器镜像,还支持API服务以及资源编排的模板,这个就是飞天的架构。
下面我想讲一下飞天的核心服务和飞天的内核,首先是飞天的计算类服务,飞天推出的第一个云服务ECS,就是计算服务,今天飞天还推出了FunctionCompute(函数计算),ACS (容器服务),ECS(弹性计算)和MaxCompute (大规模计算)。
此外我们还支持了基于开源软件的计算类服务,如Hadoop MapReduce、Hive、Pig、Spark。我们之所以支持这些服务的原因是很多的开发者已经在这些计算框架上开发了应用,我们希望他们可以很方便地变迁到云上,其配置、升级也是非常头痛的,我们通过托管服务帮助开发者降低了使用这些服务的开销。
再讲一下存储,今天提供了EBS(块存储)、NAS(文件存储)、OSS(对象存储)、OSS-IA(低频存储)、OAS(归档存储)。
下面是数据库服务,基于OCS缓存服务,以及面向半结构数据的TableStore表格型存储,此外还提供了单机RDS数据库,还包括分布式的AnalyticDB、Oceanbase,还有混合型的数据库,同样我们对于主流开源的服务器产品进行了支持,包括Redis、MongoDB、HBase、Greenplum。所有这些数据库里面的产品支持了各种应用,各种数据存储的需求。
此外,我们还提供了丰富的网络产品,这一点包括VPC专有网络、SLB负载均衡、NAT网关、VPC互联,通过这些服务我们可以让云上的开发者能够构建非常复杂的分布式应用。
这些是飞天提供的核心服务。
接下来我想讲一下监控和跟踪,所有的分布式系统都会用到监控和跟踪,但飞天的监控和跟踪还有点不太一样,它是默认开启的,我们在7×24小时都会详细地采集系统的各种数据,并且为了能够抓住系统的细微的变化,我们的采集精度需要达到秒级,此外我们还支持全精度的用户的行为的跟踪,也就是说,我们要抓取到在系统服务一个用户请求的整个过程当中的所有事件,这里不单包括用户进程事件,也包括内核事件,不但要能够进行非常高频的系统事件的捕获,并且我们要在这个捕获的过程中需要对系统干扰达到最小,那我们是怎么做到的?我们做了非常多的优化,其中包括一些优化,我们要抠到指令级别,首先是基于共享内存的数据采集,我们能够支持多进程的并发无锁写入,并且在整个写入过程当中不需要任何的锁,不需要额外的另存拷贝,此外是分布式的事物的关联,我们需要为每个事件来留存其日志时间戳,一个时间戳的获得需要40纳秒,通过优化以后,达到13纳秒,通过事件生成随机的标识,如果使用系统自带的随机函数生成的话,每个随机标识需要16Nm,通过我们优化之后可以达到4纳秒,通过所有的优化我们今天可以支持在每台技术上进行渺当中的手机,并且在收集过的过程当中,对机器的影响微不足道。
这张图像是整个生命周期。当我们这个服务器需要维护的时候,或者淘汰的时候,我们需要将应用从这个服务器上迁移掉,最后下架,但将这个过程复制到上万台规模时是非常有挑战的,讲三个,一个是幽灵节点,在这个系统里在任何时候都有节点是没有办法被访问到的,这个时候的运维动作无法进行下去,当这些节点连到节点时,它是在不极致的状态,如果我们不即使修复的话,那就会导致非常严重的问题,这个现象就要幽灵节点。
第二个挑战是灰度发布。在我们的系统里所有的软件都是以灰度的形式发布的,一开始只是升级到一小部分机器,只有当它发现没有问题的时候,再去扩大到更大的范围,这使得整个的运维流程更加复杂。
第三个挑战是线上调试,在系统里通常会有一些情况发生了紧急问题,需要在线上进行紧急的修复,采用了热补丁的方式,操作不当会被自动化的运维系统覆盖掉,导致运维系统白修了。
在天基看来,在系统里每一台机器都无时无刻地处在部署、升级、迁移以及各个状态的转换中,所以它在整个运行中精准地去控制每个进程,每一个组件的状态,从而达到了控制每个系统的状态。
这个小圈代表了进程级别状态的变化,这个大圈就代表了整个机器级别进程的状态的变化。
天基采用了一个面向恢复的计算模型,怎么理解这件事情?在每台天基管理的机器上会定期向天基发送这台节点的状态,这是这个系统当前的状态。此外天基还维护一个整个系统预期的状态。所有的运维指令发送到天基并没有被马上执行,而是被用来更新这个预期的状态。它会定期的比较它的预期状态和系统的当前的状态,能够根据其差别来制定出详细的执行计划并下发到天基的AGENT,通过这样一个过程迭代,使得整个系统的状态逐步逼近到系统的预期的状态。
接下来我想讲一下盘古,盘古是飞天的分布式管理,盘古提供了统一的存储管理,它能够支持各种离线、在线的运用,我们可以在秒级时间里进行切换,今天盘古可以支持单集群10000台的规模。
对于盘古来说,对它最重要的事情是确保其数据不丢失,在盘古我们默认使用了三副本的拷贝,并且分布在不同的机架下面,可以达到10个A的数据可靠性。并且我们还可以支持把副本分布在不同的数据中心,达到更高的可靠性。此外盘古还支持基于数据冗余,可以把数据的冗余的开销从三倍降低到1.375倍。
第三点,我们发现整个数据链路上的各种问题都会导致数据的损毁,如网卡上会发生TCP的网络包的校验错误,所以飞天提供了端到端的数据校验,确保数据即使发生这样的问题,也不会损毁。
最后盘古还提供了独创的并发冗余技术,使得当系统发生故障时能够很快地恢复。
这里可以看到,当一个磁盘发生故障时,盘古是在所有剩余的节点之间进行故障的冗余恢复,使得整个故障恢复的代价跟时间的大小成反比的;集群越大,我们可以使整个冗余的恢复速度越快,可以在万台规模下不到的分钟完成8TB数据的冗余恢复,并且盘古在整个过程中精准的控制整个的并发以及网络带宽使得前台的应用完全没有感知。
最后我想讲一下伏羲,伏羲是负责资源调度,资源调度是一个很简单的问题,可以将资源容器进行匹配,这样很简单的事情在实际应用场景是非常复杂的,首先是规模,在飞天,上面有上千个并发的分发式程序,每秒钟盘古资源调度需要做上千次的资源决策。这里包括了CPU、内存,甚至是虚拟资源的请求。此外,为了保证公平性,伏羲还进行额度控制。
第四点,为了让系统没有热点,我们要尽量地将资源的请求分布到所有的节点上去,最后支持复杂的调度约束,我们希望将进程调度到它所访问那块数据上面。
伏羲做了大量工作来解决这些问题,这里有讲两点:第一个技术上的数量是两级调度,在这张图上可以看到,伏羲负责整个集群资源的管理,每个分布式的应用有一个APPMASTER,它直接向伏羲MASTER进行批量的资源申请,再拿到资源之后由它进行WORK进程的调度。
第二个优化是增量调度,每个APPMASTER会将其资源请求一开始就发送给伏羲MASTER,伏羲MASTER是需要分时分批来的,所以是一次请求,如果这两个设计,我们可以单位单集群1万台,并发10万的进程,所有实现秒级响应,特别想指出的是,在100T的排序中我们用377秒完成了排序工作,比之前的世界记录跨了3倍多。
最后,伏羲的效率,对于一个调度系统来说,规模是其次的。最重要的是调度的效率,大家知道,在一个进程执行过程当中,它的峰值的资源使用和平均的资源使用相差很大,我们按照峰值资源来利用资源的话,会让整个集群的资源利用率不是很好。所以,伏羲采用了两个优化来解决这个问题。
第一个策略是弹性额度,弹性额度里第一个概念是额度超售,这意味着对所有的额度加起来可以超过百分之百的,在这里可以看到有绿、红、蓝三个租户的三个额度加起来是130%,但因为我刚才所说的原因,实际的资源使用只到了70%。弹性额度里第二个概念是额度拉伸,当系统比较空闲的时候,我们可以允许单个租户的资源的使用超过其额度,在这里边我们可以看到红色的租户的使用量超过50%,超过了额定的40%。在第三个概念是额度收缩,也就是说当系统的资源比较紧张的时候,在这里边我看到,整个系统的资源请求超过了系统的容量,130%,所以,我们需要成比例地将所有的租户的额度进行收缩在这里可以看到,将所有的租户额度收缩到三分之二,从而使得所有的需求能够被整个系统所满足。
还有是离线、在线的混合调度,这个大家听得比较多了,本质上很简单,我们会需要将离线应用和在线应用放在同一个集群上,当在线应用比较空闲时,将资源进行分配调度离线应用,当在线的应用的负载比较高的时候,我们可以将它的从离线应用抢占过来,这样既可以保证整个系统资源的利用率,也可以确保在线服务的质量,通过这两个策略,我们可以将集群中日常资源的使用率,从5%提升至54%,将集群峰值的利用率从22%提升至64%。
最后我想回顾一下,我今天想讲的内容。首先,飞天是规模。其次,飞天是性能。第三,飞天是效率。第四,飞天是高可靠。第五,飞天是高可用。第六,飞天是开放。
我想,规模、性能、效率、高可靠、高可用、开放,这就是今天我们所理解的飞天,一个互联网规模的操作系统。谢谢大家!