2.1.2 核心技术
阿里云IaaS架构如图2-3所示。
图2-3 阿里云IaaS架构
传统意义上的IaaS层一般由IDC基础设施、虚拟化、配套存储与网络软件基础设施、云管平台组成,阿里云的IaaS实现将管理功能纳入飞天分布式系统层,虚拟化和网络则被划分到单独层。下面主要介绍IDC基础设施、虚拟化,配套存储与网络软件基础设施相关技术。
1.IDC基础设施
混合云IDC(Internet Data Center,互联网数据中心)标准化建设方案可以参考GB 50174—2008《电子信息系统机房设计规范》A级或TIA-942《数据中心电信基础设施标准》的T3+标准,混合云IDC机房应满足安全可靠、节能环保、扩展灵活等条件,提供不间断的服务,可用性在99.99%以上。IDC机房建设主要内容可以概括成“风”(包间气流)、“火”(消防)、“水”(水冷管道)、“电”(供配电)、“通信网”(用于数据通信的千兆或万兆以太网)、“监控网”(弱电网监控),要求包括:机房基础条件要求、供电设施要求、制冷设施要求、消防设施要求、机柜及桥架要求、网络设施要求、其他设施要求等。
IDC终端机柜层面布线有两种方式:ToR(Top of Rack)和EoR(End of Rack),混合云IDC布线更多采用ToR方式。一般情况下10~20个机柜背靠背放置一排组成一对机柜组,再加上一组网络交换设备机柜,组成一个POD(Point of Delivery)。ToR布线方式简化了服务器机柜与网络机柜间的布线,有利于在高密度服务器布置场景下提升空间利用率,在分布式系统和大数据业务高速发展的今天,显然ToR是更适合混合云业务场景的IDC终端机柜布线方式。
IDC基础设施最重要的部分是基础网络。在混合云场景下,IDC基础网络架构一般采用三层树状结构(核心—汇聚—接入),在基础网络交付实施中主要考虑以下关键点:服务器接入规模、支持POD数量、单POD带宽、单POD支持服务器数量、单POD接入交换机数量、虚拟机网关ARP规格、虚拟机迁移域等。为满足高可用要求,在规划混合云IDC基础网络时应该根据业务场景、网络架构和维护复杂度明确网络关键节点和链路冗余,以及网络接入层和网络汇聚层高可用部署方案。
2.虚拟化
阿里云IaaS使用KVM(Kernel Virtual Machine)虚拟化技术实现IDC物理资源(CPU、内存、网络、存储)的池化与抽象,并提供统一管控入口,实现弹性和可自定义的以ECS虚拟机为中心的计算资源分配和管理服务。KVM虚拟化通过HVM(Hardware Virtual Machine)在宿主机硬件资源之上提供定制规格的虚拟机,并通过镜像和快照技术实现在虚拟机中运行Guest OS,比如RedHat、CentOS、Ubuntu、Windows等系统,用户的具体业务应用跑在虚拟机的Guest OS之上,如图2-4所示。
图2-4 阿里云IaaS KVM虚拟化平台
阿里云通过KVM虚拟化平台和飞天云管理系统实现以下功能:
● 通过提供虚拟机粒度的隔离部署环境及集群规模的动态负载均衡,提高硬件资源利用率,降低采购成本。
● 对CPU、内存、存储、网络等资源做了更细粒度的灵活划分,提高资源利用率。
● 通过提供统一的资源管理、调度、配置,降低用户的部署、维护成本。
● 快速交付,快速响应用户的新增机器需求。
● 提供虚拟CPU、内存、磁盘、网卡热插拔功能,可以快速响应用户已部署业务对计算、网络、存储服务能力的扩展需求。
● 基于共享存储,提供虚拟机HA(High Availability,高可用)能力,一旦虚拟机所在的物理机出现故障,就可以在其他物理机上秒级恢复上面的虚拟机。
● 提供虚拟机热迁移功能,可以提高用户业务的可服务性,降低用户业务的停机时间。例如,在进行硬件维护时,并不会中断该服务器上的业务,可以把上面的虚拟机迁移到另一台服务器上。结合阿里云飞天分布式存储系统实现块共享存储机制,还可以大大缩短迁移的总时间。如果使用了Overlay网络,则可以在IDC内部,甚至在IDC之间迁移虚拟机。
● 提供虚拟机镜像机制,方便部署到镜像中的业务或者业务组合,一次部署到处运行,也可以提供公共的基础镜像。
● 提供对业务透明的虚拟存储备份功能,可以大大提高用户数据的可靠性。
● 提供更加灵活的运维手段,提高运维自动化水平。
● 利用Overlay网络与物理网络解耦,在进行业务网络规划时可以不必考虑物理网络组网,尤其是网络拓扑的限制。
KVM使用的virtio驱动协议类似于Xen上使用的PV(Paravirtualization)驱动,都属于半虚拟化I/O。半虚拟化I/O是相对于全虚拟化I/O而言的,比如QEMU模拟的E1000网卡、IDE磁盘就属于全虚拟化I/O,其缺点是性能差,通信效率低,基本原因在于全虚拟化设备频繁访问设备寄存器,导致过多的虚拟机退出,而虚拟机退出会消耗很多时间,代价很高;双向通知没有利用生产者—消费者模型中常用的按需通知,导致太多虚拟机退出和中断注入;全虚拟化设备本身限制可能对一些新特性缺乏支持,比如网卡的卸载(offloading)特性,一些老式网卡就不支持。
半虚拟化I/O就是专门为虚拟化而生的,在提高数据传输效率、降低I/O开销、新特性(比如网卡的某些高级卸载特性,有些新特性也可能是物理世界所没有的)支持、稳定性方面都做了增强。
virtio涉及前端部分(guest driver)和后端部分(QEMU),如图2-5所示。
图2-5 virtio技术架构
阿里云标准系统镜像是能够与Hypervisor协同工作的半虚拟化技术模式。本质上,半虚拟化弱化了对虚拟机特殊指令的被动截获需求,将其转化为用户操作系统的主动通知。但是,半虚拟化需要修改用户操作系统的源码来实现主动通知。
下面通过分析virtio网络驱动的前后端实现来说明virtio通信原理,其他virtio设备原理类似。
(1)虚拟化I/O驱动virtio
从总体上看,virtio组成可以分为四层(如图2-6所示),包括前端Guest系统中的各种驱动程序模块,如virtio-blk、virtio-net等;后端Hypervisor(实现在QEMU上)中的处理程序模块virtio后端;中间用于前后端通信的virtio层和virtio环层——virtio这一层实现的是虚拟队列接口,是前后端通信的桥梁;virtio环则实现了两个环形缓冲区,分别用于保存前端驱动程序和后端处理程序的执行信息。严格来说,virtio和virtio环可以被看成一层,virtio层属于控制层,负责前后端之间的通知机制和控制流程;virtio环层负责具体数据流转发。
图2-6 virtio组成
由于不同前端Guest设备(如块设备、网络设备、PCI设备、balloon驱动等)的工作逻辑大同小异,单独为每个设备定义一套接口没有必要,而且还要考虑跨平台的兼容性问题。另外,不同后端Hypervisor(如KVM、Xen等)的实现方式也有很大差异,因此就需要一套通用框架和标准接口(协议)来完成两者之间的交互过程。virtio就是这样一套标准,利用它可以解决上述不通用的问题。
①vHost
vHost是virtio的一种后端实现方案,如图2-7所示。virtio是一种半虚拟化的实现方案,需要虚拟机端和宿主机端都提供驱动才能完成通信。通常,virtio宿主机端的驱动在用户空间的QEMU中实现,而vHost在内核中实现,是内核的一个模块(vHost_net.ko)。
图2-7 vHost实现
在virtio的机制中,Guest与用户空间的Hypervisor通信,会造成多次的数据拷贝和CPU特权级的上下文切换。Guest发包给外部网络时,首先需要切换到Host Kernel,Host Kernel再切换到QEMU来处理Guest的请求,Hypervisor在通过系统调用将数据包发送到外部网络后,会切换回Host Kernel,然后再切换回Guest。这样长的路径无疑会带来性能上的损失。
vHost与virtio前端的通信主要采用eventfd(一种事件驱动的机制)来实现,Guest通知vHost这一事件要借助KVM.ko模块来完成。在vHost初始化期间,会启动一个工作线程来监听eventfd,一旦Guest发出对vHost的kick事件,KVM.ko就会触发ioeventfd通知vHost,vHost通过virtqueue的avail ring获取数据,并将其设置为used ring。同样,从vHost工作线程到Guest的通信,也采用相同的机制,只不过发出的是一个回调事件,KVM.ko触发irqfd通知Guest。
②vhost-user
在vHost实现方案中,由于vHost在内核中实现,Guest与vHost的通信方式,相较于原生的virtio方式,在性能上有了一定程度的提高,因为从Guest到KVM.ko的交互只有一次用户态的切换及数据拷贝。这种方式相对于原有的QEMU virtio性能有较大的提高,但是vHost转发流程有内核线程的参与,因此整个转发流程伴随着中断、软中断及内核线程的切换,效率仍然较低。
为了避免这种情况,只能将vHost从内核态移到用户态,即vhost-user。vhost-user是DPDK中的一个库。vhost-user和vHost的实现原理是一样的,都是采用virtio环共享内存,采用eventfd机制完成事件通知的。不同于vHost在内核中实现,vhost-user在用户空间中实现,用户空间中两个进程之间的通信采用共享内存的方式,如图2-8所示。
图2-8 vhost-user实现
SR-IOV host-user基于C/S模式,是采用UNIX域套接字(UNIX Domain Socket)方式来完成进程间的事件通知和数据交互的,这种方式相比于vHost中采用ioctl的方式大大简化了。
vhost-user基于virtio环这套通用的共享内存通信方案,只要客户端和服务器端按照virtio环提供的接口实现所需功能即可。常见的实现方式是在Guest操作系统中实现客户端,一般集成在virtio驱动上;在QEMU中实现服务器端,或者在OVS、Snabbswitch虚拟交换机等其他数据平面中实现。
(2)SR-IOV
SR-IOV(Single Root I/O Virtualization)允许在虚拟机之间高效共享PCIe(Peripheral Component Interconnect eXpress,快速外设组件互连)设备,在硬件中实现,可允许创建的新设备与虚拟机直接连接,获得能够与本机性能媲美的I/O性能。使用SR-IOV技术,单个I/O资源可被许多虚拟机共享。共享的设备将提供专用的资源,并且还可使用共享的通用资源。这样,每台虚拟机都可访问唯一的资源。因此,启用了SR-IOV并且具有适当的硬件和操作系统支持的PCIe设备(如以太网端口)可以显示为多个单独的物理设备,每个设备都具有自己的PCIe配置空间。PCIe设备的SR-IOV实现如图2-9所示。
图2-9 PCIe设备的SR-IOV实现
每个SR-IOV设备都可有一个物理功能,并且每个物理功能最多可有64000个与其关联的虚拟功能。
①物理功能
物理功能(Physical Function,PF)用于支持SR-IOV功能的PCI功能。物理功能包含SR-IOV功能结构,用于管理SR-IOV功能。物理功能是全功能的PCIe功能,可以像其他任何PCIe设备一样发现、管理和处理。物理功能拥有完备配置的资源,可以用于配置或控制PCIe设备。
②虚拟功能
与物理功能关联,虚拟功能(Virtual Function,VF)是一种轻量级PCIe功能,可以与物理功能以及与同一物理功能关联的其他虚拟功能共享一个或多个物理资源。虚拟功能仅被允许拥有用于其自身行为的配置资源。
3.配套存储与网络软件基础设施
阿里云IaaS网络主要分为后端网卡I/O相关虚拟化(virtio-net)和专有网络VPC两部分。上面介绍了virito框架,对virtio-net来说,主要是增加了在virito-pci之上的二层数据包的传递,前后端之间解包、组包。对virtio-net来说,后端通过vhost-net方式实现,vhost-net的实现主要包含两部分:vhost,这部分实现了公用的vHost机制(vhost-scsi也会使用vHost机制);vhost_net,这部分是与网络相关的处理。vhost_net甚至可以与SR-IOV结合,VF驱动alloc的rx buffer不使用标准接口,而是直接向vhost_net申请,vhost_net从vring中获取rx buffer,地址转换后交给VF驱动。
总体来说,阿里云专有网络VPC包含vSwitch、Overlay、vRouter、Controller几部分。Overlay网络将从虚拟机出来的L2包放在一个虚拟隧道中进行传输,在隧道的两端看起来像是同一个L2,从而使虚拟网络和物理网络解耦,组成逻辑大二层网络。Overlay和Underlay是两个对立的概念,Underlay网络是承载Overlay网络的物理网络,Overlay网络是通过隧道技术在物理网络之上建立的虚拟网络。Overlay网络一般通过隧道协议来实现,比如VXLAN、GRE、STT,其中VXLAN是阿里云用于构建Overlay网络的协议。阿里云Overlay网络在以下两个地方实现:
● 在Hypervisor所在的物理机上通过vSwitch软件实现。
● 在专属网络交换设备网关上实现。
通过后端网卡I/O相关虚拟化和专有网络VPC,阿里云IaaS构建了一个隔离的网络环境,并可以自定义IP地址范围、网段、路由表和网关等。此外,也可以通过专线VPN/GRE等连接方式实现云上VPC与传统IDC的互联,构建混合云业务。有关阿里云IaaS网络的细节内容,将在第5章中介绍。
阿里云IaaS存储实现主要分为后端存储I/O虚拟化、镜像/镜像接口和存储后端几部分。后端存储I/O虚拟化利用virtio-blk实现块存储I/O通道,ECS虚拟机通过virtio-blk和ring的方式将I/O请求传递到宿主机的块存储数据控制平面,最后通过EBS服务传递到后端分布式存储系统。阿里云IaaS存储后端使用自研的飞天分布式存储系统为IaaS提供业务所需的块共享存储、对象存储和文件存储等服务。“盘古”是飞天中的分布式文件系统组件,盘古将并不高可靠的PC服务器中的磁盘连接成一个整体,向外提供安全、稳定、易用的文件存储能力。此外,盘古还提供了如下核心价值。
(1)数据安全
盘古通过数据多副本技术来保证数据安全,并不要求磁盘本身的高可用性。因此,盘古可以被架设在PC服务器和SATA盘上,但并不要求磁盘本身通过RAID来保证数据安全。同时,因为盘古将数据打散到整个集群,在发生故障时能更快地做出数据的副本,从而保证数据安全。盘古默认有三个数据副本,能够保证数据具有极高的安全性。
(2)服务高可用
存储服务本身是任何IT系统中最基本的服务之一,必须具有高可用性。盘古对外承诺两个层次的高可用性:数据的高可用性,单机、单机柜损坏时数据仍然能够读/写;服务的高可用性,盘古文件系统能够不受大部分硬件故障的影响而继续提供服务,这里主要指盘古Master的高可用性。
盘古通过多Master机制来保证Master的可用性。盘古的多Master机制是主从机制,默认三台Master中有一台为Primary Master,两台为Secondary Master(热备),主从之间通过Paxos算法来保证内存处于一致的状态。使用Paxos算法能够在两台Master达成一致时就返回,在保证服务高可用的同时降低了服务的延迟。
关于阿里云分布式存储系统,我们将在后面的章节中详细介绍其架构和实现方式。