如之前博文所说,XP7双活是通过虚拟磁盘阵列方式实现的,那么这个虚拟磁盘阵列又是如何保证两个阵列的数据一致了?我们结合下图来做解答。

wKiom1c_MAeg7i9wAACMuL0y54A100.png


实际上,虚拟阵列不过是两个物理阵列的幻象。落到实处,展现给主机的所有逻辑盘都在两个物理阵列上有对应的物理磁盘。两个阵列通过内部锁机制保证数据一致,工作原理简述如下:

当主机A向阵列A发出写数据请求(图中步骤1)后,阵列A首先检查要被写入的数据块是否被阵列B锁定:

如果没有锁定,则锁定阵列B对应的数据块,再把主机数据传递给阵列B(图中步骤2),等待阵列B完成数据更新后(图中步骤3),然后解除锁定,最后通知主机A数据写入完成(图中步骤4)。

如果被锁定,则等待锁定解除,再执行上述步骤。


对上面锁机制的描述可以看到,这个锁机制与ORACLE RAC很类似。数据锁的粒度大小对整体IO性能影响很大,粒度越小,越不容易出现两个阵列竞争写同一块锁数据的情况,但是,我们也要明白过细的粒度会造成锁管理负荷超限的情况。

 

之前我们描述了数据写的执行过程,对于数据读操作,由于不涉及数据更改,操作可以在两个阵列中的任意一个完成,不需要锁机制。

 

由于两个阵列之间有着一定的物理距离,我们会理所当然的认为数据IO最好在本地完成。下面我们针对读写两种情况分析

1.        写操作:从之前的数据写过程我们看到,无论哪个阵列收到数据写请求,都会等到该阵列把数据写到另外一个阵列之后(也就是图中的23步骤),才反馈主机IO已经完成。这样使用本地阵列对性能的影响只是体现在步骤1和4上节省了传输时间,对整个写过程影响占比没有直觉想象中的很大。

2.        读操作:由于不需要触发锁机制,同时避免了数据异地传输的时延,所以本地读会比异地读操作快很多。

 

由此可见磁盘阵列双活方案的本地访问优化方式,是各个阵列厂家的双活技术的主要区别之一。

 

上面只是简单描述了XP7双活的锁机制,实际产品设计还要考虑很多问题,导致具体实现相当复杂,而且这一技术还在不断演进和优化。XP7优点在于:通过虚拟磁盘阵列技术,把这些复杂性掩盖了起来,让主机认为自己只是在于一台磁盘阵列打交道。