一,drbd简介
DRBD实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他是有内核模块和相关程序而组成,通过网络通信 来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台 主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可 以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的 目的。
在高可用(HA)解决方案中使用DRBD的功能,可以代替使用一个共享盘阵存储设备。因为数据同时存在于本地主机和远程主机上,在遇到需要切换的时候,远程主机只需要使用它上面的那份备份数据,就可以继续提供服务了。
二,安装
<code> 前提: 1)本配置共有两个测试节点,分别node1.feiyu.com和node2.feiyu.com,IP地址分别为192.168.1.111和192.168.1.112; 2)node1和node2两个节点上各提供了一个大小相同的分区作为drbd设备;我们这里为在两个节点上均为/dev/sda5,大小为512M; 3)系统为CentOS 6.5,x86_64平台; </code>
1、准备工作
<code> ssh双机互信; 互相解析; </code>
2、安装软件包
drbd共有两部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果您的内核版本高于此版本的话,你只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。
目前适用CentOS 5的drbd版本主要有8.0、8.2、8.3三个版本,其对应的rpm包的名字分别为drbd, drbd82和drbd83,对应的内核模块的名字分别为kmod-drbd, kmod-drbd82和kmod-drbd83。而适用于CentOS 6的版本为8.4,其对应的rpm包为drbd和drbd-kmdl,但在实际选用时,要切记两点:drbd和drbd-kmdl的版本要对应;另一个是drbd-kmdl的版本要与当前系统的内容版本相对应。各版本的功能和配置等略有差异;我们实验所用的平台为x86_64且系统为CentOS 6.5,因此需要同时安装内核模块和管理工具。我们这里选用最新的8.4的版本(drbd-8.4.3-33.el6.x86_64.rpm和drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm),下载地址为ftp://rpmfind.net/linux/atrpms/,请按照需要下载。
实际使用中,您需要根据自己的系统平台等下载符合您需要的软件包版本,这里不提供各版本的下载地址。
下载完成后直接安装即可:
<code> [root@node1 ~]# rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm </code>
3、配置drbd
drbd的主配置文件为/etc/drbd.conf;为了管理的便捷性,目前通常会将些配置文件分成多个部分,且都保存至/etc/drbd.d/目录中,主配置文件中仅使用”include”指令将这些配置文件片断整合起来。通常,/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件。其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。
在配置文件中,global段仅能出现一次,且如果所有的配置信息都保存至同一个配置文件中而不分开为多个文件的话,global段必须位于配置文件的最开始处。目前global段中可以定义的参数仅有minor-count, dialog-refresh, disable-ip-verification和usage-count。
common段则用于定义被每一个资源默认继承的参数,可以在资源定义中使用的参数都可以在common段中定义。实际应用中,common段并非必须,但建议将多个资源共享的参数定义为common段中的参数以降低配置文件的复杂度。
resource段则用于定义drbd资源,每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。资源在定义时必须为其命名,名字可以由非空白的ASCII字符组成。每一个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从common段或drbd的默认中进行继承而无须定义。
下面的操作在node1.feiyu.com上完成。
1,配置/etc/drbd.d/global-common.conf
<code> [root@node1 drbd.d]# vim global_common.conf #将配置文件做以下修改 global { usage-count no; #改为no # minor-count dialog-refresh disable-ip-verification } common { handlers { # These are EXAMPLE handlers only. # They may have severe implications, # like hard resetting the node under certain circumstances. # Be careful when chosing your poison. #启用下面三个选项 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"; 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"; 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 { on-io-error detach; #磁盘出错时将其拆掉 # size max-bio-bvecs 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 } net { protocol C; cram-hmac-alg "sha1"; #加密算法 shared-secret "node1.feiyu.com"; #使用的秘钥 # 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 } syncer { rate 100M; #传输速率 } } </code>
2、定义一个资源/etc/drbd.d/web.res,内容如下:
<code> [root@node1 drbd.d]# vim web.res resource web { on node1.feiyu.com { device /dev/drbd0; disk /dev/sda5; #需要自行创建sda5分区 address 192.168.1.111:7789; meta-disk internal; #表示使用本地磁盘 } on node2.feiyu.com { device /dev/drbd0; disk /dev/sda5; address 192.168.1.112:7789; meta-disk internal; } } 或者使用以下写法: resource web { device /dev/drbd0; disk /dev/sda5; meta-disk internal; on node1.feiyu.com { address 192.168.1.111:7789; } on node2.feiyu.com { address 192.168.1.112:7789; } } </code>
其他未定义的将从common中同步。
以上文件在两个节点上必须相同,因此,可以基于ssh将刚才配置的文件全部同步至另外一个节点。
<code> [root@node1 drbd.d]# scp /etc/drbd.d/* node2:/etc/drbd.d/ </code>
3、在两个节点上初始化已定义的资源并启动服务。
1)初始化资源,在Node1和Node2上分别执行:
<code> [root@node1 ~]# drbdadm create-md web </code>
2)启动服务,在Node1和Node2上分别执行:
<code> [root@node1 ~]# /etc/init.d/drbd start </code>
3)查看启动状态:
<code> [root@node1 ~]# cat /proc/drbd version: 8.3.8 (api:88/proto:86-94) GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16 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:b oos:505964 </code>
也可以使用drbd-overview命令来查看:
<code> [root@node1 ~]# drbd-overview 0:web Connected Secondary/Secondary Inconsistent/Inconsistent C r---- </code>
从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:
<code> [root@node1 ~]# drbdadm primary --force web </code>
注: 也可以在要设置为Primary的节点上使用如下命令来设置主节点:
<code> [root@node1 ~]# drbdadm --overwrite-data-of-peer primary web </code>
而后再次查看状态,可以发现数据同步过程已经开始:
<code> [root@node1 ~]# drbd-overview 0:web SyncSource Primary/Secondary UpToDate/Inconsistent C r---- [============>.......] sync'ed: 66.2% (172140/505964)K delay_probe: 35 </code>
等数据同步完成以后再次查看状态,可以发现节点已经牌实时状态,且节点已经有了主次:
<code> [root@node1 ~]# drbd-overview 0:web Connected Primary/Secondary UpToDate/UpToDate C r---- </code>
注:Primary/Secondary :第一个代表当前节点的类型
4、创建文件系统
文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
<code> [root@node1 ~]# mke2fs -j -L DRBD /dev/drbd0 或者 mke2fs -t ext4 /dev/drbd0 [root@node1 ~]# mkdir /mnt/drbd [root@node1 ~]# mount /dev/drbd0 /mnt/drbd </code>
5、切换Primary和Secondary节点
对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary。
<code> Node1: [root@node1 ~]# cp -r /etc/drbd.* /mnt/drbd [root@node1 ~]# umount /mnt/drbd #切换前需要先卸载文件系统 [root@node1 ~]# drbdadm secondary web </code>
查看状态:
<code> [root@node1 ~]# drbd-overview 0:web Connected Secondary/Secondary UpToDate/UpToDate C r---- Node2: [root@node2 ~]# drbdadm primary web [root@node2 ~]# drbd-overview 0:web Connected Primary/Secondary UpToDate/UpToDate C r---- [root@node2 ~]# mkdir /mnt/drbd [root@node2 ~]# mount /dev/drbd0 /mnt/drbd </code>
使用下面的命令查看在此前在主节点上复制至此设备的文件是否存在:
<code> [root@node2 ~]# ls /mnt/drbd </code>