【参考文献】
1. http://www.drbd.org/home/what-is-drbd/
注:DRBD by LINBIT,对DRBD和Heartbeat做了详细生动的介绍,你不得不读的入门教材,还有可以学英语哟。
2. http://freeloda.blog.51cto.com/2033581/1275384
3. http://www.xifenfei.com/1438.html
注:技术博客,描述了DRBD的安装配置实验,值得参考。
4. http://www.drbd.org/users-guide/
注:DRBD官方用户指导文档。
【实验背景】
网络存储课堂实验,打造一个典型的HA方案。经过调研,最后敲定为:DRBD+Heartbeat。
【实验环境】
硬件:磁盘阵列,带硬RAID卡。
系统:CentOS 6.3系统,升级后的内核版本为3.2.24。
DRBD共有两部分构成:内核模块和用户空间和管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果你的内核版本高于此版本的话,你只需要安装管理工具即可。否则,你需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号最后是保持对应。实验所用的是CentOS6.3系统,我的本意是将它的内核从.2.6.32升级到目前的.3.2.24,因为.3.2.24版本的内核源码中已经内嵌了drbd模块代码。接下来你要做的就是编译内核,首先要你需要做内核选项配置,在内核源码目录下执行make menuconfig,在Device drivers->Block devices菜单下存在DRBD选项。
注:如果你在做内核选项配置的时候已经勾选了DRBD选项的话,升级完内核后,你只需要再安装管理工具就可以了。
遗憾的是我之前在做选配配置的时候没有勾选此选项,因为我不知道有这个选项。怎么办呢?
【方案一】
进入内核源码树主目录,重新make menuconfig,勾选“DRBD Distributed Replicated Block Device support”为M,即将它编译为模块。
然后,重新编译模块。
[root@localhost linux-3.2.24]# make ./drivers/block/drbd/ modules
[root@localhost linux-3.2.24]# cd ./drivers/block/drbd
[root@localhost drbd]# mkdir /lib/modules/3.2.24.scst2.2.0/kernel/drivers/block/drbd
[root@localhost drbd]# cp drbd.ko /lib/modules/3.2.24.scst2.2.0/kernel/drivers/block/drbd/
[root@localhost drbd]# cd /
提示:以上指令执行的结果是重新编译所有的模块,而不仅仅是./drivers/block/drbd目录下的模块。你满心以为会快速地在drbd目录下生成drbd.ko,但事实上并不是这样子的。那么有没有什么办法能只单独编译某一个模块呢?答案是肯定的!但是我现在还不知道怎么弄,嘿嘿!
[root@localhost linux-3.2.24]# depmod –a
注:这一步至关重要,进入/lib/modules/$(shell uname -r)/目录下执行此命令,depmod会检测模块的相依性,供modprobe在安装模块时使用,参数-a或--all会分析所有可用的模块。
下面来试试通过modprobe加载drbd模块。
[root@localhost ~]# modprobe drbd
FATAL: Error inserting drbd (/lib/modules/3.2.24.scst2.2.0/kernel/drivers/block/drbd/drbd.ko): Unknown symbol in module, or unknown parameter (see dmesg)
显然,模块加载失败,并建议查看dmesg信息如下。
[root@localhost 3.2.24.scst2.2.0]# dmesg | grep drbd
drbd: Unknown symbol lc_seq_printf_stats (err 0)
drbd: Unknown symbol lc_index_of (err 0)
drbd: Unknown symbol lc_del (err 0)
drbd: Unknown symbol lc_put (err 0)
drbd: Unknown symbol lc_find (err 0)
..........此处省略数十行.........
各种未定义的lc_xxx函数,由此猜想是不是drdb所依赖的模块没有加载。但是没有道理呀,我已经做过依赖性检查了(depmod –a),如果所依赖的模块各就各位的话应该会先加载依赖模块。所以,有可能依赖模块本身就不存在。先用“modinfo drbd.ko”检查drbd所依赖的模块。
[root@localhost drbd]# modinfo drbd.ko
filename: drbd.ko
alias: block-major-147-*
license: GPL
version: 8.3.11
description: drbd - Distributed Replicated Block Device v8.3.11
author: Philipp Reisner
srcversion: 2D876214BAAD53B31ADC1D6
depends: lru_cache //依赖模块
intree: Y
vermagic: 3.2.24.scst2.2.0 SMP mod_unload modversions
parm: minor_count:Maximum number of drbd devices (1-256) (uint)
parm: disable_sendpage:bool
parm: allow_oos:DONT USE! (bool)
parm: cn_idx:uint
parm: proc_details:int
parm: usermode_helper:string
从modinfo给出的信息来看,drbd.ko依赖于lru_cache.ko模块,所以我们尝试用modprobe加载lru_cache。
[root@localhost ~]# modprobe lru_cache
FATAL: Module lru_cache not found.
错误提示找不到该模块,哎呀,先解决这个依赖问题!lru_cache.ko是lru(近期最少使用)算法模块,该模块的源码位于linux-3.2.24/lib/目录下。
[root@localhost lib]# pwd
/usr/src/dm-cache/linux-3.2.24/lib
[root@localhost lib]# ll lru_cache.*
-rw-rw-r--. 1 root root 14933 Jul 25 2012 lru_cache.c
-rw-r--r--. 1 root root 149295 Nov 5 00:05 lru_cache.ko
-rw-r--r--. 1 root root 937 Nov 5 00:02 lru_cache.mod.c
-rw-r--r--. 1 root root 52952 Nov 5 00:05 lru_cache.mod.o
-rw-r--r--. 1 root root 102761 Nov 5 00:01 lru_cache.o
[root@localhost lib]# cp lru_cache.ko /lib/modules/3.2.24.scst2.2.0/kernel/lib/
[root@localhost lib]# modinfo lru_cache.ko
filename: lru_cache.ko
license: GPL
description: lru_cache - Track sets of hot objects
author: Philipp Reisner
srcversion: 806E4E4AD189DC2826C6B8F
depends:
intree: Y
vermagic: 3.2.24.scst2.2.0 SMP mod_unload modversions
[root@localhost linux-3.2.24]# depmod –a
再次尝试加载drbd。
[root@localhost ~]# modprobe drbd
[root@localhost ~]# lsmod | grep drbd
drbd 253694 0
lru_cache 7353 1 drbd
嗯,成功!
实际应用中我们当然不是每次都要通过modprobe手动来加载该模块,因为我们有drbd的用户空间管理工具,利用该工具会自动加载drbd模块,下面就是下载安装drbd的用户空间管理工具。
[root@localhost drbd]# rpm -ivh drbd83-8.3.15-2.el5.centos.x86_64.rpm
warning: drbd83-8.3.15-2.el5.centos.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID e8562897: NOKEY
Preparing... ########################################### [100%]
1:drbd83 ########################################### [100%]
提示:drbd管理工具
drbdadm:高级管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta发送指令。
drbdsetup:配置装载进kernel的DRBD模块,平时很少直接用。
drbdmeta:管理META数据结构,平时很少直接用。
以后我们要启动drbd就直接执行下面这条指令。现在先不执行,因为还有一些配置没有完成。
[root@localhost ~]# service drbd start
思:通过service启动drbd实际上是调用了/etc/init.d/drbd脚本,可以仔细研究一番。
【方案二】
提示:纯粹用rpm包方式安装。
【方案三】
提示:更改yum源
【方案四】
提示:源码编译
【方案五】
提示:推倒重来
我有两台机器,机器名分别叫super和zm。
[root@super drbd.d]# cat mpx.res
resource mpx {
on super {
device /dev/drbd0;
disk /dev/dm-1;
address 222.31.76.144:7789;
meta-disk internal;
}
on zm
{
device /dev/drbd0;
disk /dev/sda4;
address 222.31.76.57:7789;
meta-disk internal;
}
}
注:[root@super drbd.d]# ll /dev/mapper/vgSuper-lv0Super
lrwxrwxrwx. 1 root root 7 Nov 5 21:09 /dev/mapper/vgSuper-lv0Super -> ../dm-1
初始化资源。
[root@super ~]# drbdadm create-md mpx
DRBD module version: 8.3.11
userland version: 8.3.15
preferably kernel and userland versions should match.
提示:此处提醒drbd内核模块版本与drbd用户空间管理工具版本不匹配,建议版本匹配。这是我之前安装的疏忽,经查证确实如此,这个问题留待稍后解决(其实也就不会再去解决了!)。
[root@super ~]# rpm -qa | grep drbd
drbd83-8.3.15-2.el5.centos.x86_64
[root@super ~]# cd /lib/modules/3.2.24.scst2.2.0/kernel/drivers/block/drbd/
[root@super drbd]# ls
drbd.ko
[root@super drbd]# modinfo drbd.ko
filename: drbd.ko
alias: block-major-147-*
license: GPL
version: 8.3.11 //版本果然有问题
description: drbd - Distributed Replicated Block Device v8.3.11
author: Philipp Reisner
srcversion: 2D876214BAAD53B31ADC1D6
depends: lru_cache
intree: Y
vermagic: 3.2.24.scst2.2.0 SMP mod_unload modversions
parm: minor_count:Maximum number of drbd devices (1-256) (uint)
parm: disable_sendpage:bool
parm: allow_oos:DONT USE! (bool)
parm: cn_idx:uint
parm: proc_details:int
parm: usermode_helper:string
You have new mail in /var/spool/mail/root
//此处省略若干空行…
--== Thank you for participating in the global usage survey ==--
The server's response is:
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
super节点初始化失败!!怎么回事呢?
[root@super drbd.d]# cat mpx.res
resource mpx {
on super {
device /dev/drbd0;
disk /dev/mapper/vgSuper-lv0Super;
address 222.31.76.144:7789;
meta-disk internal;
}
on zm {
device /dev/drbd0;
disk /dev/sda4;
address 222.31.76.57:7789;
meta-disk internal;
}
}
[root@super /]# drbdadm create-md mpx
DRBD module version: 8.3.11
userland version: 8.3.15
preferably kernel and userland versions should match.
You want me to create a v08 style flexible-size internal meta data block.
There appears to be a v08 flexible-size internal meta data block
already in place on /dev/mapper/vgSuper-lv0Super at byte offset 117436416
Do you really want to overwrite the existing v08 meta-data?
[need to type 'yes' to confirm] yes
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
提示:drbd.conf红色加粗部分为修改处,注意将修改后的文件同步到备份节点。
[root@zm ~]# drbdadm create-md mpx
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
在zm节点上初始化成功。
在super和zm上启动drbd服务。
[root@super ~]# service drbd start
[root@zm ~]# service drbd start
查看一下状态。
[root@super ~]# drbd-overview
0:mpx Connected Secondary/Secondary Inconsistent/Inconsistent C r-----
You have new mail in /var/spool/mail/root
[root@zm ~]# drbd-overview
0:mpx Connected Secondary/Secondary Inconsistent/Inconsistent C r-----
从上面的信息中可以看出此时两上节点都处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:
drbdsetup /dev/drbd0 primary –o
或者
drbdadm -- --overwrite-data-of-peer primary mpx
将super设置为主节点。
[root@super ~]# drbdsetup /dev/drbd0 primary -o
You have new mail in /var/spool/mail/root
[root@super ~]# drbd-overview
0:mpx SyncSource Primary/Secondary UpToDate/Inconsistent C r-----
[==>.................] sync'ed: 15.4% (91964/104380)K
格式化并挂载。
[root@super ~]# mke2fs -j /dev/drbd0
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
26104 inodes, 104380 blocks
5219 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
注:drbd0是在启动drbd服务后依据配置文件mpx.res所生成的。
[root@super ~]# mkdir /mnt/mpx
You have new mail in /var/spool/mail/root
[root@super ~]# mount /dev/drbd0 /mnt/mpx/
[root@super ~]# mount -l | grep drbd0
/dev/drbd0 on /mnt/mpx type ext3 (rw)
好啦,现在拷贝一些文件到挂载目录上去。
[root@super ~]# cd /mnt/mpx/
[root@super mpx]# ls
lost+found
[root@super mpx]# cp -r /opt/htdocs/ ./
[root@super mpx]# ls
htdocs lost+found
[root@super mpx]# du -sh *
52M htdocs
12K lost+found
切换一下Primary和Secondary节点,检查一下文件是否同步到了备份节点上。
[root@super ~]# umount /mnt/mpx///卸载
[root@super ~]# drbdadm secondary mpx//降级
DRBD module version: 8.3.11
userland version: 8.3.15
preferably kernel and userland versions should match.
[root@zm ~]# drbdsetup /dev/drbd0 primary –o//升级
You have new mail in /var/spool/mail/root
[root@super ~]# drbd-overview
0:mpx SyncSource Secondary/Secondary UpToDate/Inconsistent C r-----
[=================>..] sync'ed: 92.5% (63104/812828)K
You have new mail in /var/spool/mail/root
[root@zm ~]# drbd-overview
0:mpx SyncTarget Primary/Secondary Inconsistent/UpToDate C r-----
[==================>.] sync'ed: 97.5% (22656/812828)K
[root@zm ~]# mkdir /mnt/mpx
[root@zm ~]# mount /dev/drbd0 /mnt/mpx
[root@zm ~]# cd /mnt/mpx
[root@zm mpx]# ls
htdocs lost+found
[root@zm mpx]# du -sh *
72M htdocs
16K lost+found
嗯,drbd这一部分已经ok啦!
1.DRBD主从节点的磁盘空间必须是同种类型同样大小吗?
思:主备服务器同步的两个分区大小最好相同,这样不至于浪费磁盘空间,因为drbd磁盘镜像相当于raid 1。
2.DRBD可以支持的底层设备有哪些?
DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘并且可以创建文件系统。DRBD所支持的底层设备有以下这些类:
一个磁盘,或者是磁盘的某一个分区;
一个soft raid 设备;
一个LVM的逻辑卷;
一个EVMS(Enterprise Volume Management System,企业卷管理系统)的卷;
其他任何的块设备。
3.DRBD有哪几种复制模式?
协议A:异步复制协议。本地写成功后立即返回,数据放在发送buffer中,可能丢失。
协议B:内存同步(半同步)复制协议。本地写成功并将数据发送到对方后立即返回,如果双机掉电,数据可能丢失。
协议C:同步复制协议。本地和对方写成功确认后返回。如果双机掉电或磁盘同时损坏,则数据可能丢失。
4.在从节点的drbd服务已经停止的状态下,卸载主节点的挂载资源为什么会失败?
答:求解答
5.利用drbdadm初始化资源失败的几种原因?
(1)、在已格式化的文件系统上进行drbd初始始化。
[root@zm ~]# drbdadm create-md mpx
md_offset 106921984
al_offset 106889216
bm_offset 106885120
Found ext3 filesystem
104420 kB data area apparently used
104380 kB left usable by current configuration
Device size would be truncated, which
would corrupt data and result in
'access beyond end of device' errors.
You need to either
* use external meta data (recommended)
* shrink that filesystem first
* zero out the device (destroy the filesystem)
Operation refused.
Command 'drbdmeta 0 v08 /dev/sda4 internal create-md' terminated with exit code 40
drbdadm create-md mpx: exited with code 40
参考办法:用dd命令从块层次覆盖掉这些数据。
(2)、drbd.conf文件配置错误
6.文件系统格式化失败
[root@zm ~]# mke2fs -j /dev/drbd0
mke2fs 1.39 (29-May-2006)
mke2fs: Wrong medium type while trying to determine filesystem size
【解决办法】
提示:切换到Primary模式
[root@zm ~]# drbd-overview
0:mpx Connected Secondary/Secondary Inconsistent/Inconsistent C r-----
[root@zm ~]# mke2fs -j /dev/drbd0
mke2fs 1.39 (29-May-2006)
mke2fs: Wrong medium type while trying to determine filesystem size
[root@zm ~]# service drbd stop
Stopping all DRBD resources: .
[root@zm ~]# service drbd start
Starting DRBD resources: [ d(mpx) n(mpx) ].
[root@zm ~]# service drbd stop
Stopping all DRBD resources: .
[root@zm ~]# service drbd start
Starting DRBD resources: [ d(mpx) n(mpx) ]..........
[root@zm ~]# mke2fs -j /dev/drbd0
mke2fs 1.39 (29-May-2006)
mke2fs: Wrong medium type while trying to determine filesystem size
[root@zm ~]# drbd-overview
0:mpx SyncTarget Secondary/Secondary Inconsistent/UpToDate C r-----
[=======>............] sync'ed: 41.8% (477216/812828)K
[root@zm ~]# drbd
drbdadm drbdmeta drbd-overview drbdsetup
[root@zm ~]# drbdsetup /dev/drbd0 primary -o
[root@zm ~]# drbd-overview
0:mpx SyncTarget Primary/Secondary Inconsistent/UpToDate C r-----
[========>...........] sync'ed: 47.8% (428116/812828)K
[root@zm ~]# mke2fs -j /dev/drbd0
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
125696 inodes, 250998 blocks
12549 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=260046848
8 block groups
32768 blocks per group, 32768 fragments per group
15712 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 39 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.