分类: LINUX
2011-01-26 14:51:16
DRBD 是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。您可以把它看作是一种网络RAID。
DRBD负责接收数据,把数据写到本地磁盘,然后发送给另一个主机。另一个主机再将数据存到自己的磁盘中。其他所需的组件有集群成员服务,如TurboHA 或 心跳连接,以及一些能在块设备上运行的应用程序。例如:裸I/O、文件系统及fsck、具有恢复能力的数据库。
下面是DRBD的系统结构图
由上图, DRBD的实现方式是在物理的存储设备上面, 再添加了一层块设备. 其中使用本地的物理存储的作为"主用" (primary), 通过网络访问的位于另外一个主机的存储设备作为"次用"(secondary)设备. 就像一个通过网络来实现的RAID-1.
对于读操作, 都是使用"主用"的存储, 即本地的.
对于写操作, 问题有些复杂, 但是针对最简单的情况, 它的实现方式如下,
1. 接到写请求;
2. 把写请求发送给本地底层存储, 同时通过网络把写请求发送给对端的"次用"DRBD设备;
3. "次用"DRBD设备执行写请求, 把数据写到物理存储上.
4. "次用"DRBD在完成写操作后, 发送一个"确认"给"主用"DRDB
5. 这是, "主用"DRBD应已完成对本地硬盘的写, 返回给应用一个写操作完成确认.
也就是说, DRBD直到完成本地和远端的写操作, 才返回应用一个写完成.
当然, 这是DRBD最严格的一种实现. DRDB也可以有另两种相对松散的实现,
a. 主用DRBD在接到写请求后, 立刻返回写完成给应用.
b. 在次用DRBD的缓存收到写请求后, 立刻返回写完成给应用.
DRBD还支持同时向"主用"和"次用"设备的写操作, 实现就要复杂的多. 我的个人理解, 对于应用来说, 只面对主用设备, 在发生集群(clustering)切换之前, 应用是不直接访问次用设备的. 结构越简单, 可靠性越高.
注:最初的时候错误的使用了DRDB, 事实上是DRBD