DRBD 安装配置 V 0.1
i386
(vmware 下运行)
测试环境:
OS:CentOS 5.4
内核版本:2.6.18-164.el5
(uname -a 查看现运行的内核版本)
内核源码路径:/usr/src/kernels/2.6.18-164.el5-i686/
(现运行内核版本和系统原带内核路径必须一致)
Server01 : 192.168.0.136
Server01 : 192.168.0.137
一.下载源代码,推荐使用源代码。
因为使用 yum 安装时 在安装 kmod-drbd 组件是会升级内核,这会导致无法加载 drbd
模块到内核,(此问题我还没解决)
Yum 安装命令 # yum install drbd kmod-drbd
源码下载地址:http://oss.linbit.com/drbd/
# wget http://oss.linbit.com/drbd/8.2/drbd-8.2.5.tar.gz
# tar xvf drbd-8.2.5.tar.gz
# cd drbd-8.2.5
# make KDIR=/usr/src/kernels/2.6.18-164.el5-i686/
# make install KDIR=/usr/src/kernels/2.6.18-164.el5-i686/
这样就算安装完毕了。
检查一下需要有 drbd 、drbdadm、drbdmeta 、drbdsetup 这四个命令、以及启动脚本:
/etc/init.d/drbd
并保证 drbd 模块已经加载到内核中了
#lsmod | grep drbd
drbd
主配置文件在:/etc/drbd.conf
将 drbd 服务加入到启动项中
193796
3
# chkconfig drbd on
二.配置环境
以上操作在 server01 和 server02 中进行,
2个主机都预留一个空白的分区,不需要创建任何文件系统。
在 server01中
localhost.localdomain localhost
localhost6.localdomain6 localhost6
server01
server02
vim /etc/hosts
127.0.0.1
::1
192.168.0.136
192.168.0.137
并保证 vim /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=server01
在 server02 中
vim /etc/hosts
127.0.0.1
::1
192.168.0.136
192.168.0.137
并保证 vim /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=server02
主配置文件内容:
# vim /etc/drbd.conf
# 是否参加 DRBD 使用者统计.默认是 yes
localhost.localdomain localhost
localhost6.localdomain6 localhost6
server01
server02
global { usage-count yes;}
# 设置主备节点同步时的网络速率最大值,单位是字节.
common { syncer { rate 10M; } }
# 一个 DRBD 设备(即:/dev/drbdX),叫做一个"资源".里面包含一个 DRBD 设备的主备
节点的
# 相关信息.
#
resource r0 {
# 使用协议 C.表示收到远程主机的写入确认后,则认为写入完成.
protocol C;
#startup { wfc-timeout 0; degr-wfc-timeout 120; }
disk { on-io-error detach; }
syncer { rate 10M; }
net {
# 设置主备机之间通信使用的信息算法.
cram-hmac-alg sha1;
shared-secret "FooFunFactory";
}
# 每个主机的说明以"on"开头,后面是主机名.在后面的{}中为这个主机的配置.
on server01{
/dev/drbd1;
/dev/sdc5;
# /dev/drbd1 使用的磁盘分区是/dev/hdb1
device
disk
# 设置 DRBD 的监听端口,用于与另一台主机通信
address
#address
#meta-disk
meta-disk
#flexible-meta-disk internal;
192.168.0.136:7898;
10.0.0.194:7898;
/dev/xvdb5[0];
internal;
}
on server02 {
/dev/drbd1;
device
/dev/sdb5;
disk
192.168.0.137:7898;
address
10.0.0.195:7898;
#address
internal;
meta-disk
#meta-disk
/dev/xvdb5[0];
#flexible-meta-disk internal;
}
}
of=/dev/sdbX bs=1M count=128
准备启动之前,需要分别在 2 个主机上的 空白分区上创建相应的元数据保存的数据块:
常见之前现将两块空白分区彻底清除数据
分别在两个主机上执行
#dd if=/dev/zero
否则下一步会出现
.........
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.
..........
分别在 server01 和 server02 上面执行
#drbdadm create-md r0
确保成功后,接下来就可以启动 drbd 进程了(在 server01和 server02同时启用):
在 server02 中
[root@server01 ~]# /etc/init.d/drbd start
Starting DRBD resources:
[ d(r0) s(r0) n(r0) ].
[root@server01 ~]# ps aux | grep drbd
root
root
root
0.0 0.0
0.0 0.0
0.0 0.0
5777
5780
5790
0
0
0
0 ?
0 ?
0 ?
S
S
S
11:12
11:12
11:12
0:00 [drbd1_worker]
0:00 [drbd1_receiver]
0:00 [drbd1_asender]
[root@server01 ~]# cat /proc/drbd
version: 8.2.5 (api:88/proto:86-88)
GIT-hash: 9faf052fdae5ef0c61b4d03890e2d2eab550610c build by root@server01, 2011-12-02
10:00:19
1: cs:Connected st:Secondary/Secondary ds:Inconsistent/UpToDate C r---
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0
act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0
在 server02 上
[root@server02 /]# /etc/init.d/drbd start
Starting DRBD resources:
[ d(r0) s(r0) n(r0) ].
[root@server02 ~]# ps aux |grep drbd
root
root
root
0.0 0.0
0.0 0.0
0.0 0.0
4465
4466
5284
0
0
0
0 ?
0 ?
0 ?
S
S
S
10:45
10:45
11:12
0:00 [drbd1_worker]
0:00 [drbd1_receiver]
0:00 [drbd1_asender]
[root@server02 ~]# cat /proc/drbd
version: 8.2.5 (api:88/proto:86-88)
GIT-hash: 9faf052fdae5ef0c61b4d03890e2d2eab550610c build by root@server02, 2011-12-02
09:56:19
1: cs:Connected st:Primary/Secondary ds:UpToDate/Inconsistent C r---
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0
act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0
三.启动 server01 为主节点
#drbdadm primary db 这一步可能会报错误
如果保持执行
drbdsetup /dev/drbd1 primary –o
可以看到,第一次设置主节点时用 drbdadm 命令会失败,所以先用 drbdsetup 来做,以后
就可以用 drbdadm 了
成功后,就可以使用
#cat /proc/drbd 查看同步的进度了
[root@server01 ~]# cat /proc/drbd
version: 8.2.5 (api:88/proto:86-88)
GIT-hash: 9faf052fdae5ef0c61b4d03890e2d2eab550610c build by root@server01, 2011-12-02
10:00:19
1: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
ns:1830912 nr:0 dw:0 dr:1830912 al:0 bm:111 lo:0 pe:0 ua:0 ap:0
[======>.............] sync'ed: 35.1% (3326/5114)M
finish: 0:04:43 speed: 11,940 (10,344) K/sec
resync: used:0/31 hits:114320 misses:112 starving:0 dirty:0 changed:112
act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0
同步完毕:
此过程有点慢,(我测试的 512M 内存,intel E2220 vmware 7.14 环境,5G 的磁盘同步了 16
分钟)
同步完毕之后,就可以对空白磁盘格式化了 (注意此操作只对 primary 节点格式化)
[root@server01 ~]# mkfs.ext3 /dev/drbd1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
655360 inodes, 1309232 blocks
65461 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 35 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
然后将格式化好的磁盘挂在到 /drbd 下
测试:
现在演示一下主节点挂掉,然后重新恢复连接的情况,通过以上的设置我们知道
server01(192.168.0.136)为 primary 节点
[root@server01 ~]# ifdown eth0
可以看到,在 primary 节点上找不到 secondary 节点了。再来看看 secondary 节点上的状态:
在 secondary 节点上也找不到 primary 了
现在,让 prmary 节点的网卡启动
还是未连接状态。
在刚才关闭网卡的 primary 节点上执行如下命令:
可以看到主节点已经连接到了 secondary 节点
同样去 secondary 节点 server02上使用 cat 命令查看一下连接情况
查看连接情况可以直接使用
[root@server01 ~]# drbdadm state r0
Primary/Secondary
[root@server01 ~]# drbdadm cstate r0
Connected
[root@server01 ~]# drbdadm dstate r0
UpToDate/UpToDate
同样可以使用常用命令
[root@server01 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.2.5 (api:88/proto:86-88)
GIT-hash: 9faf052fdae5ef0c61b4d03890e2d2eab550610c build by root@server01, 2011-12-02
10:00:19
cs
m:res
1:r0
Connected Primary/Secondary UpToDate/UpToDate C /drbd
fstype
ext3
p mounted
st
ds
如果是 secondary 节点挂掉了,它恢复正常后,想要再次连接 primary 节点的话,考虑到可
能会有数据丢失,可以采用以下方式来连接:
[root@server02 ~]# drbdadm invalidate r0
它告诉 drbd,secondary 节点上的数据可能是不正确的,要以 primary 节点上的为准。这个命
令只能在 secondary 节点上使用,毕竟数据是以 primary 节点为准的,而非 secondry 节点。
不过,如果是 primary 节点挂掉了,这个时候就应该把原来的 secondary 节点提升为 primary
的角色,等原来的 primary 恢复之后,只能先降级成为 secondary 节点了,否则是无法再次
正确连接另一个节点的。
同步结果测试
在 server01 上做如下操作;
[root@server01 home]# cp mysql-5.1.60.tar.gz
[root@server01 home]# ls /drbd/
lost+found mysql-5.1.60.tar.gz
/drbd/
然后,我们把 primary 降级成 secondary,把 secondary 提升成 primary
注意:把 primary 降级前,一定要先 umount 设备才行。
然后提升 secondary:
可以看在 server01 上写入的文件 mysql-5.1.60.tar.gz 已经同步到 server02 上。
测试成功!
切换回到之前的 server01 为 primary server02 为 secondary 操作为:
首先在 server02 上
接着在 server01 上
需要注意的是切换回来后检查一下 drbd 的状态:
四.Dual-primary mode (双主模式)(测试中)
多主模式
To enable dual-primary mode, set the allow-two-primaries option to yes in the net section of your
resource configuration:
resource
net {
allow-two-primaries yes;
}
...
}