如图1,存储的发展历程实际上是一个分久必合,合久必分的过程。每个阶段为了解决新业务场景面临的挑战在容量、性能、扩展性,可靠性,成本与管理等方面都有很大的跃升。

阶段一:直连存储DAS,服务器使用本地硬盘,通过RAID技术保障存储可靠性,不能跨服务器共享,不易扩展,存储容量有限。

阶段二:存储区域网络SAN,有FCSAN和IPSAN,提供专用的大容量的存储整列,如EMC VMAX、华为OceanStor等,通过交换机连接多台服务器;通过快照、存储备份容灾等方案保障可靠性。存储容量、性能与共享性得到的提升,但是价格比较高;且在互联网、云计算大规模场景扩展性不足,容量、性能、成本上面临很大的挑战。

阶段三:分布式存储 ServerSAN,通过分布式存储软件将大量商用服务器的本地盘,组成统一可共享的存储资源池。通过多副本、纠删码、快照等机制保障可靠性。目前是各大公有云厂商主要的存储形态,如阿里云盘古、腾讯云CBS等。通过分布式存储技术,性能与容量随服务器增加而线性增长,成本还比较低。

阶段四:软件定义存储 SDS,核心就是让存储数据面(数据存取)与控制面(管控策略)分离,根据业务需求实现策略驱动的自动化存储。数据面是存储资源层,负责数据的存取,可使用传统SAN/NAS存储,块存储、文件存储或对象存储等;控制面是策略管控层,首先统一纳管底层异构的存储资源,通过存储网关屏蔽存储差异,统一向应用层提供各种存储务;其次,能够灵活高效地设置存储策略(存储分级,百度云网盘官方下载存储QoS/SLA、数据灾备、迁移、安全等)自动化驱动底层存储资源的部署与变更。目前SDS管控端功能最完整应用最广的是VMware SPBM;而各种新兴的存储技术SDS数据面也带来重要的改进,如Intel与镁光推出的新型闪存介质3D NAND、突破性的存储技术3D XPoint、以及新的存储架构SPDK等,对存储架构、读写模型、性能、容量、可靠性等带来颠覆性提升。

当前主要的存储类型有块存储、文件存储与对象存储。块存储需要把云盘挂载到云主机,格式化安装文件系统后才能使用;主机上的应用通过iSCSI协议使用块地址LBA(Logical Block Address)直接读写数据块;主要用于数据库、OLTP系统等场景。

文件存储可以挂载到多个Linux或Windows客户端,无需格式化直接使用;客户端通过NFS或SMB协议发起读写请求,通过NAS服务器实现文件存储与块存储的转换;主要用于企业文件共享、流媒体处理等场景。

对象存储将非结构化的数据(如视频、软件包、镜像等)当做一个完整的对象(Object)进行存取,无需挂载,可直接通过HTTP协议发起对象读写;对象管理系统通过键值(Key-Value)的进行对象存取。基于文件访问频次、存储介质类型、数据访问实时性等特征,对象存储可分为标准存储、低频存储和归档存储。主要应用视频、软件应用的存储与分发、备份归档等场景。

存储网关CSG (Cloud Storage Gateway)是一种混合云统一存储方案,可以部署在用户数据中心或公有云上。CSG功能上包括块存储网关、文件网关和磁带网关,可以对应用屏蔽后端存储差异,将不同类型的数据统一存储在后端的对象存储上。可以用于数据云端灾备,多地分发共享,冷热数据分离等场景。

如图4,分布式存储系统分为3大模块,计算节点、存储集群和控制中心。计算节点上部署了存储接入的Driver模块,负责接收和处理上层应用的I/O读写请求。控制中心 Master主备部署,负责集群元数据管理,逻辑卷管理、集群健康状态,资源管理等、存储路由等;Zookeeper最少部署3台,负责监控收集存储集群与组件状态,主备Master维护、副本信息,主从副本选举,一致性保障,故障恢复等。存储集群负责数据存取,由多个存储节点组成,每个存储节点上有副本管理模块(负责副本的同步)与存储引擎模块(负责本地数据读写落盘)。

为了确保数据高可靠性,分布式存储通常保留3个副本(一主两从)。同一分数据的副本分布在不同的存储节点。不同数据的主副本分布在不同的存储节点以实现均衡。需要通过分布式一致性消息协议来保障多副本之间的一致性,其中阿里云采用的是Paxos算法,腾讯云采用RAFT算法,RAFT算法基于Paxos算法并进行了优化和简化。数据读只发生在主副本上;而数据得先写到主副本,再复制到从副本,收到从副本成功应答之后,主副本再答复应用端写入成功。当某一个副本出现异常时可以通过其他正常的副本进行本地恢复,或者通过迁移创建新的3副本。数据寻址过程如图5所示:

1)接入Driver模块接收应用下发的读写请求,记录key为块地址信息(diskid,blockid),value为应用数据;

3)查询路由信息,找分区所对应存储节点、硬盘ID与存储位置,把数据发送到主副本所在的存储节点。

如图6,手机位置跟踪文件存储与对象存储的逻辑架构比较相似,最底层都使用分布式块存储作为作为持久化的数据存储。两者主要差别点在于:

1)在使用上,文件存储需要安装客户端建立挂载点,而对象存储无需挂载可以直接使用;

2)在协议接入层,两者使用的访问协议不同,文件存储使用文件访问协议NFS/SMB,通过POSIX接口调用进行访问;而对象存储使用HTTP/HTTPS协议,通过Restful API或兼容S3接口进行访问。

3)最大差别在文件转换和对象管理层,文件存储提供了文件系统,使用树形索引结构组织数据,通过NAS服务器实现前端文件访问与后端块存储的转换。而对象存储没有文件系统,将数据当做完整的对象,通过键值索引的方式直接读写。

存储介质主要分为机械盘HDD(Hard Disk Drive)与固态盘SSD(Solid State Drive)。混合硬盘HHD(Hybrid Hard Drive)同时使用了SSD硬盘和HDD硬盘,通过Cache机制,实现冷热数据自动分级存储,在存储容量、成本与性能的最佳均衡。新兴的3D NAND与 3D XPoint等技术带来颠覆性的影响。

机械盘HDD是磁盘存储,包括盘片、磁头、主轴(电机)、控制器等组件。HDD数据读写时,磁盘控制器提供数据存储的CHS地址,主轴上的电机马达驱动盘片高速旋转,磁头可以沿盘片的半径方向移动,最终将存储数据的扇区转到磁头下进行读写。扇区(数据块)是最小存储数据的最小单元,通过LBA (Logical Block Addressing)的方式实现线性编址,上层应用通过LBA地址读数据块。磁盘常见的转速是7200 r/min或15000r/min,性能和吞吐量有一定限制。根据不同的存储访问接口协议,HDD盘分为SATA盘(串行ATA接口)容量大成本低,而SAS盘(串行SCSI连接)性能与可靠性更高。

SSD是固态的电子芯片/集成电路存储,包括负责系统管控控的主控芯片、缓存芯片,以及负责数据存储的FLASH闪存芯片等组件。主控通过执行SSD固件算法中的控制程序,进行系统管控、数据读写、性能保障等任务;数据读写时无需机械运动,通过集成电路的扫描和开关作用进行数据读写。SSD相比于HDD在性能、功耗、机架密度上、抗震等方面有显著的优势。最开始使用的是SATA SSD,主要通过SATA或SAS接口进行访问SSD盘,因为采用针对HDD的AHCI标准,导致存储传输通道的性能成为瓶颈,无法匹配SSD的性能。所以新推出了NVMe SSD走 PCIe通道,相比AHCI做了大幅优化,百度的特点缩短了CPU与存储之间的读写路径,读写寄存器次数从4次降低为0次,队列深度从1增加到64K,使得NVMe SSD性能大幅提升。

SSD相比HDD有很多优势,但依然面临价格高,读写次数有限制,硬盘寿命短,容量有限制等挑战,所以英特尔和镁光联合推出新的闪存类型3D NAND与新的存储技术3D XPoint完美的解决这些问题。传统SSD采用2D平面结构的NAND闪存,将存储芯片放在单面,限制了硬盘容量。 而3D NAND把存储颗芯片堆叠在一起(最大可堆叠32层)很好地突破了SSD的容量限制,单盘容量可达32TB。

3D XPoint是一项颠覆性的存储技术,具有NAND闪存的功能与堪比内存DRAM的性能表现。3D XPoint工作原理与NAND有根本性的不同,标记数据状态的物理值不是电压、不是电流,也不是磁极、而是电阻,通过改变单元电阻水平来区分0与1。号称性能比NAND闪存快1000倍,寿命是NAND的1000倍,密度是传统存储的10倍,而成本只有内存DRAM一半,确实是颠覆性的突破。阿里云的ESSD云盘号称达到100万的IOPS,0.2ms的访问时延,据说就是使用NVMe SSD、3DXPoint以及SPDK等技术。

在KVM中,I/O设备模拟通过QEMU与virtio来实现。如图8,在Guest 内核中部署前端驱动 (Front-end driver)负责接收用户应用下发的I/O请求;在 QEMU 中部署后端驱动(Back-end driver)负责接收前端I/O请求,然后调用内核中的设备驱动执行底层的物理I/O操作;前端驱动和后端驱动绕过KVM内核,通过Vring虚拟队列的环形缓冲区直接通信。

使用云盘时,首先通过iSCSI协议将云盘挂载到主机,QEMU通过RAW模式模拟成一个块存储设备提供给云主机。应用向模拟设备发送I/O请求,哪个网盘免费容量大Front-end接收并把请求放到VRing虚拟队列,然后通知用户态的QEMU获取I/O请求。QEMU调用内核态的设备驱动执行数据读写,触发VMExit转换。KVM内核获取数据后通过中断通知 QEMU获取数据,并放到VRing虚拟队列中,通知 Guest 获取取数据。此场景下,I/O需要经过多个组件处理,路径比较长,且触发中断、VMExit切换等会产生开销与时延,在大规模读写场景限制了I/O的性能。

SPDK(Storage Performance Development Kit)是Intel推出的基于NVMe SSD的开发套件,目标是通过使用Intel的网络,处理,存储技术,将固态存储介质出色的功效发挥到极致。如图9,采用SPDK时I/O不经过QEMU,直接从VRing获取I/O请求,查找路由后直接对后端存储设备进行读写。所以,SPDK将存储数据面从QEMU卸载,缩短了I/O路径,减少系统处理、云存储哪个好中断、VMExit转换等带来的开销与时延。

SPDK的关键技术是UIO(Userspace IO)和Polling。首先,在Linux系统中驱动设备都是运行在内核空间,在用户空间用应用程序调用即可使用。通过UIO将少量共性的设备驱动放在内核态实现,建立内核和用户空间的数据传递通道和同步机制,然后在用户空间实现设备驱动的大部分的功能,因此减少了内核上下文切换和中断带来的处理开销。其次,在传统I/O模型中,应用提交I/O请求后进入休眠状态,I/O完成后通过中断将应用唤醒。采用Polling轮询模式改变了I/O模型,应用提交I/O请求后继续执行其他工作,然后按一定的时间间隔轮询I/O是否完成,这样不仅提升了系统处理效率,同时避免了中断处理带来的延迟和开销。

内容:云计算、人工智能、物联网、云安全、区块链等前沿技术与资讯分享平台。