DRBD源代码分析之初始化磁盘结构及元数据

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才是设置为只读
 

发布了31 篇原创文章 · 获赞 3 · 访问量 2028

猜你喜欢

转载自blog.csdn.net/lclfans1983/article/details/105353051
今日推荐