【ESSD技术解读-02】企业级利器,阿里云 NVMe 盘和共享存储
简介: 当前 NVMe 云盘结合了业界最先进的软硬件技术,在云存储市场,首创性同时实现了 NVMe 协议 + 共享访问 + IO Fencing 技术。它在 ESSD 之上获得了高可靠、高可用、高性能,同时基于 NVMe 协议实现了丰富的企业特性,如多重挂载、IO Fencing、加密、离线扩容、原生快照、异步复制等功能。本文详细介绍了云上SAN和NVMe的发展历程,并做出了对未来的构想
7x24 高可用是怎样炼成的?
现实世界中单点故障是常态,确保故障下业务连续性是高可用系统的核心能力,那么在金融、保险、政务等关键应用中,如何保证业务 7*24 高可用?通常来讲,业务系统由计算、网络、存储组成,在云上,网络多路径和存储分布式确保了稳定高可用,但要实现业务全链路高可用,还要解决计算和业务侧单点故障。以常见的数据库为例,单点故障导致业务停止对于用户难以接受,那么,当断电、宕机、硬件故障等导致实例不可服务时,如何快速恢复业务?
不同场景的解决方案有所不同,MySQL 通常搭建主从/主备架构实现业务高可用,主库故障时切换到备库持续对外提供服务。但实例切换后,如何保证主从库数据的一致性?根据业务对数据丢失的容忍度,MySQL 通常采用同步或异步方式进行数据复制,由此引入额外的问题:部分场景下导致数据缺失、同步数据影响系统性能、业务扩容要新增整套设备并进行全量数据复制、主备切换时间较长影响业务连续性等。可以看到,为了搭建高可用系统,架构将变得复杂,且很难兼顾可用性、可靠性、扩展性、成本、性能等,那么是否有更加先进的方案,兼得鱼和熊掌?答案必须是:Yes!
图1:数据库的高可用架构
通过共享存储,不同数据库实例间可共享同一份数据,从而通过计算实例的快速切换获得高可用(图1),Oracle RAC、AWS Aurora、阿里云 PolarDB 数据库就是其中的代表。这里的关键在于共享存储,传统 SAN 价格高昂,扩缩容麻烦,机头也容易成为瓶颈,其使用门槛较高对用户并不友好,有没有更好、更快、更省的共享存储,来解决用户的痛点呢?阿里云最近推出的 NVMe 云盘和共享特性,将充分满足用户的诉求,接下来我们将重点介绍。这里给大家抛出一个问题,在实例切换过后,如果原库仍在写入数据,如何保证数据正确性?卖个关子,读者可以先思考下。
图2:主从切换场景的数据正确性问题
历史前进的车轮:云上 SAN 和NVMe
我们已步入“数据石油”的数字经济时代,云计算、人工智能、物联网、5G 等技术的快速发展,促使数据的爆炸式增长。从 IDC 2020 年报告可以看出,全球数据规模逐年增长,2025 年将达到 175 ZB,数据将主要集中在公共云和企业数据中心。数据的快速增长,为存储的发展提供了新的动力和要求,让我们回忆下块存储形态是如何一步步演进的。
图3:块存储形态演进
DAS:存储设备采用直连方式(SCSI、SAS、FC 等协议)与主机连接,系统简单、易于配置管理、费用较低,由于存储资源无法被充分利用和共享,难以做到集中统⼀的管理和维护。
SAN:通过专用网路连接存储阵列和业务主机,解决了统一管理和数据共享等问题,并实现高性能低延迟的数据访问,不过 SAN 存储价格昂贵、运维复杂、可扩展性差,提高了用户的使用门槛。
全闪:底层存储介质的革命和成本的下降,标志着全闪存时代的到来,从此存储性能转移到软件栈,迫使软件进行大规模的变革,促进了用户态协议、软硬一体化、RDMA 等技术的高速发展,带来了存储性能的飞越。
云盘:云计算的高速发展历程中,存储转移到云上,云盘具有天生的优点:灵活、弹性、易用、易扩展、高可靠、大容量、低成本、免运维等,在数字化转型历程中成为存储坚实的底座。
云上 SAN:为全方面支持存储业务,取代传统的 SAN 存储,云上 SAN 应时代而生,它继承了云盘的诸多优势,也具备了传统 SAN 存储能力,包括共享存储、数据保护、同步/异步复制、极速快照等特性,必将在企业存储市场持续发光发热。
另一端,在存储协议的演进上,NVMe 正在成为新时代的宠儿。
图4:存储协议的演进
SCSI/SATA:存储远古时代,硬盘多为低速设备,数据经过 SCSI 层和 SATA 总线传输数据,性能受限于存储慢速介质,如机械硬盘,掩盖了 SATA 单通道和 SCSI 软件层的性能劣势。
VirtIO-BLK/VirtIO-SCSI:伴随着虚拟化技术和云计算的快速发展,VirtIO-BLK/VirtIO-SCSI 逐渐成为云计算的主流存储协议,使得存储资源的使用更加弹性、敏捷、安全、可扩展。
NVMe/NVMe-oF:闪存技术的发展和普及推动了新一代存储技术革命,当存储介质不再成为性能的拦路虎,软件栈成为了最大的瓶颈,由此催生了 NVMe/NVMe-oF、DPDK/SPDK、用户态网络等各种高性能轻量级协议,NVMe 协议族兼具高性能、高级特性和高扩展性,必将引领云计算新时代。
在可遇见的未来,云上 SAN 和 NVMe 必将成为未来的潮流,这是大势所趋。
云盘新时代之 NVMe
闪存技术的迅速发展和普及,将性能瓶颈转移到软件侧,对于存储性能和功能的更多需求,将 NVMe 推上了历史舞台。NVMe 专门针对高性能设备设计了数据访问协议,相比传统的 SCSI 协议,更加简捷轻量,配合多队列技术,能大幅度提升存储性能。同时 NVMe 还提供了丰富的存储特性,NVMe 标准自 2011 年诞生以来,通过不断完善协议,规范了多 Namespace、Multi-Path、全链路数据保护 T10-DIF、Persistent Revervation 权限控制协议、原子写等众多高级功能,其定义的存储新特性将持续帮助用户创造价值。
图5:阿里云 NVMe 云盘
NVMe 的高性能和丰富特性,为企业存储提供了坚实的基础,加上协议本身具备的扩展性和成长性,成为演进 NVMe 云盘的核心动力。NVMe 云盘以 ESSD 为基础,它继承了 ESSD 的高可靠、高可用、高性能、原子写等能力,以及 ESSD 原生快照数据保护、跨域容灾、加密、秒级性能变配等企业特性,ESSD 和 NVMe 特性的融合,能有效的满足企业级应用需求,使大部分基于 NVMe 和 SCSI 的业务无缝上云。本文讲述的共享存储技术就是基于NVMe Persistent Reservation 标准实现,作为 NVMe 云盘的附加功能之一,其多重挂载和 IO Fencing 技术,可以帮助用户大幅降低存储成本,并有效提升业务灵活性和数据可靠性,在分布式业务场景具有广泛的应用,特别对于 Oracle RAC、SAP Hana 等高可用数据库系统具有重要价值。
企业存储利器:共享存储
前面讲到,共享存储可以有效地解决数据库高可用问题,其主要依赖的能力包括多重挂载和 IO Fencing,以数据库为例,我们将讲述它们是如何发挥作用的。
业务高可用关键 -- 多重挂载
多重挂载允许云盘被同时挂载到多台 ECS 实例上(当前最大支持 16),所有实例均可读写访问该云盘(图6)。通过多重挂载,多个节点间共享同一份数据,能有效地降低存储成本。当单节点发生故障时,业务可以迅速切换到健康节点,该过程无需进行数据复制,为故障快速恢复提供了原子能力,如 Oracle RAC、SAP HANA 等高可用数据库均依赖该特性实现。需要留意的是,共享存储提供了数据层的一致性和恢复能力,若要达到最终业务一致性,业务可能需要进行额外处理,如数据库的日志 replay 等。
图6:多实例挂载
通常,单机文件系统不适合作为多重挂载的文件系统,为了加速文件访问,ext4 等文件系统会对数据和元数据进行缓存,对于文件的修改信息无法及时同步到其他节点,从而导致多节点间数据的不一致。元数据的不同步,也会导致节点间对硬盘空间访问的冲突,从而引入数据错。所以,多重挂载通常要配合集群文件系统使用,常见的有 OCFS2、GFS2、GPFS、Veritas CFS、Oracle ACFS 等,阿里云 DBFS、PolarFS 也具备该能力。
有了多重挂载,是否就可以高枕无忧了?多重挂载并非万能,它有自身无法解决的盲点:权限管理。通常基于多重挂载的应用需要依赖集群管理系统来管理权限,如 Linux Pacemaker 等,但在某些场景下,权限管理会失效从而导致严重问题。回忆下文章最开始抛出的问题,在高可用架构下,主实例发生异常后会切换到备实例,如果主实例处于假死状态(如网络分区、硬件故障等场景),它会错误地认为自己拥有写入权限,从而和备实例一起写脏数据,如何规避该风险? 此时该轮到 IO Fencing 出场了。
数据正确性保证 -- IO Fencing
解决脏数据写入的可选方案之一是:终止原实例的在途请求,并拒绝新请求继续下发,确保旧数据不再写入后切换实例。基于该思路,传统的解决方案是 STONITH(shoot the other node in the head),即通过远程重启该故障机器来防止旧数据落盘。不过该方案存在两个问题,首先,重启流程过长,业务切换较慢,通常会导致几十秒到分钟级的业务停止。更严重的是,由于云上 IO 路径较长,涉及组件较多,计算实例的组件故障(如硬件、网络故障等)都有几率导致 IO 在短时间内无法恢复,所以无法 100% 保证数据的正确性。
为了从根本性解决该问题, NVMe 规范了 Persistent Reservation(PR)能力,它定义了 NVMe 云盘的权限配置规则,可以灵活地修改云盘和挂载节点权限。具体到该场景,在主库发生故障后,从库首先发送 PR 命令禁止主库的写入权限,拒绝主库的所有在途请求,此时从库可以无风险的进行数据更新(图7)。IO Fencing 通常可以在毫秒级别协助应用完成故障切换,大幅缩短了故障恢复时间,业务的平滑迁移使上层应用基本无感知,相比于 STONITH 有了质的飞越。接下来我们进一步介绍 IO Fencing 的权限管理技术。
图7:IO Fencing 在故障切换下的应用
权限管理的瑞士军刀 -- Persistent Reservation
NVMe Persistent Reservation (PR) 协议定义了云盘和客户端权限,搭配多重挂载能力,可以高效、安全、平稳地进行业务切换。在 PR 协议中,挂载节点有 3 种身份,分别是 Holder(所有者)、Registerant(注册者)、Non-Registrant(访客),从名字可以看出,所有者拥有云盘全部权限,注册者拥有部分权限,访客只拥有读权限。同时,云盘拥有 6 种共享模式,可实现独占、一写多读、多写能力,通过配置共享模式和角色身份,可以灵活地管理各节点权限(表1),从而满足丰富的业务场景需求。NVMe PR 继承了 SCSI PR 的全部能力,所有基于 SCSI PR 的应用可以通过少量的改动即可运行在 NVMe 共享云盘之上。
表1:NVMe Persistent Reservation权限表
多重挂载配合 IO Fencing 能力,可以完美搭建高可用系统,除此之外,NVMe 共享盘还能提供一写多读能力,并广泛应用于读写分离的数据库、机器学习模型训练、流式处理等场景。另外,镜像共享、心跳探活、仲裁选主、锁机制等技术可以通过共享云盘轻松实现。
图8:NVMe 共享盘一写多读应用场景
NVMe 云盘技术揭秘
NVMe 云盘基于计算存储分离架构实现,依托于神龙硬件平台实现了高效的 NVMe 虚拟化和极速 IO 路径,以盘古2.0 存储为底座实现了高可靠、高可用、高性能,计算存储通过用户态网络协议和 RDMA 互连,NVMe 云盘是全栈高性能和高可用技术的结晶(图9)。
图9:NVMe 共享盘技术架构
NVMe 硬件虚拟化:以神龙 MOC 平台打造了 NVMe 硬件虚拟化技术,通过 Send Queue(SQ) 和 Completion Queue(CQ) 进行数据流和控制流的高效交互,简洁的 NVMe 协议加上高效的设计,配合硬件卸载技术,使 NVMe 虚拟化延迟降低 30%。
极速 IO 通道:基于神龙 MoC 软硬一体化技术实现了极速 IO 通道,有效缩短了 IO 通路,进而获得极致的性能。
用户态协议:NVMe 使用了全新一代 Solar-RDMA 用户态网络通信协议,结合 Leap-CC 自研拥塞控制实现了数据可靠传输并降低了网络长尾延迟,基于 25G 网络的 JamboFrame 实现了高效的大包传输,通过数据面和控制面全面分离精简了网络软件栈并提升了性能,网络多路径技术支撑了链路故障毫秒级恢复。
管控高可用:以盘古 2.0 分布式高可用存储实现了 NVMe 控制中心,NVMe 控制命令不再经过管控节点,从而获得接近 IO 的可靠性和可用性,可协助用户实现毫秒级别的业务切换;基于 NVMe 控制中心实现了多客户端和多服务器间的精确流控,在亚秒级内实现对于 IO 的精确分布式流控;在分布式系统上实现了对于多节点的 IO Fencing 一致性,通过两阶段更新使云盘分区之间权限状态保持一致,有效解决了分区权限的脑裂问题。
大 IO 原子性:基于分布式系统从计算、网络、存储端到端实现了大 IO 的原子写能力,在 IO 不跨越相邻 128K 边界的条件下,确保同一数据不会部分落盘,这对于数据库等依赖原子写的应用场景具有重要作用,它能有效优化数据库 double write 流程,从而大幅提升数据库的写入性能。
当前现状和未来展望
可以看出,当前 NVMe 云盘结合了业界最先进的软硬件技术,在云存储市场,首创性同时实现了 NVMe 协议 + 共享访问 + IO Fencing 技术。它在 ESSD 之上获得了高可靠、高可用、高性能,同时基于 NVMe 协议实现了丰富的企业特性,如多重挂载、IO Fencing、加密、离线扩容、原生快照、异步复制等功能。
图10:全球首次 NVMe + 共享访问 + IO Fencing 技术融合
目前 NVMe 云盘和 NVMe 共享盘已在邀测中,并得到了 Oracle RAC、SAP HANA 和内部数据库团队的初步认证,接下来它将进一步扩大公测范围并商业化。在可预见的未来,我们会逐步围绕 NVMe 云盘持续演进,以更好地支持在线扩容、全链路数据保护 T10-DIF、云盘多 namespace 等高级特性,从而进化出全面的云上 SAN 能力,敬请期待!
Vendor 1 |
Vendor 2 |
Vendor 3 |
阿里云 |
|
云盘协议 |
SCSI |
SCSI |
NVMe |
NVMe |
多重挂载 |
✓ |
✓ |
✓ |
✓ |
IO Fencing |
✓ |
✓ |
× |
✓ |
数据持久性 |
N/A |
9个9 |
5个9 |
9个9 |
IO延迟 |
> 300 us |
100~200 us |
100~200 us |
< 100 us |
云盘最大IOPS |
160K |
128K |
256K |
1000K |
云盘最大吞吐 |
2GB/s |
1GB/s |
4GB/s |
4GB/s |
表2:主流云计算厂商的块存储概览
原创作品:阿里云存储 阿纶
原文链接
本文为阿里云原创内容,未经允许不得转载。
【ESSD技术解读-02】企业级利器,阿里云 NVMe 盘和共享存储的更多相关文章
- Atitit.阿里云c盘 系统盘爆满解决方案
Atitit.阿里云c盘 系统盘爆满解决方案 Use disk parse tool to scan then C:\widnow/soursce /install.wim 迁移 3g 显示在 ...
- 服务化改造的云上利器 | 阿里云 EDAS 重大升级发布
11月22日,广东云栖大会企业级互联网架构专场上,阿里云发布了全新版本的企业级分布式应用服务EDAS. 新版本增强了对主流微服务框架的原生支持,实现SpringCloud & Dubbo用户代 ...
- 探索云网络技术前沿,Sigcomm 2019 阿里云参会分享
Sigcomm 2019简介 一年一度的网络顶级学术峰会Sigcomm于8月20日至22日在北京举行.作为ACM Special Interest Group on Data Communicatio ...
- 技术杂记之:在阿里云centos7上部署JDK MYSQL TOMCAT
今日小编闲来无事,乘着公司新项目即将上线之际,在阿里云上整了一台centos作为测试机.原本以为一个小时搞定,结果还是花了一点小小时间.不管怎么说,记录下来,给各位小白当成课后甜点吧. 价格 先上价格 ...
- 重磅!容器集群监控利器 阿里云Prometheus 正式免费公测
Prometheus 作为容器生态下集群监控的首选方案,是一套开源的系统监控报警框架.它启发于 Google 的 borgmon 监控系统,并于 2015 年正式发布.2016 年,Prometheu ...
- 试用阿里云RDS的MySQL压缩存储引擎TokuDB
以前就用过自己搭建MySQL服务器的两种存储引擎MyISAM和InnoDB(也用过一点Memory方式),在今年初转向阿里云关系型数据库服务RDS的时候,看到可调参数中有一个TokuDB,不过不太了解 ...
- IntelliJ 2016.02设置maven 阿里云加速
修改maven 的setting.xml <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf ...
- Linux 系统挂载阿里云数据盘
适用系统:Linux(Redhat , CentOS,Debian,Ubuntu) * Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作. 下面的操作将会把数据盘划 ...
- 【Linux】扩展阿里云数据盘分区和文件系统
扩容云盘只是扩大存储容量,不会扩容文件系统 一.准备工作 在扩展数据盘扩展分区和文件系统前,请提前完成以下工作. 创建快照以备份数据,防止操作失误导致数据丢失. 通过ECS控制台或者API扩容云盘容量 ...
- 全球首个百万IOPS云盘即将商业化 阿里云推出超高性能云盘ESSD
近日,在经过近半年的上线公测后,阿里云全球首个跨入IOPS百万时代的云盘——ESSD即将迎来商业化,单盘IOPS高达100万,这是阿里云迄今为止性能最强的企业级块存储服务. 搭配ECS云服务器使用, ...
随机推荐
- MySQL数据库InnnoDB引擎事务说明
前言 本篇文章主要讲诉数据库中事务的四大特性(ACID)以及事务的隔离级别划分. 数据库事务及其特性 事务是指满足ACID特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Roll ...
- 还在用Calendar操作Date?Java8都弃用了,还不知道它的这款强大的工具吗?
引言 在过去的Java版本中,日期和时间的处理主要依赖于java.util.Date和java.util.Calendar类,然而随着业务系统的复杂以及技术层面的提升,这些传统的日期时间类暴露出了若干 ...
- C++ 构造函数 explicit 关键字 成员初始化列表
通常,构造函数具有public可访问性,但也可以将构造函数声明为 protected 或 private.构造函数可以选择采用成员初始化表达式列表,该列表会在构造函数主体运行之前初始化类成员.与在构造 ...
- SqlServer查询表的所有字段属性及其是否是主外键
CREATE PROC [dbo].[sp_help2] @TableName VARCHAR(50) = NULL AS SET NOCOUNT ON SET TRANSACTION ISOLATI ...
- shk_to_bram
Entity: shk_to_bram File: shk_to_bram.v Diagram Description Company: FpgaPublish Engineer: FP Create ...
- GIT版本控制学习博客
GIT版本控制学习博客 环境部署 下载git版本控制即可. 用户配置 (1)设置用户及地址 git config --global user.name "Username" git ...
- TCL之基本语法1
TCL之基本语法1 1:set and puts set就是变量声明,这个声明在需要使用的指令下会自动执行,不会出现没有声明的错误.但是对于puts这类定向访问的是不能没有声明的.这里简单理解TCL ...
- Games101:作业6
说明 本次作业主要实现对上一次作业代码的重构以及使用BVH加速求交的交点判断和递归调用 代码框架的修改 有影响的改动就是框架中定义了两个结构体一个是光线ray,一个是交点Intersection 交点 ...
- Java面试题【2】
11)abstract class 和 interface 有什么区别? 含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象.含有 abstract 方法 ...
- #KD-Tree#洛谷 3710 方方方的数据结构
题目 区间加,区间乘,单点查询,撤销修改 分析 由于可以离线,不妨把下标看成第一维,时间看成第二维,那么修改操作相当于在一个矩形上加或者乘, 不妨把查询的节点看作是二维平面上的点,这样实际上就可以用 ...