在高可用解决方案(HA)中,为了实现集群中数据的共享,常见两种架构:1、利用SAN等架构的盘柜存放共享数据;2、在每台集群中的机器本地磁盘中划分一个空间出来,并利用网络等方式,往集群中其他机器同步,以保证每台机器上的数据是一致的。当然,为了令第二种架构也能用于数据库等应用,同步应以数据块方式,而非文件拷贝的方式进行,而DRBD就是可用于实现第二种架构的软件。本文就模拟一个简单的架构来说明DRBD的配置方法。
一、DRBD介绍
DRBD实际上是一种块设备的实现,它由内核模块和相关程序两部分而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说,当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中。本地节点(主机)与远程节点(主机)的数据可以保证实时的同步,并保证数据的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据可以继续使用,以达到高可用的目的。
二、获取介质
从2.6.33核心开始,DRBD模块就可以从核心中直接编译得到,见这里。若使用其他核心版本,需手动编译驱动模块及工具包。
以这次使用的平台Asianux 3.0 SP2为例,下面提供一个安装包:
(包括i686和x86_64平台,对应核心为:2.6.18-128.7AXS3)
※ 注意,因为DRBD需把模块加载到核心中,故核心版本必须一致。若我提供的版本与您的不一样,可用源码make install,或用附件中的src.rpm 编译后安装。
三、运行环境
操作系统:Asianux 3.0 SP2 for i686
主机名称:
hatest1:192.168.228.131
hatest2:192.168.228.132
四、初始设置
1、设置主机名
确认两服务器的主机名:
hatest1
[root@hatest2 ~]# hostname
hatest2
2、/etc/hosts文件
把两台服务器上的hosts文件都设置为相同的内容:
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.228.131 hatest1.linuxfly.org hatest1
192.168.228.132 hatest2.linuxfly.org hatest2
3、安装软件
在两台服务器上都安装drbd软件和核心驱动模块:
4、确认模块加载是否正常
drbd的同步依赖于加载到核心中的drbd.ko驱动模块,因此,在配置前,务必确认驱动模块与当前核心匹配:
# lsmod|grep drbd
drbd 228528 0
# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
5、分区
这里将使用本地硬盘sdb作为保存数据的磁盘,为了方便管理,在两台服务器上都为其创建一个单独的分区:
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 261 2096451 83 Linux
※注意:DRBD是以数据块方式同步的,因此,在创建镜像磁盘前,不要创建文件系统。
五、配置
1、创建配置文件
DRBD的主配置文件在/etc/drbd.conf,及/etc/drbd.d目录下。下面的操作现在一台机器上进行。
首先,可把参考文件拷贝到/etc下:
查看drbd.conf,可看到两行:
include “drbd.d/*.res”;
其中,global_common.conf 里面可设置全局配置项(global)、公共配置项(common),一般保留默认配置即可。
内容是:
usage-count yes; # 是否参加DRBD使用者统计,默认是yes
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C; # DRBD支持三种协议,默认是C 协议
}
※注意:
a、首次启动DRBD时,会自动参加DRBD使用者统计(需要联互联网),若不想参加,可在上面的配置中关闭;
b、DRBD支持三种同步协议,详细请见:这里。
而资源配置项(resource)是DRBD所管理的资源,包括节点、meta data信息等,一般存放在drbd.d/*.res目录下,需要手动创建。
内容如下:
resource oradata { # 资源组的名称
protocol C;
startup {
degr-wfc-timeout 120; # 2 minutes. 启动时连接其他节点的超时时间
}
disk {
on-io-error detach; # 当磁盘有错误时,不连接
}
net {
}
syncer {
rate 10M; # 设置主备节点同步时的网络速率最大值
al-extents 257;
}
on hatest1 { # 节点主机名
device /dev/drbd0; # 今后使用的设备
disk /dev/sdb1; # 该节点上的用于存放数据的分区号
address 192.168.228.131:7789; # 该节点的IP地址
meta-disk internal; # meta data信息存放的方式
}
on hatest2 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.228.132:7789;
meta-disk internal;
}
}
在一台机器上配置完成后,拷贝到集群中其他机器上:
[root@hatest1 ~]# scp /etc/drbd.d/oradata.res hatest2:/etc/drbd.d/
2、初始化分区
在两台机器上初始化分区(创建meta data信息),这里的oradata即为配置文件中的资源组名称:
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success
[root@hatest2 ~]# drbdadm create-md oradata
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success
3、启动服务
在两服务器上启动drbd服务。
[root@hatest2 ~]# service drbd start
因hatest1上已经加载过drbd.ko模块,故只需restart一下drbd服务(不执行也可以)。
用cat /proc/drbd 或 service drbd status 查看当前状态:
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
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:2096348
[root@hatest2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
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:2096348
※ 注意,现在两机器都是处于Secondary,即备机状态,还进行数据同步。
4、设置primary主机
在确认作为主数据服务器的机器上执行:
[root@hatest1 ~]# drbdsetup /dev/drbd0 primary -o
这样,将把hatest1作为主机,把sdb1中的数据以块的方式同步到hatest2中。可再次查看状态:
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r—-
ns:719756 nr:0 dw:0 dr:720896 al:0 bm:43 lo:0 pe:62 ua:36 ap:0 ep:1 wo:b oos:1378556
[=====>…………..] sync’ed: 34.4% (1378556/2096348)K delay_probe: 149
finish: 0:04:59 speed: 4,580 (7,248) K/sec
[root@hatest2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r—-
ns:0 nr:752096 dw:751584 dr:0 al:0 bm:45 lo:17 pe:49 ua:16 ap:0 ep:1 wo:b oos:1344764
[======>………….] sync’ed: 36.0% (1344764/2096348)K queue_delay: 2.9 ms
finish: 0:02:11 speed: 10,224 (10,020) want: 10,240 K/sec
从蓝色比较的地方,可区分主机在DRBD集群中的位置。使用下面的命令也可确认:
Primary/Secondary
[root@hatest2 ~]# drbdadm role oradata
Secondary/Primary
为仍系统启动时自动加载drbd.ko模块,可把drbd服务设置为自启动方式:
[root@hatest2 ~]# chkconfig –level 235 drbd on
至此,镜像分区已创建完成。
最终同步完成后,两机器drbd的状态会变为:
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—-
ns:2096348 nr:0 dw:0 dr:2096348 al:0 bm:128 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
[root@hatest2 ~]# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by root@hatest1, 2010-07-07 08:59:44
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r—-
ns:0 nr:2096348 dw:2096348 dr:0 al:0 bm:128 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
六、简单使用
1、格式化分区
与软RAID、LVM等类似,要使用DRBD创建的镜像分区,不是直接使用/dev/sdb1设备,而是在配置文件中指定的/dev/drbd0等。同样的,不必等待初始化完成后才使用drbd0设备。
Primary/Secondary
[root@hatest1 ~]# mkfs.ext3 /dev/drbd0
[root@hatest1 ~]# tune2fs -c 0 -i 0 /dev/drbd0
2、注意事项
需要注意,drbd0设备只能在Primary一端使用,下面的操作都是会报错的:
mount: /dev/sdb1 already mounted or /oradata busy
[root@hatest2 ~]# drbdadm role oradata
Secondary/Primary
[root@hatest2 ~]# mount /dev/drbd0 /oradata/
mount: block device /dev/drbd0 is write-protected, mounting read-only
mount: 错误的介质类型
另外,为避免误操作,当机器重启后,默认都处于Secondary状态,如要使用drbd设备,需手动把其设置为Primary。
3、挂载
先把drbd0设备挂载到/oradata目录中:
[root@hatest1 ~]# df -h /oradata
文件系统 容量 已用 可用 已用% 挂载点
/dev/drbd0 2.0G 36M 1.9G 2% /oradata
4、测试
当前的primary是hatest1,我们在上面创建一个文件:
[root@hatest1 ~]# cat /oradata/test.txt
1278471155
正如前面提到的,只能在Primary上使用drbd设备。所以,首先,我们需要在hatest1上把卸载该设备:
然后,把hatest1设置为Secondary:
现在两台服务器都是Secondary:
Secondary/Secondary
[root@hatest2 ~]# drbdadm role oradata
Secondary/Secondary
这样,我们就可以把hatest2设置为Primary:
[root@hatest2 ~]# drbdadm role oradata
Primary/Secondary
[root@hatest2 ~]# mount /dev/drbd0 /oradata
[root@hatest2 ~]# cat /oradata/test.txt
1278471155
可见,hatest2上的数据时同步的。
DRBD的在日常的使用中还有不少需要注意的问题,例如其中一台机器突然down机,数据同步如何恢复?新加入一块硬盘,如何进行同步?设置第三台同步主机等。这再后面再详细描述。
七、附件
1、DRBD 8.3.8 src.rpm 源码
可使用类似下面的命令进行编译:
其他版本,可从这里获得。
2、DRBD配置说明
下面是网上的一篇关于DRBD配置及原理的说明,很值得参考,特别是关于节点Crash部分:
3、DRBD的状态
通过cat /proc/drbd,或service drbd status可查看当前节点DRBD的状态,下面是其中一些简写的说明:
cs 连接状态 出现的值:
o Unconfigured:设备在等待配置。
o Unconnected:连接模块时的过渡状态。
o WFConnection:设备等待另一测的配置。
o WFReportParams:过渡状态,等待新TCP 连接的第一个数据包时。.
o SyncingAll:正将主节点的所有模块复制到次级节点上。.
o SyncingQuick:通过复制已被更新的模块(因为现在次级节点已经离开了集群)来更新次级节点。
o Connected:一切正常。
o Timeout:过渡状态。
st 状态(设备的作用) 可能的值为:
o 本地/远程一级状态
o 二级状态
o 未知(这不是一种作用)
ns 网络发送 模块号码
nr 网络接收 模块号码
dw 磁盘写入 模块号码
DR 磁盘读取 模块号码
of 运行中(过时的)模块号码
pe 待解决的 模块号码
ua 未答复的 模块号码(最好为0)
4、split brain的处理
split brain实际上是指在某种情况下,造成drbd的两个节点断开了连接,都已Primary状态来运行。这通常发生在主节点断开,而备节点手动修改数据后,因meta data数据不一致的情况。当drbd某primary节点连接对方节点准 备发送信息的时候如果发现对方也是primary状态,那么会会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:“Split-Brain detected,dropping connection!”当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是WFConnection的状态。
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的话,可以省略)
当作完这些动作之后,从新的primary到secondary的re-synchnorisation会自动开始(重新同步)。详细请见:Manual split brain recovery。
八、参考文档
The DRBD User’s Guide(官方文档,很详细)
A Journey On DRBD For MySQL
DRBD软件的配置(drbd.conf)
参考文档:DRBD(磁盘镜像技术)
DRBD 8.3 Third Node Replication With Debian Etch
用DRBD自動同步備份NFS Server內容
构建Heartbeat 2.1.3 GUI+DRBD+Oracle 10g 双机互备集群
使用红旗HA LE版搭建镜像高可用服务器
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/104199.html