前言:红包是最近兴起的全民参与的活动,2017年新春红包在参与人数和业务峰值上都到达了历史新高,其中红包除夕开奖峰值达到90W/s。近日,阿里云系统和块存储负责人、资深专家马涛从高性能本地存储架构设计、高性能本地存储要点分享、高性能本地存储性能数据等方面分享了高性能本地存储的实战经验。
以下内容根据现场分享和幻灯片整理而成。
红包业务特点
支付宝红包的大致业务架构包括单元化部署、统一接入、网关、DAO、数据库以及在线离线数据处理,整体流程很长。其中数据库在整理的交易链路中起到承上启下的作用。在红包业务中,数据库具有三大特点:
(1)峰值压力大。除夕夜开奖峰值达到90W/s,但这仅仅是从业务层面考虑,由于业务对数据库不仅仅是一次事务的压力,所以开奖峰值时数据库面临的压力可达百万之多。
(2)延迟要求苛刻。数据库单位时间内能承受的事务是有严格要求的,数据库延迟降低后,会大幅降低对数据库数目的需求,进而降低所需物理机配置,对整体的业务压力也会大幅度降低。
(3)自带容灾。对于大型互联网公司,他们的数据库业务实际上是有非常完善的容灾机制,数据库具备主从复制;业务层也会有本身的容灾机制。从存储来看,上层的容灾业务做得很全面。
针对红包业务,数据库的需求可以概括为两点:一是延迟要非常低,延迟要低于100us;二是IOPS一定要高,需要达到20W以上。
现有块存储产品
目前阿里提供了三种不同的块存储产品,分别是SSD云盘、高效云盘和普通云盘。三者详细的对比如上图所示,可以看到:三种块存储的产品都具有高可靠的优点,它们的数据可靠性都达到了99.9999999%;它们的缺点也非常明显,IOPS和延迟不达标,IOPS最高的SSD云盘也只有20000,延迟最低的SSD云盘也有500us之久,距离20w IOPS和100us延迟的要求还存在很大的差距,这就需要设计一款新的存储产品来满足双十一以及红包业务的要求。
因此,高性能本地存储应运而生。
高性能本地存储
高性能本地存储的设计目标是为了满足高性能数据库的要求,设计要点一是超高的IOPS;另一点是超低延迟。
通用的云本地存储常规架构如上图所示。以MySQL数据库为例,它通过POSIX API与云主机内核交互,云主机内核包括一个标准文件系统和标准的块设备接口;云主机内核下面是云物理机内核,它自上而下由标准文件系统、标准块设备接口、硬件驱动和硬件组成。当数据库发起IO访问时,要经过7个模块才能到达硬件;请求完成后,再经过7个模块才能返回给应用层,路径相当之长。云主机内核和云物理机内核中都包括标准文件系统和块设备层,也就是说同样的模块可能在云主机内跑了一遍,还需要在云物理机上再运行一遍,功能上重叠,实现方式上也基本类似;重叠的模块导致请求访问时的路径很长,对于业务和数据库性能造成的的直观影响是延迟高、性能差。
因此,采用通用的云本地存储常规架构是无法解决红包业务的需求,也不能设计出高性能的存储产品。那该如何将云本地存储的性能发挥到极致呢?我们的切入点是高性能存储架构。
上图是高性能存储架构,图中左侧是标准物理机情况下存储性能达到极致的框架:它的层次比较少,数据库经过POSIX API直接就到标准文件系统、块设备层、硬件驱动、硬件,请求所经过的模块比上文提到的云本地存储常规架构少2-3个,性能也相对有所提升。
那么如何在云主机的环境下搭建一个类似物理机的环境呢?首先云主机的必要模块是必须保留的,应该尽可能精简云物理机内核中的模块,进而达到性能的最佳值。如上图右侧所示,首先必须保留云主机内的标准文件系统和块设备层,因为它们和业务数据库是息息相关的,标准文件系统提供了标准的Open、Creat、Write之类的接口,如果省去该模块,业务是无法适配这种修改的。
对用户而言,云物理机内所有的修改都是透明的,因此在云物理机上只保留硬件驱动,从而达到最佳性能。
高性能本地存储关键组件
在云主机内,标准文件系统是不能变化的,因为它是存储与数据库、业务交互的地方。因此,想要进行性能优化,只能考虑在块设备层、硬件驱动、硬件三个模块入手加速本地存储的性能。
经过一系列的调研与研发测试,最终在块设备层使用了标准virtio blk驱动;硬件驱动使用了SPDK工具集;硬件使用了NVMe SSD。下面对这三个模块进行详细的解读与分析。
VirTio-blk
利用Virtio blk可以实现云主机和云物理机之间的高性能数据交互。Virtio提供了半虚拟化的接口,所谓半虚拟化就是在虚拟机和物理机之间通过某种方式(修改了虚拟机某些接口),从而使得虚拟机和物理机之间实现高速传输,性能比传统的全虚拟化有所提高。
Virtio blk是标准块设备接口,通过块设备接口可以对块设备进行格式化、分区、创建文件系统等标准操作,对用户完全透明,数据库无需任何更改。Virtio blk另一个优点是采用了Virtio协议,通过共享环交换数据。在上图中,蓝色部分是虚拟机,红色部分是物理机。虚拟机通过Virtio Front End将数据通过Virtio Ring传递到后端的Virtio Back End;Virtio Back End将这些数据处理后再回传给Virtio Front End,完成了一次数据的交互。
SPDK
除了Virtio blk之外,SPDK是另一个重要的组件。SPDK全称是Storage Performance Development Kit,它是一组用来编写高性能、高扩展性的用户态存储应用的工具集。
相比于SPDK,DPDK可能更为人知,它主要是为了解决网络方面的问题。SPDK在很多模块上是与DPDK共用的,它的核心观点是通过用户态协议加无锁设计加轮询机制达到高性能:
(1)用户态协议是指SPDK实现了用户NVMe协议,让用户可以在旁路内核的情况下去访问设备;其缺点是不支持posix API、不支持标准的文件系统,也没有标准的设备支持,应用性较差。
(2)无锁设计,对于高性能编程而言,无锁设计都是核心的思想,此次不再展开。
(3)轮询机制,SPDK提供了Polling Mode ,它摒弃了内核中常用的中断这类的机制,消除了中断的影响,提高了整体性能。
NVMe SSD
NVMe SSD有两个核心点:首先SSD是PCI-E的SSD,本身的访问速度是非常快的;采用NVMe之后,速度会更快,NVMe是用来代替SCSI的新协议,它具有高带宽、低延迟的特点,比SCSI协议更简单高效,提高了系统整体的性能。
数据链路
高性能本地云储存的数据链路如上图所示,在云主机中,核心数据库、POSIX API和标准文件系统保持不变。云数据库通过标准的POSIX API 访问标准文件系统;标准文件系统通过Virtio-Blk和SPDK用户态驱动直接交互,在SPDK用户态驱动中再与NVMe SSD交互,减少了数据链路的长度,同时提高了IO性能。
延迟分布
高性能本地云储存搭建之后,我们使用了fio磁盘测试工具在CentOS7上对通用虚拟化架构本地盘和阿里云高性能本地存储的随机IO平均延迟进行了对比测试。测试时块设备IO调度器均设置为noop,测试参数为--direct=1--bs=4k--iodepth=1--numjobs=1。
从上图可以看出,在随机读两方面,阿里云高IO本地盘延迟只有70us左右,而通用虚拟化架构本地盘延迟在130us左右;随机写方面,阿里云高IO本地盘的延迟只有30us左右;通用虚拟化架构本地盘延迟在60us左右。
数据库性能对比
上图是新旧数据库Index-Update性能对比,可以看到:在旧数据库实例的情况下,TPS只有14242.65、RT为8.21ms;新数据库实例下,TPS可以达到26969.81、RT为1.7ms,整体性能大幅度提升。
释放红包技术福利,即将在公有云上线
通过延迟分布和数据库性能的对比,可以看出高本地云存储对性能提升起到了很大的作用,在红包活动中发挥了很大的作用。在完成双十一及红包活动之后,阿里云希望将高性能本地云存储技术推广给其他用户使用。因此,在今年2月底,高性能本地云存储在公共云上线,它的技术架构与支撑支付宝红包的技术架构相同:采用NVMe SSD+SPDK技术,也是全球首家采用该技术的高性能本地盘。
本地盘2.0性能非常好,容量为3TB、IOPS为50万、延迟为50us、带宽为4GB。具体参数如下表所示:
可以看出,最优产品读写IOPS单盘可达24000;读带宽达2GBps;写带宽为1.2GBps。
高IO本地存储实例
有了本地盘作为基础,如果想要实现高性能本地存储实例,还需要在计算性能、存储IO性能、网络性能上进行相应地提升:
(1)为了保证计算性能稳定,采用了Intel Xeon E5-2682 v4(Broadwell)处理器,主频为2.5GHz,DDR4内存。
(2)为了保证存储IO性能稳定,采用了基于NVMe SSD和SPDK技术,提供高达数十万随机IO读写能力的同时,保持在us级别的时延水平。
(3)网络性能方面,实例网络性能与计算规格相对应(实例计算规格越大则网络性能越强)。
综上所述,将SPDK与NVMe SSD技术结合起来,能够让本地盘接近或类似物理机的性能,在双十一以及新春红包这类峰值压力很大的场景下,性能依旧很好。