简介
DRBD(Distributed Replication Block Device,分布式复制块设备)是由内核模块和相关脚本构成,用以构建高可用集群;其实现方式是通过网络来镜像整个设备,可以看做是一种网络raid1。
工作要点
1.drbd的数据传输有三种:同步,半同步,异步,为了数据的安全性,最好选择同步协议;
2.drbd资源的工作模型有主从模型和双主模型:
(1).主从模型时2个节点不能使用同一个资源,即主节点能挂载能读能写,而此时从节点不能挂载,也不能读不能写;文件系统为是ext3、ext4、xfs等。
(2).双主模型是2个节点均为主,需要使用共享集群文件系统,如gfs和ocfs;可以实现并发访问。
本文介绍主从模型。
安装配置DRBD
IP | Hostname | 系统 | 内核版本 |
---|---|---|---|
10.10.10.56 | test1.drbd | Centos6.5 | 2.6.32-573.12.1.el6.x86_64 |
10.10.10.57 | test2.drbd | Centos6.5 | 2.6.32-573.12.1.el6.x86_64 |
1.安装epel源
rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
若出现以下错误:
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
编辑/etc/yum.repos.d/epel.repo中[epel]下的baseurl前的#号去掉,mirrorlist前添加#号即可。
2.安装drbd
drbd共有两部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果您的内核版本高于此版本的话,你只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。CentOS 6.5的内核版本是2.6.32-573.12.1.el6.x86_64,因此两部分都要安装。
yum -y install drbd84 kmod-drbd84
3.修改配置文件
DRBD的主配置文件为/etc/drbd.conf;为了管理的便捷性,目前通常会将些配置文件分成多个部分,且都保存至/etc/drbd.d目录中,主配置文件中仅使用”include”指令将这些配置文件片断整合起来。通常,/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件。其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。
编辑/etc/drbd.d/global-common.conf
vim global_common.conf
global {
#是否参加DRBD使用者统计,默认是yes
usage-count no;
# minor-count dialog-refresh disable-ip-verification
# cmd-timeout-short 5; cmd-timeout-medium 121; cmd-timeout-long 600;
}
common {
#使用同步协议
protocol C;
handlers {
# 当承载drbd的物理文件损坏时处理
# echo b > /proc/sysrq-trigger
# 立即重启机器,而且不会将缓冲区同步到硬盘,也不会卸载已挂载的硬盘
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
# 当同步过程中主设备失去联系处理
# echo b > /proc/sysrq-trigger
# 立即重启机器,而且不会将缓冲区同步到硬盘,也不会卸载已挂载的硬盘
pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
# 当同步过程中发生io错误处理
# echo o > /proc/sysrq-trigger
# 关闭系统
local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
# fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
# split-brain "/usr/lib/drbd/notify-split-brain.sh root";
# out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
# before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
# after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
}
startup {
# wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
}
options {
# cpu-mask on-no-data-accessible
}
disk {
# size on-io-error fencing disk-barrier disk-flushes
# disk-drain md-flushes resync-rate resync-after al-extents
# c-plan-ahead c-delay-target c-fill-target c-max-rate
# c-min-rate disk-timeout
# 当磁盘io异常,将分离当前设备
on-io-error detach;
}
net {
# protocol timeout max-epoch-size max-buffers unplug-watermark
# connect-int ping-int sndbuf-size rcvbuf-size ko-count
# allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
# after-sb-1pri after-sb-2pri always-asbp rr-conflict
# ping-timeout data-integrity-alg tcp-cork on-congestion
# congestion-fill congestion-extents csums-alg verify-alg
# use-rle
# 消息验证校验码
cram-hmac-alg "sha1";
# 加密key
shared-secret "drbd";
}
syncer {
# drbd设备同步速率
rate 1000M;
}
}
配置/etc/drbd.d/r0.conf,定义资源
vim r0.res
resource r0 {
on test1.drbd {
device /dev/drbd0;
disk /dev/sdb1;
address 10.10.10.56:7789;
meta-disk internal;
}
on test2.drbd {
device /dev/drbd0;
disk /dev/sdb1;
address 10.10.10.57:7789;
meta-disk internal;
}
}
4.磁盘分区
#将sdb分区为sdb1
fdisk /dev/sdb
将以上配置在test1,test2上同步操作。
5.在test1,test2上初始化资源
#test1
[root@test1 drbd.d]# drbdadm create-md r0
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
#test2
[root@test2 drbd.d]# drbdadm create-md r0
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
若此步报错:
[root@test1 ~]# drbdadm create-md r0
ERROR: modinfo: could not find module drbd
ERROR: modinfo: could not find module drbd
'r0' not defined in your config (for this host).
[root@test1 ~]# modprobe drbd
FATAL: Module drbd not found.
原因:这是两个错误,一个是因为系统默认的内核并不支持此模块,所以需要更新内核yum install kernel*,需要重启;一个是我们的资源文件配置有问题。
第一个错误升级内核并重启后:
[root@test1 ~]# modprobe drbd
[root@test1 ~]# lsmod |grep drbd
drbd 365931 0
libcrc32c 1246 1 drbd
再次初始化资源
[root@test1 drbd.d]# drbdadm create-md r0
'r0' not defined in your config (for this host).
原因:这是由于配置文件导致, resource 配置文件中的 on hostname 一定要和主机名一致,否则 create-md 初始化失败。
解决方法:修改/etc/hostname使hostname和资源文件中的”on hostname”一致即可。
6.启动drbd
#test1
[root@test1 drbd.d]# service drbd start
Starting DRBD resources: [
create res: r0
prepare disk: r0
adjust disk: r0
adjust net: r0
]
#test2
[root@test2 drbd.d]# service drbd start
Starting DRBD resources: [
create res: r0
prepare disk: r0
adjust disk: r0
adjust net: r0
]
7.查看状态
#test1
[root@test1 drbd.d]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R6, 2015-04-09 14:35:00
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:10482024
[root@test1 drbd.d]# drbd-overview
0:r0/0 Connected Secondary/Secondary Inconsistent/Inconsistent
#test2
[root@test2 drbd.d]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R6, 2015-04-09 14:35:00
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:10482024
[root@test1 drbd.d]# drbd-overview
0:r0/0 Connected Secondary/Secondary Inconsistent/Inconsistent
从以上看出此时两个节点均处于Secondary状态。
8.将test1设置为主节点
#test1
[root@test1 drbd.d]# drbdsetup primary /dev/drbd0 --force
[root@test1 drbd.d]# drbd-overview
0:r0/0 SyncSource Primary/Secondary UpToDate/Inconsistent
[>....................] sync'ed: 0.8% (10164/10236)M
#test2
[root@test2 drbd.d]# drbd-overview
0:r0/0 SyncTarget Secondary/Primary Inconsistent/UpToDate
[>...................] sync'ed: 5.7% (9660/10236)M
此时看到test1和test2正在同步数据,待两个都变成UpToDate/UpToDate,表示同步完成。
9.格式化并挂载
[root@test1 drbd.d]# mkfs.ext4 /dev/drbd0
[root@test1 drbd.d]# mkdir -p /drbd
[root@test1 drbd.d]# mount /dev/drbd0 /drbd
注意:此时只有主节点test1上进行挂载,从节点test2不进行挂载
10.往/drbd写入数据
[root@test1 drbd.d]# cd /drbd
[root@test1 drbd]# ls
lost+found
[root@test1 drbd]# dd if=/dev/zero of=hello.txt bs=100M count=10
10+0 records in
10+0 records out
1048576000 bytes (1.0 GB) copied, 3.73007 s, 281 MB/s
[root@test1 drbd]# ls
hello.txt lost+found
11.主从切换
对主从(Primary/Secondary)模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary。
#test1
[root@test1 ~]# umount /drbd
[root@test1 ~]# drbdadm secondary r0
[root@test1 ~]# drbd-overview
0:r0/0 Connected Secondary/Secondary UpToDate/UpToDate
此时test1变为从节点
#test2
[root@test2 drbd.d]# drbdadm primary r0
[root@test2 drbd.d]# drbd-overview
0:r0/0 Connected Primary/Secondary UpToDate/UpToDate
[root@test2 drbd.d]# mkdir -p /drbd
[root@test2 drbd.d]# mount /dev/drbd0 /drbd
[root@test2 drbd.d]# cd /drbd
[root@test2 drbd]# ls
hello.txt lost+found
此时test2变为主节点,并且数据已经同步完毕
总结
1.普通的主从不支持自动切换,需要结合heartbeat等可实现自动切换
2.主从模式下只能有一个主节点进行读写,从节点无法挂载且不能读。