SSAN之VAAI特性功能实现剖析

(TaoCloud团队原创   作者:Evan@TaoCloud)


1. VAAI特性简介
VMware进行虚拟机迁移克隆等操作时,都涉及到虚拟机文件的数据传输,传统的数据管理过程如图1所示。
步骤1,通过网络将数据从存储阵列读取到EXSI主机。
步骤2,数据处理。
步骤3,通过网络将数据重写回存储阵列。
一定数量VMware虚拟机同时进行迁移、克隆等操作时,会出现网络带宽消耗严重、CPU和内存资源大量占用等问题。

图1 VMware传统数据管理示意图

针对上述问题,VMware vSphere 5.0及以上版本推出VAAI存储特性(VMware vSphere Storage APIs Array Integration,也称为硬件加速)。VAAI工作是将VMware主机的存储数据工作卸载到共享存储阵列,这样不仅可以减轻VMware主机CPU、内存的压力,而且降低对网络资源的要求。VMware VAAI集成特性如下:
1、Full Copy,虚拟机迁移、克隆场景,数据复制工作卸载到存储阵列。
2、Block Zero,创建虚拟机、格式化虚拟磁盘场景,大量块置零工作卸载到存储阵列。
3、Hardware-Assisted Locking(ATS),VMFS作为多主机共享的集群文件系统,通过锁机制保障数据读写安全性。VMware通过ATS细化锁粒度、缩小锁范围,提高VMFS的IO并发能力。
4、Thin Provisioning Unmap,存储精简配置场景下的空间回收,减少存储空间的使用。

2 VAAI特性原理
VAAI工作是将VMware主机的存储数据工作卸载到存储阵列,本质是数据卸载,其卸载功能是嵌入到数据流的处理过程,而数据流走的是SCSI。因此,VAAI集成特性都是采用SCSI命令,更确切地说,都是走带内SCSI命令,VAAI集成特性指令集如表1所示。

VAAI特性原理如图2所示,其主要应用如下:
1. VMware作为存储阵列的主机侧,开启VAAI后,上述VAAI特性的数据处理不再走传统SCSI数据处理流程,而是走带内SCSI数据处理流程。
2. SCSI命令经过iSCSI传送到存储阵列的SCSI Target Module,如果SCSI Target Module支持该SCSI命令,则会对该SCSI命令解析并执行相应操作,返回正确的执行结果给VMware;否则返回异常给VMware并告知VMware主机,存储阵列不支持该SCSI命令对应的VAAI特性。
3. VMware主机接收相应的SCSI错误消息,将会重启传统SCSI数据管理流程。以Full Copy为例,当VMware主机收到存储阵列SCSI异常消息,则采用传统SCSI 数据处理流程,Full Copy会在VMware主机和存储阵列多次SCSI命令交互,数据从存储阵列读取到主机,再从主机写回存储阵列。

图2 VAAI特性原理图

Full Copy工作原理是当VMware进行虚拟机文件复制或虚拟机迁移时,把SCSI指令卸载到存储阵列,让存储阵列在底层完成复制功能。
如图3所示,Full Copy完全复制,VMware下发SCSI EXTENDED_COPY指令,该指令携带待复制数据的源、目的地址,待复制数据总空间。存储阵列直接基于EXTENDED_COPY信息进行数据复制操作,这样避免VMware主机无效数据拷贝,减少IO路径和网络负载,提高数据复制效率。

图3 VAAI Full Copy原理图

VMFS作为集群文件系统,在多个VMware主机共享访问时,通过锁机制来避免写冲突。传统的方式,主机侧通过SCSI Reservation机制进行SCSI锁操作,将整个虚拟磁盘(LUN)锁定。其他主机向已锁定的虚拟磁盘发送写操作,收到SCSI Reservation Conflict报错信息,这样存在数据并发瓶颈,影响LUN使用率。

如图4所示,VMware设计硬件辅助锁机制,也称为原子测试和设置 (ATS),支持离散虚拟机锁定。每次主机侧写虚拟磁盘(LUN),取代SCSI Reservation锁机制对整个LUN锁定,ATS缩小锁机制的锁定范围,只针对写的单个数据块加锁。从而缩小了锁粒度,提高了VMFS系统的并发IO和读写性能。

图4 VAAI ATS原理图

传统方式对虚拟磁盘格式化是通过VMware vSphere不断以小块形式发送SCSI WRITE命令来实现,SCSI WRITE命令下发整个虚拟磁盘大小的零数据。

如图5所示,支持VAAI Block Zero特性的存储阵列,VMware vSphere通过下发WRITE_SAME的SCSI指令来进行虚拟磁盘格式化,该指令携带待格式化的数据范围、数据模板,这样避免下发大量置零数据。

图5 VAAI Block Zero原理图

Thin Provisioning Unmap主要是针对精简配置的存储阵列做空间回收,提高存储空间使用效率,应用于删除虚拟机文件的场景。VMware向存储阵列发送UNMAP的SCSI指令,存储释放相应空间。

3 VAAI特性实现
TaoCloud SSAN是典型的ServerSAN产品,遵循软件定义存储理念,可从X86服务器硬件平台的本地存储资源中创建基于服务器的SAN,以便按需提供具有弹性的、可扩展的存储容量和性能。SSAN采用去中心化的全对等Share-nothing架构,融入Scale-out分布式块存储技术,闪存优化技术,超融合技术,安全加固技术,构建高效、可靠、智能、弹性的存储计算平台。

3.1 SSAN超融合架构
TaoCloud SSAN可以很好地支持VMware vSphere虚拟化平台,其超融合架构如图6所示。
1.    每台服务器既是vSphere计算节点,又是TaoCloud SSAN存储节点。
2.    每个VMware vSphere主机配置一个虚拟机作为控制器(CVM),并将物理主机上的磁盘、网卡透传给CVM。
3.    CVM上部署TaoCloud SSAN超融合软件,形成统一的存储池。
4.    TaoCloud SSAN为iSCSI Target Module提供SSAN Backing Store驱动,iSCSI Target Module支持标准iSCSI接口,对外提供块存储。

图6 TaoCloud SSAN融合架构

3.2 基于SSAN的VAAI实现
结合iSCSI特性、VAAI特性原理及TaoCloud SSAN超融合架构,本章节描述基于SSAN的VAAI实现。VMware vSphere 5.0及以上版本支持VAAI存储特性,这就要求SCSI Target Module支持VAAI SCSI Primary Command。TaoCloud SSAN 采用开源STGT、用户态iSCSI Target Module。backing store支持SSAN,使其支持VAAI特性,其架构如图7所示。
1.    STGT中tgtd运用EPOLL机制实现与tgtadm、initiator的通信,tgt负责处理tgtadm控制面、initiator数据面的请求。
2.    iSCSI SPC协议支持VAAI 特性指令EXTENDED_COPY、WRITE_SAME_16、COMPARE_AND_WRITE、UNMAP。
3.    STGT支持多种backing store后端存储,Backing store注册函数中实现VAAI存储特性的数据处理。

图7 STGT架构图

3.2.1 SSAN Full Copy实现
SSAN Full Copy实现的本质是数据复制工作卸载到存储阵列,在存储阵列处理SCSI Primary Command,操作时序如图8所示。其大致可分为iSCSI SPC协议对VAAI Full Copy的支持,VAAI Full Copy数据处理过程。

图8 SSAN Full Copy时序图

SPC-3协议文档指出“A Third-Party Copy(3PC) bit set to one indicates that the SCSI target device supports third-party copy commands such as the EXTENDED COPY command”,因此spc_inquiry函数对Standard INQUIRY data format(见图9)第5个字节中比特位3PC置1操作,保证iSCSI协议支持VAAI Full Copy。

图 9 SPC-3 Standard INQUIRY data format

Full Copy数据处理部分对SCSI Primary Command指令0x84、0x83处理,receive_copy_result(0x84)用来处理指令0x83需要的协议字段target_descriptors、segment_descriptors;Full Copy(0x83)解析协议字段target_descriptors、segment_descriptors获取数据复制所需源卷、目的卷的offset、size信息,调用SSAN数据读写接口ssan_sd_io实现从源卷到目的卷的数据复制。基于开源分布式对象存储系统SSAN,为保障数据的一致性,对接口ssan_sd_io进行了改进:写操作同步更新inode信息、读写一致性锁。

3.2.2 SSAN Block Zero实现
支持VAAI Block Zero特性,解析WRITE_SAME_16获取块指令操作的卷的offset、size,调用SSAN接口CREATE_AND_WRITE_OBJ,创建SSAN对象并块写零操作,其时序如图10所示。SSAN提供两种方式以提高块置零的效率。
1.    在WRITE_SAME_16指令相同块数目num的情况下,增加卷的块大小bs,以提高置零块的总空间(bs*num)。
2.    考虑到WRITE_SAME_16指令块地址的连续性和SSAN对象空间4M大小,处理多次WRITE_SAME_16指令请求的offset、size来构造大块的数据写零。

图10 SSAN Block Zero时序图

3.2.3 SSAN ATS实现
ATS机制本质就是缩小锁机制的锁定范围,把ESXI对LUN锁定卸载到存储阵列小级别的块锁定。对有效数据块,SSAN提供更小粒度的mutex锁机制,利用互斥锁机制,运用锁链表保证数据块的一致性。提供数据块的锁信息结构体。
struct ats_range {
    struct ats_range **pprev;      // 用来维护锁链表
    struct ats_range *next;        // 用来维护锁链表
    uint64_t offset;              // 记录块偏移量
    uint32_t lens;               // 记录块长度
    uint16_t blocked;            // 记录块是否已加锁
};
数据块对象结构体
struct object {
    struct object_info object;      // 块对象信息
    pthread_mutex_t ats_lock;    // 块对象锁
    struct ats_range *ats_io_list;  //  锁链表
};
SSAN ATS提供两组锁操作函数,用来对块数据读写的锁处理。数据读写操作前,ATS锁操作函数ssan_handle_ats_before_io(),操作流程如下:
步骤1,获取某次IO操作的offset、size并遍历锁链表;
步骤2,比较IO的offset、size与锁链表数据块对象中的offset、size,数据比较宏定义:
#define is_overlapping(start1, len1, start2, len2) \
    ((start2) > (start1) ? ((start2) - (start1)) < (len1) : \
    ((start1) - (start2)) < (len2))
步骤3,若IO数据块地址冲突,设置锁链表中冲突数据块的blocked为1;若IO数据块地址不冲突,初始化IO锁结构体并加入到锁链表。
数据读写操作后,ATS锁操作函数ssan_handle_ats_after_io(),释放IO锁结构体并根据blocked触发线程信号量。

3.2.4 SSAN UNMAP实现
对精简配置的存储阵列,SSAN采用socket C/S通信模式实现VAAI UMAP,时序如图11所示。
客户端:解析UNMAP指令参数,获取offset、size并更新inode;根据offset、size查找对应的object ID(oid)。
服务端:根据oid查找object,存在则remove oid对应的对象并更新inode。

图11 SSAN UNMAP时序图


4 VAAI特性小结
实测表明,TaoCloud SSAN存储能够良好的支持VMware VAAI存储特性。

图12 TaoCloud SSAN存储支持VMware VAAI存储特性

对比测试发现,基于VAAI Full Copy特性进行虚拟机克隆速度提高近2倍,网络带宽明显增加。
  

图13 VAAI Full Copy虚拟机克隆对比测试

基于VAAI Block Zero特性创建厚置备置零的虚拟机磁盘,其磁盘性能得到很大的提升。图14表明,SSAN STGT支持VAAI Block Zero。
 

图14 STGT WRITE_SAME_16操作日志

对于精简配置的存储阵列,基于VAAI Unmap特性删除数据时,存储空间得到释放,每秒查询存储空间使用情况。可以发现使用空间以2GB/s减少,Unmap很好地实现空间回收功能。
 
随着VAAI的广泛应用,更多的存储厂商通过支持VMware VAAI存储特性,减轻VMware主机CPU、内存压力,降低对网络资源要求,提高VMFS的IO并发能力和性能。TaoCloud SSAN已实现对VAAI存储特性的完美支持。


你可能感兴趣的:(分布式存储)