一、什么是
DRBD
?
DRBD
是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。您可以把它看作是一种网络
RAID
。
二、
drbd
的应用范围是什么?除此之外,创建高可用性集群还需要什么?
Drbd
负责接收数据,把数据写到本地磁盘,然后发送给另一个主机。另一个主机再将数据存到自己的磁盘中。其他所需的组件有集群成员服务,如
TurboHA
或
心跳连接,以及一些能在块设备上运行的应用程序。
例如:
--裸
I/O
--文件系统及
fsck
--具有恢复能力的数据库。
[url]www.ixdba.net[/url]
三、它是如何工作的?
每个设备(
drbd
提供了不止一个设备)都有一个状态,可能是
‘
主
’
状态或
‘
辅助
’
状态。在带有主要设备的节点上,应用程序应能运行和访问设备(
/dev/nbX
)。每次写入都会发往本地低层设备和带有
‘
辅助
’
状态设备的节点中。次要设备只能简单地把数据写入它的低层块设备上。
读取数据通常在本地进行。
如果主要节点发生故障,心跳将会把辅助设备转换到主状态,并启动其上的应用程序。(如果您将它和无日志
FS
一起使用,则需要运行
fsck
)。
如果发生故障的节点恢复工作,它就会成为新的辅助节点,而且必须使自己的内容与主节点的内容保持同步。当然,这些操作不会干扰到后台的服务。
四、
drbd
同现在的
HA
集群有什么关系?
大部分现行高可用性集群(如:惠普、康柏等等)使用的是共享存储器,因此存储器连接多个节点(用共享的
SCSI
总线或光纤通道就可以做到)。
Drbd
也可以作为一个共享的设备,但是它并不需要任何不常见的硬件。它在
IP
网络中运行,而且在价格上
IP
网络要比专用的存储网络经济的多。
目前,
drbd
每次只允许对一个节点进行读写访问,这对于通常的故障切换高可用性集群来讲已经足够用了。以后的版本将支持两个节点进行读写存取。
这很有用,比如对
GFS
来讲就是如此。兼容性
Drbd
可以在
ide
、
SCSI
分区和整个驱动器之上运行,但不能在回路模块设备上运行。
(如果您硬要这样做,它就会发生死锁)。
Drbd
也不能在回送网络设备中运行。(因为它同样会发生死锁:所有请求都会被发送设备占用,发送流程也会阻塞在
sock_sendmsg
()中。有时,接收线程正从网络中提取数据块,并试图把它放在高速缓存器中;但系统却要把一些数据块从高速缓存器中取到磁盘中。
这种情况往往会在接收器的环境下发生,因为所有的请求都已经被接收器块占用了。
五、安装
下载软件
最新的稳定版本为<?XML:NAMESPACE PREFIX = ST1 />
0.6.11
,您可从
http
:
//www.drbd.org/releases.html
下载它。
您可以从
CVS
中得到最新的源文件。注意,有时代码不能进行编译。您可以通过
cvs
或命令行界面得到它:
[philipp@alf drbd]$ <?xml:namespace prefix = o />
export CVSROOT= :pserver :anonymous@cvs.drbd.org :/var/lib/cvs/drbd
[philipp@alf drbd]$ cvs login
(
Logging in to [email]anonymous@cvs.drbd.org[/email]
)
CVS password
:
[Press the return key]
[philipp@alf drbd]$ cvs -z9 checkout drbd
要获取当前的开发分支,可以使用如下命令:
[philipp@alf drbd]$ cvs -z9 checkout -r rel-0_7-branch
六、编译包
直接编译即可。只需如下操作:
$ make
$make install
如果您想为
drbd
编译不同版本的内核,您需要定义
KERNVER
(包括路径)同时您也要定义
drbd
的安装路径。
make KERNVER=2.4.22-7 KDIR=/usr/src/linux-2.4.22-7-include
make KERNVER=2.4.22-7 PREFIX=/local/lib/module/path/ install
测试加载
drbd
模块
如果这些都已经创建和安装妥当,您就可以测试加载模块了。
$ /sbin/insmod drbd
如果一切正常,您不会看见任何
ERROR
(错误)信息,用
Ismod
程序可以验证模块是否已被加载。
dev2-98
:
~/rpm/SPECS # lsmod
Module Size Used by Tainted
:
PF
drbd 40140 0
(
unused
)
...
$ dmesg
...
drbd
:
initialised.Version
:
0.6.8
(
api
:
63/proto
:
62
)
如果您看到了
drbd
,就表示一切正常。就可以继续执行
rmmod
,并转到举例配置部分。
$ /sbin/rmmod drbd
问题未解决符号
如果在加载模块时,出现了如下信息:
drbd.o
:
unresolved symbol sock_alloc
drbd.o
:
unresolved symbol proc_register
drbd.o
:
unresolved symbol schedule_timeout
...
这就表示您在内核中编译了
CONFIG_MODVERSIONS
,而
DRBD
模块中没有编译
MODVERSIONS
,或者正好相反。这里给出两种解决方案:
用不带
MODVERSIONS
的系统:
更改您的内核配置,
删掉
CONFIG_MODVERSIONS
选项。(参见
~linux/.config
。)重建内核。
使用带
MODVERSIONS
模块的系统:编辑
~drbd/Makefile.vars
,并将
-DMODVERSIONS -DCONFIG_MODVERSIONS
添加到
KERNFLAGS
,最后重建
DRBD
。
七、命令的使用
drbdsetup
drbsetup
是
drbd
程序套件中的底层配置工具。您可以使用该工具把低层模块设备和
drbd
设备联系起来、安装
drbd
设备对,
以便镜像它们的低层模块设备和检查运行
drbd
设备的配置。
使用
drbdsetup
的例子
假设您的两台机器分别命名为节点
1
(
10.0.0.10
)和节点
2
(
10.0.0.20
),您想在这两台机器上使用
/dev/hdc6
作为它们的低层设备。
那么在节点
2
上,您可以发出以下命令:
$ insmod drbd.o
$ drbdsetup /dev/nb0 disk /dev/hdc6
$ drbdsetup /dev/nb0 net 10.0.0.20 10.0.0.10
B
在节点
1
上,您可以发出以下命令:
$ insmod drbd.o
$ drbdsetup /dev/nb0 disk /dev/hdc6
$ drbdsetup /dev/nb0 net 10.0.0.10 10.0.0.20
B
$ drbdsetup /dev/nb0 primary
此时,您就可以像在其他设备一样使用
/dev/nb0
了。
$ mkfs -b 4096 /dev/nb0
$ mount /dev/nb0 /mnt/mountpoint
上例中使用了
“B”
协议。
drbd
允许您选择所需的协议,以控制如何将数据写入辅助设备。
八、
DRBD
协议
协议说明
A
数据一旦写入磁盘并发送到网络中就认为完成了写入操作。
B
收到接收确认就认为完成了写入操作。
C
收到写入确认就认为完成了写入操作。
您还可以选择其它参数来将数据传输给磁盘和网络选项。更多详情,请参见
drbdsetup
手册页。
九、
Config
和脚本的使用
drbd.conf
和脚本
在上面,我们介绍了
drbdsteup
的使用。
drbd
也允许您直接在
drbd.conf
文件中进行设置。通过正确地设置该文件和使用
init.d/drbd
脚本,
您能够轻松让
drbd
在机器启动后正常运行起来。
drbd.conf
设置举例
在本配置中,两台机器分别命名为
thost1
和
thost2
。
thost1
的
IP
地址是
10.1.1.31
,
thost2
的
IP
地址是
10.1.1.32
。
我们要在
thost1
的
/dev/hda7
和
thost2
的
/dev/hda7
之间创建镜像。下面是一个完成该操作的
/etc/drbd.conf
文件范例:
resource drbd0 {
protocol=B
fsck-cmd=fsck.ext2 -p -y
on thost1 {
device=/dev/nb0
disk=/dev/hda7
address=10.1.1.31
port=7789
}
on thost2 {
device=/dev/nb0
disk=/dev/hda7
address=10.1.1.32
port=7789
}
}
脚本的使用
创建了
drbd.conf
文件之后,在
thost1
上运行如下命令:
$ /etc/rc.d/init.d/drbd start
在
thost2
进行同样的操作,
$ /etc/rc.d/init.d/drbd start
此时,两台设备之间就建立起一个镜像,您可以查看
/proc/drbd
进行核实。
$ cat /proc/drbd
现在您可以在设备上创建一个文件系统,然后把它加载到
thost1
上。
$ mkfs /dev/nb0
$ mount /dev/nb0 /mnt/disk
恭喜您,现在您已经使用
drbd
创建了一个镜像。要进一步创建高可用性的故障切换系统,请查看脚本子目录,并可结合使用
linux-ha.org
上提供的心跳软件
########## FAQ ###########
十、其它问题
1
、超时限制的工作原理是怎样的呢?
主节点在发出数据块之后,会等待另一个节点在某一时间范围内做出响应(该时间范围可以通过
drbdsetup
中的超时限制选项进行设置)。
一旦另一个节点超过该时限仍未做出响应,主节点就会断开连接并尝试着重新再建立一个连接。
2
、为什么超时限制短点好呢?
如果另一个节点停机,主节点会就地等待,阻断所有正在向
DRBD
设备写入数据的应用。这样一来,一直要等到超时限制过后它才会判断出
另一个节点已经停机,而您的应用就会停滞这么长时间。
3
、为什么短的超时限制会导致
timeout/resync/connect
的情况发生呢?
如果次节点的
IO
子系统较慢,就会发生这种情况。
4
、什么是
“
延迟数据包
”
?
为改进这种状况,我产生了
“
延迟期限
”
数据包的设想。当次节点意识到它将超时的时候,它就会发送这种数据包。
5
、如果看到出现了
timeout/resync/connect
情况时,您会怎么办?
延长超时限制。(因为
connect-int
和
pint-int
需要比超时限制更长,所以也要相应地延长它们)
6
、
tl-size
对于
syslog
中出现
“transfer log too small”
(传输日志太小)这样的信息,该采取的措施需要很大篇幅来描述。
7
、
SyncAll
只运行了一半,但我觉得它实在太慢了!
您可以在运行时使用
drbdsetup
工具里的
syncer
子命令来重新配置同步参数。请参见
drbdsetup man page
(手册页)了解更多信息。
十一、一般问题
1
、问:首先,什么是
DRBD
?
DRBD
是
Linux
操作系统的一个分布式远程块设备。它允许您在远程机器上建立一个本地块设备的实时镜像。与心跳连接结合使用,
它可打造出高可用性的
Linux
集群。
2
、问:哪里可以下载
DRBD
?
答:最新版本的
DRBD
可以从
LinBit Information Technologies GmbH
获得。此外,
DRBDD
还包括在许多
Linux
发行版中
例如
DebianGNU/Linux
和其它程序。
3
、问:
DRBD
适用于哪种许可情形?GPL)发行的。因此在这种许可条件下,它可以自由分发和修改。
十二、编译问题
问:在编译drbd_syncer.c 时出现“structure has no member named `nice'”信息,这是为什么?
答:如果您指的是:
drbd_syncer.c:In function `drbd_syncer':
drbd_syncer.c:409:structure has no member named `nice'
drbd_syncer.c:439:structure has no member named `nice'
drbd_syncer.c:452:structure has no member named `nice'
make[1]:*** [drbd_syncer.o] Error 1
make[1]
:
Leaving directory `/usr/local/src/drbd-0.6.3/drbd'
Make*** [all] Error 2
请使用下面的补丁:
--- drbd_syncer.c Wed Oct 16 06
:
19
:
17 2002
+++ drbd_syncer.c.orig Wed Oct 16 06
:
18
:
27 2002
@@ -311,7 +311,7 @@
#define SPEED_MIN
(
mdev-conf.sync_rate_min
)
#define SYNC_MARKS 10
#define SYNC_MARK_STEP
(
3*HZ
)
-#if defined
(
MAX_RT_PRIO
)
|| defined
(
CONFIG_MAX_RT_PRIO
)
+#if 1
/* this should work for the O
(
1
)
scheduler */
#define drbd_set_user_nice
(
current,x
)
set_user_nice
(
current,
(
x
))
#else
十三、安装和设置
1
、问:我能加次级设备吗(至少只读)?
答:
DRBD
对此没有限制,但是您的文件系统会变得非常混乱,因为它无法了解底层设备的变化。总之,没有
ext2
、
ext3
、
reiserFS
、
JFS
或
XFS
,
它不能工作。如果您需要的不只是一个镜像,而是共享文件系统,那您可以使用
GFS
或
OpenGFS
,但它们速度较慢。这也是
DRBD
不允许加载次级
设备的原因。因此如果您要加载次级设备,可以先把次级设置为主设备。同时加载的话,两个设备均不能工作。
2
、问:
DRBD
能使用两个容量大小不同的设备吗?
答:
一般情况下可以,但有些问题需要注意:
本地
DRBD
使用的是配置的磁盘容量,与物理容量相等。如果没有给出,则将被设置为物理容量。连接时,设备容量将设置为两个节点中最小容量。
如果缺少常识的话,您可能会碰到一些问题:如果您先是在一个节点上使用
drbd
,而且没有配置好磁盘容量,之后又连接了一个容量较小的设备。
这时
,drbd
设备容量在运行时就会变小。在系统记录里,您会发现一条信息提示
“your size hint is bogus,please change to some value”
(您的容量信息不真实,请更改)。这样一来就会让设备顶级的文件系统造成混淆。
因此,如果您的设备容量不同,请明确地为
DRBD
设置所使用的容量。
3
、问:
XFS
能和
DRBD
一起使用吗?
答:
XFS
使用动态块大小,因此需要配备
DRBD 0.7
或更高版本。
4
、问:当我试着加载
drbd
模块时,遇到了下面的问题:
compiled for kernel version 2.4.18-4GB while this kernel is version 2.4.18-64GB-SMP.
答:您的实际内核与要在其上构建
drbd
的内核的
.config
不一致。在
SuSE Linux
上,您可以使用下面的命令进行配置:
cd /usr/src/linux/
make cloneconfig
make dep
通常,您不必重新编译内核,只编译
drbd
即可。以后的
DRBD
版本将在创建过程中解决这一问题。
十四、操作问题
1
、问:为什么
drbdsetup /dev/nb0
复制((完全同步))的速度那么慢?
答:出于历史原因,复制需要回写数据。而在回写数据时,很多物理设备的速度都非常慢。在更新的
DRBD
版本中可能会解决这一问题。
2
、问:为什么我的
“load averag”
(平均负载)那么高?
答:平均负载定义为给定的时间间隔内,
runqueue
里的平均进程数。如果进程具有以下特点,它就会被列入
runqueue
中:
--
不是在等待外部事件(如:在某些
fd
上选择)
--
不是在等待它自己的事件(不是受呼
“
等待
”
)
--
未被终止
注:所有等待磁盘
io
的进程都会包括在内。所以,虽然系统实际可能近乎是空闲的,但如果有很多进程在等待磁盘
io, “load average”
就会很高。
例:关闭
nfs
服务器,启动
100
ls /path/to/noncached/dir/on/nfs/mount-point
在客户机上,虽然
CPU
什么也没做,只要
nfs
超时(可能是几个星期),您还是会得到一个
100+
的
“load average”
。
您可以通过其他方式(例如
vmstat, sysstat/sar
)来检测您的系统负载,这样可帮您找出系统的瓶颈所在。或者您还可以使用多个磁盘(不只是分区!)
或配备
10.000rpm SCSI
磁盘的
RAID
,甚至是千兆以太网。即使在快速以太网设备中,您也很少会超过每秒
6Mbyte
。
.
((
100 MBit/s
除去协议开销等最多
可剩下
12.5MByte/s
)
3
、问:
warning
:
Return code 255 from
/etc/ha.d/resource.d/datadisk
在使用带心跳的数据磁盘脚本时出现这些信息说明了什么?
答:退出码
255
很可能产生于导致死机的脚本,它有一个详细的错误信息。捕获脚本输出,这是
ha.cf
中的
debugfile
指令
iirc
。
.
如果仍没有用,
您可以手动操作,并查看所给出的错误信息。
4
、数据磁盘会提示如
“cannot promote to primary, synchronization running”
或
“fsck failed”
等等。
问:当节点从次级站点上升到主站点时,
drbd
设备就不能加载到主站点
上了,但可以进行手动加载。
.
答:
DRBD
不会自动加载分区,脚本数据磁盘就是用来做这项工作的。
5
、问:当心跳在节点
1
上启动并试着运行数据磁盘脚本以成为
RAID
阵列中的主节点时,出现故障,原因是它仍在同步。
答:
在
ha.cf
中启用
“nice_failback on“
,或者您还可以阻断
drbd init
脚本块直到全部同步完成,请参见
drbd.conf.A
。
6
、问:像
st
、
ns
、
nr
、
dw
、
dr
等字段在
/proc/drdb
中有什么含义?
答:
表
4. /proc/drbd
Field
说明
值:
cs
连接状态
出现的值:
o Unconfigured
:设备在等待配置。
o Unconnected
:连接模块时的过渡状态。
o WFConnection
:设备等待另一测的配置。
o WFReportParams
:过渡状态,等待新
TCP
连接的第一个数据包时。
.
o SyncingAll
:正将主节点的所有模块复制到次级节点上。
.
o SyncingQuick
:通过复制已被更新的模块(因为现在次级节点已经离开了集群)来更新次级节点。
o Connected
:一切正常。
o Timeout
:过渡状态。
st
状态(设备的作用)
可能的值为:
o
本地
/
远程一级状态
o
二级状态
o
未知(这不是一种作用)
ns
网络发送
模块号码
nr
网络接收
模块号码
dw
磁盘写入
模块号码
DR
磁盘读取
模块号码
of
运行中(过时的)模块号码
pe
待解决的
模块号码
ua
未答复的
模块号码(最好为
0
)
答:
DRBD
是依照
General Public License Version 2 vom Juni 1991
转载于:https://blog.51cto.com/comtv/139724