云存储硬核技术内幕——(5) 七月上,不负勇往

在上期,我们了解了三个事实:

一、虚拟机如果通过iSCSI方式挂载块存储(云盘),由于所有的iSCSI操作需要涉及虚拟机的虚拟网卡,以及宿主机上的vSwitch,这种操作方式会对宿主机造成较大的压力;

二、由于iSCSI是基于TCP/IP的,因此,服务器端实现“去中心化”的高可用机制存在问题(同一时间一个IP只能存在于一台服务器上,即使引入了IPVS这样的负载均衡器,也无法完全避免单点故障切换的问题)

三、想成为技术水平得到方老师认可的迷弟迷妹,除了懂得分布式存储的三副本机制还不够;

子虚同学决定,先解决第一个和第二个问题。

我们知道,在基于Linux的KVM中,虚拟机的IO操作,实际上是依赖于QEMU虚拟出的硬件,其路径如下图:

图中,Linux内核的块存储驱动所读写的硬件(也就是x86的IO端口操作),实际上是调用QEMU模拟出来的硬件驱动。

QEMU的行为可以模拟以下几种硬件:

1. 物理上并不存在的硬件;

2. 半虚拟化硬件,物理上的一个硬件,逻辑上虚拟为多个,并各自给对应的多个虚拟机使用;

3. 真实硬件直通给虚拟机;

事实上,对于基于FC SAN的块存储,QEMU已经实现了将LUN直通给虚拟机。那么,我们如果对虚拟化存储做这一改造——

如图,我们在QEMU中增加分布式存储(又称软件定义存储,Soft Defined Storage)的驱动,该驱动对虚拟机提供块存储(如/dev/vda0),另一方面,它通过TCP/IP协议,从以太网网卡(NIC)将存储IO通过存储协议(iSCSI)或私有协议与各存储节点进行交互。一般地,分布式存储采用三副本机制,在分布式存储驱动中,也会将存储IO送到这三副本所在的节点(服务器)上。

可见,这种机制解决了两个问题:

1. 由于虚拟机挂载的是QEMU提供的虚拟化存储,存储的I/O绕开了虚拟机的iSCSI/TCPIP/虚拟网卡,以及宿主机的vSwitch等缓慢的IO路径,而是通过宿主机上的驱动访问远端存储,对时延和宿主机的CPU开销都大大优化了;

2. 宿主机上的驱动可以向VM上的应用屏蔽对端IP地址这一细节,而是通过算法来实现冗余高可用,相当于将负载均衡器放在了宿主机上;

子虚同学很开心,觉得自己可以基于这种机制设计一种新的分布式存储系统,一定能得到方老师的肯定。

子虚同学蹦蹦跳跳地来到深南大道*****号,方老师的座位,发现方老师并没有在,桌上放着一本《Linux开源存储全栈详解》和一本《Ceph分布式存储学习指南》。她翻开这两本厚厚的葵花宝典,发现自己还是不能解决问题3……

原来,这一设计机制正是最流行的开源分布式存储Ceph的实现。子虚同学想过的,早在2012年Ceph的第一个版本(Argonaut)就已经出现在业界了。

当然,子虚同学的思考,是非常有勇气,值得赞扬的,正如Jam在《七月上》中唱的那样:

我欲乘风破浪

踏遍黄沙海洋

与其误会一场

也要不负勇往

……

方老师回到工位,奖励了子虚同学一个惊喜——自己的分布式存储学习笔记。

子虚同学也决定举一反三,在后续的专题里面把分布式存储学习笔记分享给大家……