DRBD简介
DRBD (Distributed Replicated Block Device) 是 Linux 平台上的分散式储存系统。其中包含了核心模组,数个使用者 空间管理程式及 shell scripts,通常用于高可用性(high availability, HA)丛集。DRBD 类似磁盘阵列的RAID 1(镜像),只不过 RAID 1 是在同一台电脑内,而 DRBD 是透过网络。
DRBD 是以 GPL2 授权散布的自由软件。 --- 此处摘自 wikipedia
规划:
ip 主机名 存储磁盘 drbd设备
172.16.43.1 slave1.king.com /dev/sda3 /dev/drbd0
172.16.43.2 slave2.king.com /dev/sda3 /dev/drbd0
一. 实现基本DRBD功能
以下操作没有特殊说明,皆为双个节点都要操作
i) 主机互信(双节点之间)
|
1
2
3
4
5
6
7
8
9
10
|
# 确保 hostname 与 uname -n 一致hostname slave1.king.com
uname -n
# 确保 /etc/hosts 文件中添加两节点非DNS解析信息172.16.43.1 slave1.king.com172.16.43.2 slave2.king.com# 双机互信ssh-****** -t rsa -P ''
|
ii) drbd配置安装
|
1
2
3
4
|
# 下载drbd rpm包(注意drbd-kmdl版本号前一半与操作系统要相对应)drbd-8.4.3-33.el6.x86_64.rpmdrbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpmrpm -ivh *.rpm |
1 配置/etc/drbd.d/global-common.conf
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
global { usage-count no;
# minor-count dialog-refresh disable-ip-verification
}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 120;
#degr-wfc-timeout 120;
}
disk {
# 当磁盘io异常,将分离当前设备
on-io-error detach;
#fencing resource-only;
}
net {
# 消息验证校验码
cram-hmac-alg "sha1";
shared-secret "9bb9f0ea87ca30cfbc094c7dad12d1ea";
# openssl dgst sha1 install.log 对任意文件进行信息摘要取得交换码
}
syncer {
# drbd设备同步速率
rate 1000M;
}
} |
2. 格式化磁盘
|
1
|
fdisk /dev/sda
|
3、定义一个资源/etc/drbd.d/web.res,内容如下:
|
1
2
3
4
5
6
7
8
9
10
11
|
resource web { device /dev/drbd0;
disk /dev/sda3;
meta-disk internal;
on master1.king.com {
address 172.16.43.1:7789;
}
on master2.king.com {
address 172.16.43.2:7789;
}
} |
4. 同步以上操作或文件,并初始化资源及启动服务
|
1
2
3
4
5
6
7
|
drbdadm create-md webservice drbd start# 此处只能提升一个节点为主资源drbdadm primary --force web# 查看信息等待同步完成drbd-overview#0:web Connected Primary/Secondary UpToDate/UpToDate C r---- |
5. 挂载使用
|
1
2
3
4
5
6
|
mke2fs -j -L DRBD /dev/drbd0 # 仅在一个节点执行
mkdir /mnt/drbd
mount /dev/drbd0 /mnt/drbd
# 如果之前提升二个节点都为主资源时,在这个 /mnt/drbd# 目录下同时读写可能会有IO异常,导致drbd设备失效# 为了解决这个问题则使用 gfs + cman 实现分布式文件锁方案 |
二) gfs集群文件系统(重点)
1. 在 /etc/drbd.d/global-common.conf文件common 中添加
|
1
2
|
# 在配置文件的 net 选项中allow-two-primaries yes;
|
2. 安装 cman 底层消息通讯 + 全局锁功能
|
1
2
3
4
5
6
7
8
9
10
|
ccs_tool create gfsclusterccs_tool addnode -n 1 -v 1 slave1.king.com
ccs_tool addnode -n 2 -v 1 slave2.king.com
# 查看节点ccs_tool lsnode#Cluster name: gfscluster, config_version: 3.#Nodename Votes Nodeid Fencetype#slave1.king.com 1 1#slave2.king.com 1 2 |
3. 启动cman之前禁用 NetworkManager
|
1
2
|
chkconfig NetworkManager offservice cman restart |
4. 准备新磁盘
|
1
2
|
fdisk /dev/sda
partx -a /dev/sda
|
5. 再次启动 drbd 服务
|
1
2
3
4
5
6
7
8
9
10
11
12
|
# 如果之前做过 ii) 步实验的话,请确定弹出的信息drbdadm create-md webservice drbd start## 提升第一节点为主资源[slave1: ~] drbdadm primary --force web## 此处可以提升二个节点为主资源(分别执行)# 请注意请确保一个主已经同步完成# 0:web/0 Connected Primary/Secondary UpToDate/UpToDate C r-----# 再提升一下个为主节点[slave2: ~] drbdadm primary --force web |
6. 格式化gfs2并多处挂载
|
1
2
3
4
5
|
# 将drbd格式化为gfs2 (这一步只需要一个节点操作即可)mkfs.gfs2 -j 2 -p lock_dlm -t gfscluster:gfslocktable /dev/drbd0
## 多处挂载使用mount /dev/drbd0 /gfs
|
iv) 测试
v) 总结
基于drbd的单,双主配置到此为止,有些童鞋会问双主模型用在什么情况下,它的用法恰恰在不需要集群的场景.例如两台httpd服务器做负载均衡,两台httpd都需要
访问一个共享储存,无论那一台httpd服务器都可以上传修改共享存储的数据,这是单主的drbd所不能实现的.当然这里的gfs也可以做集群lvm,在下一篇中我们将继续
本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1400869,如需转载请自行联系原作者