DRBD-9 的内核数据结构

本文描述了 DRBD-9 的内核数据结构。从 Linux v3.14 开始,我们正在重组 DRBD 以使用此数据结构。

基本数据结构

一个节点拥有多个 DRBD 资源。每个此类资源都包含多个设备(亦称卷)以及与其他节点(“对等节点”)的连接。每个 DRBD 设备在本地都由一个块设备表示。

DRBD 对象相互连接,形成如下所示的矩阵;一个 drbd_peer_device 对象位于每个 drbd_device 和 drbd_connection 之间的交点。

/--------------+---------------+.....+---------------\
|   resource   |    device     |     |    device     |
+--------------+---------------+.....+---------------+
|  connection  |  peer_device  |     |  peer_device  |
+--------------+---------------+.....+---------------+
:              :               :     :               :
:              :               :     :               :
+--------------+---------------+.....+---------------+
|  connection  |  peer_device  |     |  peer_device  |
\--------------+---------------+.....+---------------/

在此表中,设备可以按卷号从资源中横向访问。同样,peer_device 可以按卷号从连接中访问。纵向的对象通过双向链表连接。从 peer_device 到其连接和设备有反向指针,从连接和设备到其资源也有反向指针。

所有资源都位于 drbd_resources 双向链表中。此外,所有设备都可以通过 drbd_devices idr 访问其次设备号。

drbd_resource、drbd_connection 和 drbd_device 对象是引用计数的。peer_device 对象仅用于建立设备和连接之间的链接;它们的生命周期由它们所引用的设备和连接的生命周期决定。