DRBD(Distributed Replocated Blocak Device)分布式的复制块设备
在内核为2.6.33之后的版本中,DRBD就被编译进内核了,所以DRBD是在内核中工作的
软件下载地址:drbd83-8.3.2-6.el5_3.i386.rpm http://ftp.sjtu.edu.cn/centos/5.4/extras/i386/RPMS/
kmod-drbd83-8.3.2-6.el5_3.i686.rpm
drbd83-8.3.8-1.el5.centos.i386.rpm http://mirror.centos.org/centos/5/extras/i386/RPMS/
下面我们就看看DRBD的工作流程图:
当启用drbd功能,并将drbd设备挂载到本地之后,用户空间需要向磁盘上存数据的时候,当数据通过缓存时,drbd就将这些数据分成了两路,一路存储到本地的磁盘上,另一路通过本地的TCP/IP协议栈和网络将数据传输到另个开启drbd服务主机上,这个drbd主机接收数据并将数据存储到本地的drbd设备上,从而实现了数据的共享和同步,然而整个数据的同步过程都是在内核空间中进行的,所以对用户空间没有任何 影响
drbd共有两部分组成:内核模块和用户空间的管理工具
用户空间的管理工具:对内核中数据传输和共享的具体实施过程进行行为定义
内核模块:依用户空间的管理工具的定义的方式来进行数据的传输和共享
Drbd的模型两种:
单主节点:任何资源只能在主节点上进行读写操作,主节点的文件类型可以是任何的,只要是为高可用集群中的资源流转提供一个解决方案。
双主节点:在任何时刻任意用户可以通过任意节点来进行读写操作,但是要结合集群文件系统来实现,所以要通过GFS或者OCFS2来实现其应用,只有在drbd的8.0版本之后才支持
下面我们就通过具体的配置过程来了解drbd各个部分的工作原理
配置前提:
1)本配置共有两个测试节点,分别node1.a.org和node2.a.org,相的IP地址分别为192.168.0.202和192.168.0.204;
2)node1和node2两个节点上各提供了一个大小相同的分区作为drbd设备;我们这里为在两个节点上均为/dev/sda5,大小为1G;
1、准备工作
保证两个节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致;因此,需要保证两个节点上的/etc/hosts文件均为下面的内容:
192.168.0.202 node1.a.org node1
192.168.0.204 node2.a.org node2
为了使得重新启动系统后仍能保持如上的主机名称,还分别需要在各节点执行类似如下的命令:
node1:
sed -i 's@\(HOSTNAME=\).*@\1node1.a.org@g'
hostname node1.a.org
node2:
sed -i 's@\(HOSTNAME=\).*@\1node2.a.org@g'
hostname node2.a.org
2、安装软件包
drbd共有两部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果您的内核版本高于此版本的话,你只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。
我们这里选用最新的8.3的版本
下载完成后直接安装即可:
yum -y --nogpgcheck localinstall drbd83-8.3.8-1.el5.centos.i386.rpm kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
3、配置drbd
1)复制样例配置文件为即将使用的配置文件:
cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc
2)配置/etc/drbd.d/global_common.conf
global {
usage-count no;
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C;
handlers {
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 120;
degr-wfc-timeout 120;
}
disk {
on-io-error detach;
fencing resource-only;
}
net {
cram-hmac-alg "sha1";
shared-secret "mydrbdlab";
}
syncer {
rate 100M;
}
}
3、定义一个资源/etc/drbd.d/web.res,内容如下:
- resource web { ##资源名web在下面启动时会用到
- on node1.a.org {
- device /dev/drbd0; ##定义drbd设备号
- disk /dev/sda5; ## 定义drbd设备所使用的磁盘
- address 192.168.0.202:7789; ##此drbd设备监听的网络地址和端口
- meta-disk internal;
- }
- on node2.a.org {
- device /dev/drbd0;
- disk /dev/sda5;
- address 192.168.0.204:7789;
- meta-disk internal;
- }
- }
将这两个配置文件拷贝到node2上,以保证配置文件相同
- cd /etc/drbd.d
- scp web.res global_common.conf node2:/etc/drbd.d
- scp /etc/drbd.conf node2:/etc/
4、在两个节点上初始化已定义的资源并启动服务:
1)初始化资源,在Node1和Node2上分别执行:
- drbdadm create-md web (资源名web /etc/drbd.d/web.res文件有定义 )
2)启动服务,在Node1和Node2上分别执行:
- /etc/init.d/drbd start
3)查看启动状态:
- cat /proc/drbd
也可以使用drbd-overview命令来查看:
- drbd-overview
从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将node1设置为Primary,在node1上执行如下命令:
drbdsetup /dev/drbd0 primary –o
注: 也可以在要设置为Primary的节点上使用如下命令来设置主节点:
drbdadm -- --overwrite-data-of-peer primary web 这种方法更加标准
(注:这两个设置primary节点的命令只在第一次使用,以后就可以直接使用drbdadm primary web)
而后再次查看状态,可以发现数据同步过程已经开始:
- drbd-overview
此时我们还可以使用如下命令动态的查看同步过程
watch -n 1 'drbd-overview'
当数据同步完成以后再次查看状态
- drbd-overview
可以发现节点已经为实时状态,且节点已经有了主次:
5、创建文件系统
因为文件系统的挂载只能在Primary节点进行,所以只有在设置了主节点后才能对drbd设备进行格式化:
- mke2fs -j /dev/drbd0
- mkdir /drbd
- mount /dev/drbd0 /drbd
6、切换Primary和Secondary节点
对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary:
我们先在drbd设备上存储个网页文件,而后在主从节点改变后查看node1的index.html文件是否复制到node2上
node1:
echo node1 > /drbd/index.html
为了进行验证而设置的文件
首先卸载drbd设备
- umount /drbd
将其设定为从节点
- drbdadm secondary web
查看状态:
将node2设为primary
- drbdadm primary web
查看状态:
drbd-overview
状态显示node2已经成为从节点
挂载drbd设备
- mkdir /drbd
- mount /dev/drbd0 /mnt/drbd
查看文件是否存在
Linux高可用集群(二):DRBD分布式复制块设备简介和使用
DRBD简介:
DRBD全称Distributed Replicated Block (分布式的复制块设备),属于Device公司,但是完全开源。它是一款基于块设备的文件复制解决方案,速度比文件级别的软件如NFS,samba快很多,是很多中小企业的共享存储首选解决方案。
DRBD工作需要在两个节点上同时准备一块一模一样的分区组成镜像,这就是为什么它叫做分布式复制块设备,它主要通过复制数据来实现文件同步(备份),主要用于集群文件共享, 我们通过它的工作原理来了解块复制和文件复制的不同,如下图:
首先,您需要知道,DRBD是工作在系统内核空间,而不是用户空间,它直接复制的是二进制数据,这是它速度快的根本原因。
其次,DRBD至少需要两个节点来工作,一主一次。
DRBD的文件同步过程和普通复制过程的不同:
DRBD在数据进入Buffer Cache时,先经过DRBD这一层,复制一份数据经过TCP/IP协议封装,发送到另一个节点上,另一个节点通过TCP/IP协议来接受复制过来的数据,同步到次节点的DRBD设备上。
下面我们来配置DRBD,前提:
1)主机名称和uname -n 命令输出的一致,最好是FQDN格式
2)DRBD的两个分区大小一致,先不要格式化
3)两个节点上准备都准备一个2G的分区/dev/sda5
准备两台虚拟机 ,我使用的是vm6.5+redhat5.4 ,主机名称和IP地址如下
node1.a.org 172.16.14.11
node2.a.org 172.16.14.12
一.安装,修改配置文件
1)安装drbd软件包,需要的软件包如下:
[root@node1 ~]# ls drbd/
drbd83-8.3.8-1.el5.centos.i386.rpm kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
# 使用rpm -i安装,这两个软件包并没有什么依赖关系
[root@node1 drbd]# rpm -ivh *.rpm
[root@node2 drbd]# rpm -ivh *.rpm
2)复制配置文件到/etc下
[root@node2 drbd]# cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc/
cp: overwrite `/etc/drbd.conf'? Y # 直接覆盖,原文件没有任何内容
[root@node2 drbd]# cat /etc/drbd.conf
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example
# 配置文件里只有下面两行,告诉我们定义在drbd.d下面定义.res结尾的文件为drbd的资源
include "drbd.d/global_common.conf"; # 真正的主配置文件
include "drbd.d/*.res";
# 修改 global_common.conf ,内容如下
- [root@node2 drbd]# vim /etc/drbd.d/global_common.conf
- global {
- usage-count no;
- }
- common {
- protocol C; # C 指同步 A 异步 B 半同步
- handlers {
- 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";
- }
- startup {
- wfc-timeout 120;
- degr-wfc-timeout 120;
- }
- disk {
- on-io-error detach;
- fencing resource-only;
- }
- net {
- cram-hmac-alg "sha1";
- shared-secret "mydrbdlab";
- }
- syncer {
- rate 100M; # 你网卡的速率
- }
- }
3)定义一个资源web,用来存放网页文件,给集群提供文件服务
- resource web {
- on node1.a.org { # 注意主机名
- device /dev/drbd0;
- disk /dev/sda5; # 分区
- address 172.16.14.11:7789; # 注意IP
- meta-disk internal;
- }
- on node2.a.org { # 注意主机名
- device /dev/drbd0;
- disk /dev/sda5; # 分区
- address 172.16.14.12:7789; # 注意IP
- meta-disk internal;
- }
- }
4)将配置文件复制到node1上
[root@node2 drbd]# scp /etc/drbd.conf node1:/etc/
[root@node2 drbd]# scp /etc/drbd.d/* node1:/etc/drbd.d/
二.初始化已经以的资源,启动drbd服务
1)初始化资源
[root@node1 drbd]# drbdadm create-md web
[root@node2 drbd]# drbdadm create-md web
2)启动服务,这里需要说明,当一个节点启动服务后,如果另一个节点不启动,它会一直卡在那处于等待状态。
[root@node1 drbd]# service drbd start
[root@node2 drbd]# service drbd start
3)查看同步状态
[root@node1 drbd]# watch -n 1 'cat /proc/drbd'
也可以通过下面的命令来查看
[root@node1 drbd]# drbd-overview
0:web Connected Secondary/Secondary Inconsistent/Inconsistent C r----
三.设置node1为主节点,开始数据同步
1)设置主节点
[root@node1 drbd]# drbdsetup /dev/drbd0 primary -o
或者drbdadm -- --overwrite-data-of-peer primary web
查看节点信息状态,已经成为primiary了,中间有一个数据同步过程
[root@node1 drbd]# drbd-overview
0:web Connected Primary/Secondary UpToDate/UpToDate C r----
2)创建文件系统,挂载之
[root@node1 drbd]# mke2fs -j -L DRBD /dev/drbd0
[root@node1 drbd]# mkdir /mnt/drbd
[root@node1 drbd]# mount /dev/drbd0 /mnt/drbd/
创建几个空文件
[root@node1 drbd]# cd /mnt/drbd/
[root@node1 drbd]# touch a b c
四.切换主节点
# 先卸载,将node1改为次节点
[root@node1 ~]# umount /mnt/drbd/
[root@node1 ~]# drbdadm secondary web
# 在node2上设置为主节点
[root@node2 ~]# mkdir /mnt/drbd # 穿件挂载点
[root@node2 ~]# drbdadm primary web
[root@node2 ~]# drbd-overview
0:web Connected Secondary/Primary UpToDate/UpToDate C r----
[root@node2 ~]# drbdadm primary web
查看刚才创建的文件是否存在
[root@node2 ~]# mount /dev/drbd0 /mnt/drbd/
[root@node2 ~]# ls /mnt/drbd/
a b c lost+found
DRBD软件的配置(drbd.conf)
一、配置简介
DRBD运行时,会读取一个配置文件/etc/drbd.conf.这个文件里描述了DRBD设备与硬盘分区的映射关系
1、全局配置项(global)
基本上我们可以做的也就是配置usage-count是yes还是no了,usage-count参数其实只是为了让linbit公司收集目前drbd的使用情况。当drbd在安装和升级的时候会通过http协议发送信息到linbit公司的服务器上面
2、公共配置项(common)
这里的common,指的是drbd所管理的多个资源之间的common。配置项里面主要是配置drbd的所有resource可以设置为相同的参数项,比如protocol,syncer等等
3、资源配置项(resource)
resource项中配置的是drbd所管理的所有资源,包括节点的ip信息,底层存储设备名称,设备大小,meta信息存放方式,drbd对外提供的设 备名等等。每一个resource中都需要配置在每一个节点的信息,而不是单独本节点的信息。实际上,在drbd的整个集群中,每一个节点上面的 drbd.conf文件需要是完全一致的
4、另外,resource还有很多其他的内部配置项:
(1)net:网络配置相关的内容,可以设置是否允许双主节点(allow-two-primaries)等。
(2)startup:启动时候的相关设置,比如设置启动后谁作为primary(或者两者都是primary:become-primary-on both)
(3)syncer:同步相关的设置。
可以设置“重新”同步(re-synchronization)速度(rate)设置,也可以设置是否在线校验节点之间的 数据一致性(verify-alg 检测算法有md5,sha1以及crc32等)。数据校验可能是一个比较重要的事情,在打开在线校验功能后,我们可以通过相关命令(drbdadm verify resource_name)来启动在线校验。在校验过程中,drbd会记录下节点之间不一致的block,但是不会阻塞任何行为,即使是在该不一致的 block上面的io请求。当不一致的block发生后,drbd就需要有re-synchronization动作,而syncer里面设置的rate 项,主要就是用于re-synchronization的时候,因为如果有大量不一致的数据的时候,我们不可能将所有带宽都分配给drbd做re- synchronization,这样会影响对外提提供服务。rate的设置和还需要考虑IO能力的影响。如果我们会有一个千兆网络出口,但是我们的磁盘 IO能力每秒只有50M,那么实际的处理能力就只有50M,一般来说,设置网络IO能力和磁盘IO能力中最小者的30%的带宽给re- synchronization是比较合适的(官方说明)。另外,drbd还提供了一个临时的rate更改命令,可以临时性的更改syncer的rate 值:drbdsetup /dev/drbd0 syncer -r 100M。这样就临时的设置了re-synchronization的速度为100M。不过在re-synchronization结束之后,你需要通过 drbdadm adjust resource_name 来让drbd按照配置中的rate来工作
=======================================================================================================================================
二、资源管理
1、增加resource的大小
当遇到我们的drbd resource设备容量不够的时候,而且我们的底层设备支持在线增大容量的时候(比如使用lvm的情况下),我们可以先增大底层设备的大小,然后再通过drbdadm resize resource_name来实现对resource的扩容。但是这里有一点需要注意的就是只有在单primary模式下可以这样做,而且需要先在所有节点上都增大底层设备的容量。然后仅在primary节点上执行resize命令。在执行了resize命令后,将触发一次当前primary节点到其他所有secondary节点的re-synchronization
如果我们在drbd非工作状态下对底层设备进行了扩容,然后再启动drbd,将不需要执行resize命令(当然前提是在配置文件中没有对disk参数项指定大小),drbd自己会知道已经增大了容量
在进行底层设备的增容操作的时候千万不要修改到原设备上面的数据,尤其是drbd的meta信息,否则有可能毁掉所有数据
2、收缩resource容量
容量收缩比扩容操作要危险得多,因为该操作更容易造成数据丢失。在收缩resource的容量之前,必须先收缩drbd设备之上的容量,也就是文件系统的大小。如果上层文件系统不支持收缩,那么resource也没办法收缩容量。
如果在配置drbd的时候将meta信息配置成internal的,那么在进行容量收缩的时候,千万别只计算自身数据所需要的空间大小,还要将drbd的meta信息所需要的空间大小加上。
当文件系统收缩好以后,就可以在线通过以下命令来重设resource的大小: drbdadm --size=***G resize resource_name。在收缩的resource的大小之后,你就可以自行收缩释放底层设备空间(如果支持的话)
如果打算停机状态下收缩容量,可以通过以下步骤进行:
(1)在线收缩文件系统
(2)停用drbd的resource:drbdadm down resourcec_name
(3)导出drbd的metadata信息(在所有节点都需要进行):drbdadm dump-md resource_name > /path_you_want_to_save/file_name
(4)在所有节点收缩底层设备
(5)更改上面dump出来的meta信息的la-size-sect项到收缩后的大小(是换算成sector的数量后的数值)
(6)如果使用的是internal来配置meta-data信息,则需要重新创建meta-data:drbdadm create-md resource_name
(7)将之前导出并修改好的meta信息重新导入drbd(摘录自linbit官方网站的一段导入代码): drbdmeta_cmd=$(drbdadm -d dump-md test-disk)
${drbdmeta_cmd/dump-md/restore-md} /path_you_want_to_save/file_name
(8)启动resource:drbdadm up resource_name
=======================================================================================================================================
三、磁盘损坏
1、detach resource(分离资源)
如果在resource的disk配置项中配置了on_io_error为pass_on的话,那么drbd在遇到磁盘损坏后不会自己detach底层设备。也就是说需要我们手动执行detach的命令(drbdadm detach resource_name),然后再查看当前各节点的ds信息。可以通过cat /proc/drbd来查看,也可以通过专有命令来查看:drbdadm dstat resource_name。当发现损坏的那方已经是Diskless后,即可。如果我们没有配置on_io_error或者配置成detach的话,那 么上面的操作将会由自动进行。
另外,如果磁盘损坏的节点是当前主节点,那么我们需要进行节点切换的操作后再进行上面的操作
2、更换磁盘
当detach了resource之后,就是更换磁盘了。如果我们使用的是internal的meta-data,那么在换好磁盘后,只需要重新创建 mata-data (drbdadm create-md resource_name),再将resource attach上 (drbdadm attach resource_name),然后drbd就会马上开始从当前primary节点到本节点的re-synchronisation。数据同步的实时状况 可以通过 /proc/drbd文件的内容获得
不过,如果我们使用的不是internal的meta-data保存方式,也就是说我们的meta-data是保存在resource之外的地方的。那么 我们在完成上面的操作(重建meta-data)之后,还需要进行一项操作来触发re-synchnorisation,所需命令为:drbdadm invalidate resource_name
3、节点crash(或计划内维护)
(1)secondary节点
如果是secondary接待你crash,那么primary将临时性的与secondary断开连接,cs状态应该会变成WFConnection, 也就是等待连接的状态。这时候primary会继续对外提供服务,并在meta-data里面记录下从失去secondary连接后所有变化过的 block的信息。当secondary重新启动并连接上primary后,primary –> secondary的re-synchnorisation会自动开始。不过在re-synchnorisation过程中,primary和 secondary的数据是不一致状态的。也就是说,如果这个时候primary节点也crash了的话,secondary是没办法切换成 primary的。也就是说,如果没有其他备份的话,将丢失所有数据
(2)primary节点
一般情况下,primary的crash和secondary的crash所带来的影响对drbd来说基本上是差不多的。唯一的区别就是需要多操作一步将 secondary节点switch成primary节点先对外提供服务。这个switch的过程drbd自己是不会完成的,需要我们人为干预进行一些操作才能完成。当crash的原primary节点修复并重新启动连接到现在的primary后,会以secondary存在,并开始re-synchnorisation这段时间变化的数据
在primary节点crash的情况下,drbd可以保证同步到原secondary的数据的一致性,这样就避免了当primary节点crash之 后,secondary因为数据的不一致性而无法wcitch成primary或者即使切换成primary后因为不一致的数据无法提供正常的服务的问题
4、节点永久性损坏(需要更换机器或重新安装相关软件的情况)
当某一个节点因为硬件(或软件)的问题,导致某一节点已经无法再轻易修复并提供服务,也就是说我们所面对的是需要更换主机(或从OS层开始重新安装)的问 题。在遇到这样的问题后,我们所需要做的是重新提供一台和原节点差不多的机器,重新开始安装os,安装相关软件,从现有整提供服务的节点上copy出 drbd的配置文件(/etc/drbd.conf),创建meta-data信息,然后启动drbd服务,以一个secondary的身份连接到现有的 primary上面,后面就会自动开始re-synchnorisation
5、split brain的处理
split brain实际上是指在某种情况下,造成drbd的两个节点断开了连接,都以primary的身份来运行。当drbd某primary节点连接对方节点准 备发送信息的时候如果发现对方也是primary状态,那么会会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:“Split-Brain detected,dropping connection!”当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是WFConnection的状态
如果我们在配置文件中配置了自动解决split brain(好像linbit不推荐这样做),drbd会自行解决split brain问题,具体解决策略是根据配置中的设置来进行的
如果没有配置split brain自动解决方案,我们可以手动解决。首先我们必须要确定哪一边应该作为解决问题后的primary,一旦确定好这一点,那么我们同时也就确定接受 丢失在split brain之后另外一个节点上面所做的所有数据变更了。当这些确定下来后,我们就可以通过以下操作来恢复了:
(1)首先在确定要作为secondary的节点上面切换成secondary并放弃该资源的数据:
drbdadm secondary resource_name
drbdadm — –discard-my-data connect resource_name
(2)在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略)
drbdadm connect resource_name
当作完这些动作之后,从新的primary到secondary的re-synchnorisation会自动开始
=======================================================================================================================================
四、meta data存放地点的比较
1、internal meta-data(meta-data和数据存放在同一个底层设备之上)
(1)优点:一旦meta-data创建之后,就和实际数据绑在了一起,在维护上会更简单方便,不用担心meta-data会因为某些操作而丢失。另外在硬盘损 坏丢失数据的同时,meta-data也跟着一起丢失,当更换硬盘之后,只需要执行重建meta-data的命令即可,丢失的数据会很容易的从其他节点同 步过来
(2)缺点:如果底层设备是单一的磁盘,没有做raid,也不是lvm等,那么可能会造成性能影响。因为每一次写io都需要更新meta-data里面的信息, 那么每次写io都会有两次,而且肯定会有磁头的较大寻道移动,因为meta-data都是记录在dice设备的最末端的,这样就会造成写io的性能降低。
2、external meta data(meta-data存放在独立的,与存放数据的设备分开的设备之上)
(1)优点:与internal meta-data的缺点完全相对,可以解决写io的争用问题
(2)缺点:由于meta-data存放在与数据设备分开的地方,就意味着当磁盘损坏更换磁盘之后,必须手动发起全量同步的操作。也就是管理维护会稍微麻烦那么一点点,很小的一点点
如果我们希望在已经存在数据的设备上面建立drbd的资源,并且不希望丢失该设备上面的数据,又没办法增大底层设备的容量,而且上层文件系统又没办法收缩的话,我们就只能将meta data创建成external方式
DRBD总结
关于DRBD的总结:
完成一个DRBD,需要执行以下步骤:
a、安装
b、配置资源文件(定义资料名称,磁盘,节点信息,同步限制等)
c、将drbd加入到系统服务chkconfig --add drbd
d、初始化资源组drbdadm create-md resource_name
e、启动服务 service drbd start
f、设置primary主机,并同步数据
#drbdadm adjust resource_name
#drbdsetup /dev/drbd1 primary -o 或 drbdadm primary resource_name
g、分区、格式化/dev/drbd1
h、一个节点进行挂载。
完成确认:
a、cat /proc/drbd
b、drbdadm role resource_name
1、安装
./configure --prefix=/usr/local/drbd --with-km (开启内核模块)
2、配置:直接创建*.res资源文件,默认是在/etc/drbd.d/里。drbd启动时会自动读取*.res文件。
3、*.res的格式:(例子)
resource fs {
protocol C;
startup {
degr-wfc-timeout 120; #启动时,连接资源超时的时间。
}
disk {
on-io-error detach; #磁盘有错误时不连接
}
net {
}
syncer {
rate 10M; #同步的速率
al-extents 257;
}
on drbd1.localdomain{
device /dev/drbd1; #创建的设备名称
disk /dev/sdb1; #使用的磁盘名称
address 192.168.10.209:7788; #连接地址
meta-disk internal; #meta-data和数据存放在同一个底层
}
on drbd2.localdomain {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.10.210:7788;
meta-disk internal;
}
}
4、DRBD服务启动时,要求节点的服务都要起来,因为节点间要同步,否则单节点的服务是起不来的。
默认情况下,各节点启动时,都处于secondary,需要手工将其设置成primary.才能正常被挂载工作!
5、/dev/drbd1只能同时被一个节点挂载,如果同时挂载会报错。
6、相关的命令:
drbdadm role resource 查看节点的角色
例:
# drbdadm role resource_name
Secondary/Primary
cat /proc/drbd 查看drbd的相关信息,如同步状态!
# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
GIT-hash: 0de839cee13a4160eed6037c4bddd066645e23c5 build by
[email protected], 2011-07-08
11:10:20
1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:32 dw:32 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
cs:连接状态!可能出现的有Connected,WFC,Stanalone,SyncSource
ro:角色! 正常会出现主辅,不正常的会现unkown.
ds:同步更新的状态! 正常的话是UpToDate/UpToDate,正在更新UpToDate/Inconsistent
ns :network send
nr :network receive
dr :disk read
pe :pending(waiting forack)
ps -auxf | grep drbd
每个drbd设备有三个进程,drbd1_worker 主进程,drbd1_asender是primary上drbd1的数据发送进程。
同理,drbd1_receiver 是secondary是drbd的数据接收进程。
drbd secondary resource_name 降级
drbd primary resource_name 升级
一次DRBD脑裂行为的模拟
drbd1为主,drbd2为辅;我个人觉得这个DRBD脑裂的行为,也应该是前期人为或是故障切换造成的,
如HA。 上次跟一朋友去一客户那里,他那就是属于使用HA做故障切换,最后不知道他们咋搞,在一台
机上把DRBD的服务给挂了,因为该服务器非常重要,他们对HA及DRBD架构不太熟,在一次HA切换测
试过程中出现了问题,在此模拟一下这个问题吧。
1、断开primary
down机或是断开网线
2、查看secondary机器的状态
[root@drbd2 ~]# drbdadm role fs
Secondary/Unknown
[root@drbd2 ~]# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
GIT-hash: 0de839cee13a4160eed6037c4bddd066645e23c5 build by [email protected], 2011-07-08 11:10:20
#注意下drbd2的cs状态
1: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r-----
ns:567256 nr:20435468 dw:21002724 dr:169 al:229 bm:1248 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
将secondary配置成primary角色
[root@drbd2 ~]# drbdadm primary fs
[root@drbd2 ~]# drbdadm role fs
Primary/Unknown
[root@drbd2 ~]# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
GIT-hash: 0de839cee13a4160eed6037c4bddd066645e23c5 build by [email protected], 2011-07-08 11:10:20
1: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
ns:567256 nr:20435468 dw:21002724 dr:169 al:229 bm:1248 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
#挂载
[root@drbd2 ~]# mount /dev/drbd1 /mnt/
[root@drbd2 ~]# cd /mnt/
[root@drbd2 mnt]# ll
total 102524
-rw-r--r-- 1 root root 104857600 Jul 8 12:35 100M
drwx------ 2 root root 16384 Jul 8 12:33 lost+found
#原来的primary机器好了,出现
脑裂了
。
[root@drbd1 ~]# tail -f /var/log/messages
Jul 8 13:14:01 localhost kernel: block drbd1: helper command: /sbin/drbdadm initial-split-brain minor-1 exit code 0 (0x0)
Jul 8 13:14:01 localhost kernel: block drbd1: Split-Brain detected but unresolved, dropping connection!
Jul 8 13:14:01 localhost kernel: block drbd1: helper command: /sbin/drbdadm split-brain minor-1
Jul 8 13:14:01 localhost kernel: block drbd1: helper command: /sbin/drbdadm split-brain minor-1 exit code 0 (0x0)
Jul 8 13:14:01 localhost kernel: block drbd1: conn( NetworkFailure -> Disconnecting )
Jul 8 13:14:01 localhost kernel: block drbd1: error receiving ReportState, l: 4!
Jul 8 13:14:01 localhost kernel: block drbd1: Connection closed
Jul 8 13:14:01 localhost kernel: block drbd1: conn( Disconnecting -> StandAlone )
Jul 8 13:14:01 localhost kernel: block drbd1: receiver terminated
Jul 8 13:14:01 localhost kernel: block drbd1: Terminating receiver thread
[root@drbd1 ~]# drbdadm role fs
Primary/Unknown
[root@drbd2 mnt]# drbdadm role fs
Primary/Unknown
#drbd1现在是standalone,这个时候,主跟辅是不会相互联系的。
[root@drbd1 ~]# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
GIT-hash: 0de839cee13a4160eed6037c4bddd066645e23c5 build by [email protected], 2011-07-08 11:10:38
1: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown r-----
ns:20405516 nr:567256 dw:567376 dr:20405706 al:2 bm:1246 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
[root@drbd1 /]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.11 (api:88/proto:86-96)
GIT-hash: 0de839cee13a4160eed6037c4bddd066645e23c5 build by [email protected], 2011-07-08 11:10:38
m:res cs ro ds p mounted fstype
1:fs StandAlone Primary/Unknown UpToDate/DUnknown r----- ext3
这个时候,如果用户有尝试把drbd2的drbd服务重启的话,你就会发现根本无法起来!
[root@drbd2 /]# service drbd start
Starting DRBD resources: [ ]..........
***************************************************************
DRBD's startup script waits for the peer node(s) to appear.
- In case this node was already a degraded cluster before the
reboot the timeout is 120 seconds. [degr-wfc-timeout]
- If the peer was available before the reboot the timeout will
expire after 0 seconds. [wfc-timeout]
(These values are for resource 'fs'; 0 sec -> wait forever)
To abort waiting enter 'yes' [ -- ]:[ 13]:[ 15]:[ 16]:[ 18]:[ 19]:[ 20]:[ 22]:
在drbd2处理方法:
[root@drbd2 /]# drbdadm disconnect fs
[root@drbd2 /]# drbdadm secondary fs
[root@drbd2 /]# drbdadm -- --discard-my-data fs
做完以上三步,你发现你仍然无法启动drbd2上的drbd服务;上次一客户 我个人估计就是这个问题,把DRBD重启后,无法启动DRBD。
把他们DBA急的要死。呵呵
需要在drbd1上重连接资源:
[root@drbd1 ~]# drbdadm connect fs
再次启动drbd2上的drbd服务,成了。
[root@drbd2 /]# service drbd start
Starting DRBD resources: [ ].
再看看资源同步:
[root@drbd2 /]# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
GIT-hash: 0de839cee13a4160eed6037c4bddd066645e23c5 build by [email protected], 2011-07-08 11:10:20
1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
ns:0 nr:185532 dw:185532 dr:0 al:0 bm:15 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:299000
[======>.............] sync'ed: 39.5% (299000/484532)K
finish: 0:00:28 speed: 10,304 (10,304) want: 10,240 K/sec
大伙来拍砖吧!
补充:虽然是手工模拟但在故障切换时也会出一样的问题。
1、DRBD的资源只能在或主或辅的一台机器上挂载。
2、在做主辅的手工切换时的步骤:
a、先将原来挂载的东西进行卸载,这个时候你的应用会停,不建议手工切换主辅
b、将原来的主设置成辅 #drbdadm secondary resource_name
c、将原来的辅设置成主 #drbdadm primary resource_name
d、挂载资源
评论