DRBD是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案.
本文通过分析DRBD的源代码来揭示drbd磁盘空间的管理,为什么一个磁盘分区使用DRBD初始化之后,可用磁盘空间会减少一部分呢?看完本文就明白了
DRBD的初始化:
使用命令drbdadm -d create-md r0 初始化drbd的元数据。
此命名转化为如下命令drbdmeta /dev/drbd0 v08 /dev/sdc6 internal create-md
DRBD的元数据放在磁盘分区的尾部,如下所示:
bm:bitmap,记录磁盘上数据的变化,大小随磁盘空间的大小而变化,以磁盘分区为1GB为例,bm的大小为64KB
bitmap空间的计算:
对于bitmap, 1 bit 对应1 个block 即 4 K , 那一个扇区能映射多少磁盘空间呢? 512*8*4K = 2^9*2^3*2^12 = 2^24
md_size_sect = (磁盘空间的字节数 + (1UL<<24)-1) >> 24; /* bitmap需要的扇区数 */
md_size_sect = (md_size_sect + 7) & ~7ULL; /* align on 4K blocks */
al:activity log,大小为32KB
md:metadata,大小为4KB,记录此DRBD设备的元数据,使用结构体md_on_disk_08表示,执行完create-md命令后的结构如下(分区大小为1GB):
struct md_on_disk_08 {
be_u64 la_sect = 0; /* last agreed size. */
be_u64 uuid[UUID_SIZE] = {4,0,0,0}; // UUIDs.
be_u64 device_uuid = 0;
be_u64 reserved_u64_1;
be_u32 flags = 0;
be_u32 magic = DRBD_MD_MAGIC_08;
be_u32 md_size_sect = 136;
be_s32 al_offset = -MD_AL_MAX_SECT_07;// 64 /* signed sector offset to this block */
be_u32 al_nr_extents = 257; /* arbitrary; /* important for restoring the AL */
be_s32 bm_offset = -128; /* signed sector offset to the bitmap, from here */
be_u32 bm_bytes_per_bit = DEFAULT_BM_BLOCK_SIZE;// 1 << 12
be_u32 reserved_u32[4];
char reserved[8 * 512 - (8*(UUID_SIZE+3)+4*11)];
};
linux-10:/var/lock # drbdadm -d up r0
drbdsetup /dev/drbd0 disk /dev/sdc6 /dev/sdc6 internal --set-defaults --create-device --on-io-error=detach
drbdsetup /dev/drbd0 syncer --set-defaults --create-device --al-extents=257 --rate=100M
drbdsetup /dev/drbd0 net 192.168.1.1:7900 192.168.1.2:7900 C --set-defaults --create-device --rr-conflict=disconnect --after-sb-2pri=disconnect --after-sb-1pri=discard-secondary --after-sb-0pri=discard-least-changes --allow-two-primaries
设置磁盘只读,为0就是可读可写,为1才是设置为只读