疫情期间,腾讯会议作为一款非常便捷的远程协作工具,成为国内众多企业日常会议沟通交流的主要平台。殊不知,这款产品从去年12月26日正式推出才刚刚2个月,如何在这么短的时间内,有效撑起国内数以亿计的用户访问量,从而保证系统的稳定运行。
如果需要交付100万核的计算资源,我们需要做什么?准备资源,然后按用户需求进行交付。如果在前面加一个定语“快速”呢?我们可以加班加点完成。但是如果要实现8天内完成100万核的资源交付,换算下来,每天需要交付12.5万核。这就有点苛刻了,因为在云计算的历史上,还从来没有出现过类似的案例。
那么,腾讯会议是如何做到的呢?
解决思路
首先,先看一下如此快速地交付这些资源需要做哪些事情和会遇到哪些问题。
实际上,借助于当前成熟的虚拟化技术,我们可以基于已经制作好的镜像系统文件,快速地部署一套用于提供服务的生产环境,所以,只需要准备好足够的计算资源就能够实现服务的无限扩容,而这个过程大概需要以下四步。
准备资源,投放物理机:作为云计算服务提供商,资源首先是第一位的,所以第一步就是准备用于提供服务的物理机。这100万核心的资源,相当于约12000台物理机,为应对资源不足的问题,需要快速上架全部这些物理机,同时,需要保证每台物理机经过验证,并且需要部署正确版本的后台组件。
资源注册与分配:有了物理机资源,下一步就需要到初始化好的物理机资源投放到现网环境中,确保每一台物理机资源都在CVM后台服务中注册。腾讯云操作系统VStation需要维护数10万级左右的物理机资源,这无疑对资源调度提出了极大的挑战。因此,需要快速将这些需求的计算资源找到对应的物理机承载。
资源创建与交付:当后台调度系统选择好承载计算能力的物理机之后,下一步就要到物理机上创建虚拟机资源。这一步看似简单但需要做的事情却不少,如生成用户控制数据,与存储、网络系统交互,生成对应的虚拟机配置,启动虚拟机。
虚拟机初始化:虚拟机成功创建之后,就已经可以交付给用户使用了。不过可能还需要进行配置,如拉取配置、加入服务集群、启动服务等。
完整历程解密
首先上一张腾讯云操作系统VStation框架图,腾讯云操作系统VStation承担资源调度、请求排队,已经对大批量,高并发创建请求做了充分的优化。具体来说:
1. API 部分接入用户请求,管理用户角色、CVM 机型、用户配额等;
2. 云操作系统VStation,承担资源调度、请求排队,目前虚拟机每分钟吞吐可达到5000台;
3. Host组件上安装用于生产和配置CVM实例的各种辅助组件。

以下将从资源准备、注册与分配、创建与交付、虚拟机初始化四大部分详细介绍下其中的具体过程。
1、准备资源,投放物理机
腾讯云基于定制化腾讯TLinux 自研的虚拟化hypervisor系统,实现批量自动部署、自动投放,并且在投放到现网之前进行自动验证,保证软硬件不存在隐患。腾讯云Host组件管控系统,方便管理腾讯云hypervisor上的各种代理组件,易于发布,方便运维。

· 安装系统:运维平台从资产管理平台CMDB拉取对应Host相关机型信息,寻找与该机型对应的Tlinux操作系统控制BMC配置从pxe启动,从pxe服务器拉取系统镜像安装系统。
· 系统初始化:安装完系统后需要配置各种系统参数,调优。
· 部署Host使用的组件:每种不同机型的CVM使用的Host 会使用不同的后台Agent,以及相关配置。通过Host组件管控系统Host使用的插件进行统一管理,下发。
· 导入集群:已经初始化好的Host,需要导入到VStation 集群才能售卖和生产CVM。

Host组件管控系统用于下发Host组件、灰度版本、控制、支持并发下载、灰度发布,同时上报Host上各个组件的信息、组件健康管理、自动拉起组件、异常告警等。
2、资源注册与分配
作为整个系统的核心,腾讯云操作系统VStation需要管理10万级的物理机资源,近千万级的核数,所以需要实现快速和稳定的调度系统。VStation服务类似Google Borg/Omega 使用的分布式调度架构,来对计算资源进行调度。

其中,水平扩展,调度器支持横向扩容,每个调度器拥有几乎全部的集群信息,方便掌握全局资源;采取增量同步、定时更新、局部缓存的方式,尽可能多地掌握全局视图,并且维持集群状态信息的准确性。
调度决策方面,将可能过滤掉越多物理机的基础条件放在调度器的靠前位置,过滤掉无法满足基本条件的物理机列表,减少调度过程中物理机集合在不同调度器之间的传递;同时,根据多个维度,如物理机资源使用率,剩余资源等,对满足装箱条件的物理机进行排序,尽可能优先使用优质Host资源,合理调配。此外,避免多个调度器在并发时选中相近的物理机,对经过排序后的物理机进行随机调整,减少大并发时造成的冲突。
3、资源创建与交付
当解决资源调度问题后,需要在选中的物理机上进行虚拟机资源的创建,其中有一些耗时的硬性阶段无法解决,VStation对此结合资源创建过程的的特点,也做了令人满意的优化,把单台虚拟机创建时间控制在3-5秒左右。
前面提到,资源创建需要与诸如用户控制数据,网络服务,存储服务,镜像服务,密钥,安全组服务等进行交互,完成用户与用户所创建的虚拟机资源的映射。VStation平台设计之初就考虑到针对高并发,批量创建的场景,对周边系统的交互实现了并行化通信。同时,为支持高并发,提高服务的吞吐量,每种与其他服务交互的工作进程通过高可用消息队列通信,都是无状态和可扩容的。真正实现高可用,高并发,自动容灾。以下是VStation 内部系统的核心架构。

VStation 通过高可用的消息队列,把控制数据与各个与周边系统交互的工作进程间通信,同时对创建过程中的关键任务按照依赖关系实现并行化,最大限度的压缩创建总耗时。针对高并发请求,为减少对系统自身的影响,系统具备以下特性:
3.1 控制信息载荷自动压缩
控制消息携带了CVM实例的各种控制信息,计算,存储,网络以及各种元数据信息,随着系统功能增加,控制层面数据也有所增长,控制信息载荷增大会对消息在各个工作模块中。使用压缩算法再投递消息前进行压缩并在接受消息后解压缩,能够大大降低消息占用消息总线,提高消息吞吐率。目前VStation 使用开源LZ4 - Extremely fast compression压缩和解压缩算法,可达到压缩速率在780 MB/s,解压缩速率在4970 MB/s,压缩率在2倍左右。
3.2 负载平衡
分布式系统中会使用多个实例以增加系统请求响应吞吐率,控制模块负载平衡可以保证请求可以均匀地被各个worker处理,负载平衡需要后台处理请求的worker均匀分配到不同处理实例上,降低等待队伍长度,并发执行任务。同时需要将虚拟机实例尽量均匀地分配在不同Host。
将并发请求尽可能均匀地分在在不同物理机,有利于加快办法创建速度。生产虚拟机较为耗时的任务有创建虚拟就磁盘,下载虚拟机镜像,申请网卡,配置网络等。如果多台虚拟机串行地在同一台物理机上创建,必然成为系统瓶颈,创建耗时延长。VStation Scheduler 在装箱时,每个Scheduler实例有近乎全局的资源视图,对同一批次的创建任务,可以支持虚拟机并发装箱时保证虚拟机尽量不落在同一台物理机。
3.3 流控系统
当请求数超过系统承载能力时,如果不加控制,会对周边系统造成危害,造成系统过载,内部组件异常(如DB慢查询、不响应、消息队列丢消息),破坏性较大,严重时会造成服务不响应,影响用户正常使用,甚至用户数据不一致。VStation增加排队机制,降级服务,而不是返回系统内部错误。提升用户体验。流控系统由以下几个方面组成:
· 关键请求频次控制:在API请求频次上对用户做限制,防止恶意用户频发请求系统,如恶意购买,刷单等。
· 用户配额限制:限制用户随意申请资源,尤其是按量资源,限制配额。
· 后台请求排队与流速控制:任何系统都有能承载的处理容量,当VStation当前正在处理的请求超过一定阈值时,对新加入的请求不做拒绝处理,而是放入等待队列中待现有正在处理的任务完成后继续执行。

3.4 任务编排优化
由于一个完整的创建任务涉及到的各种子任务较多,单纯串行执行虽然逻辑清楚且维护简单,但不利于充分发挥系统能力,高并发创建场景中耗时较长。我们通过分析虚拟机实例创建过程中的各种依赖关系,将不耦合的任务并行执行,把简单的单项图转换成有向无环图(DAG),进一步提升任务的并行度。

调整后,单台CVM实例创建任务可以控制5秒以内。
4、虚拟机初始化
提到云主机的初始化,CVM 支持使用云原生的cloud-init服务,支持云计算主机镜像初始化协议,用户通过传入自定义的脚本程序,实现云主机创建后自动执行预定义配置,同时,腾讯云提供实例metadata 服务。用户在自定义脚本程序中可以访问实例metadata服务获取与实例有关的信息,如IP地址,实例名称等,来实现每个实例的特殊化配置。

CVM 实例相关元数据信息包括镜像,用户数据,vendor数据,元数据几部分组成。其中镜像信息和用户数据信息可以用户可以自行配置,vendor数据和实例元数据(如IP信息,地域信息等)可以通过内网访问访问腾讯云元数据服务获取用户配置实例的相关信息,从而实现快速自动化配置CVM实例。
总结
受疫情影响,在线办公的需求急速增加,腾讯会议作为一款非常受欢迎的协同办公产品需要在短时间内快速扩容服务,来支撑不断攀升的用户数据。
经此一役,腾讯云CVM后台服务经过不断打磨,有效地支持了高并发请求,通过优化调度算法,优化内部架构,降低创建耗时,完美经受住了此次考验,对于未来,我们有信心迎接更艰巨的挑战。