Jul 7

[原]使用DRBD创建镜像分区 晴

linuxing , 19:11 , 网络服务 » 常见服务 , 评论(1) , 引用(0) , 阅读(32805) , Via 本站原创 | |
    在高可用解决方案(HA)中,为了实现集群中数据的共享,常见两种架构:1、利用SAN等架构的盘柜存放共享数据;2、在每台集群中的机器本地磁盘中划分一个空间出来,并利用网络等方式,往集群中其他机器同步,以保证每台机器上的数据是一致的。当然,为了令第二种架构也能用于数据库等应用,同步应以数据块方式,而非文件拷贝的方式进行,而DRBD就是可用于实现第二种架构的软件。本文就模拟一个简单的架构来说明DRBD的配置方法。

一、DRBD介绍
DRBD实际上是一种块设备的实现,它由内核模块和相关程序两部分而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说,当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中。本地节点(主机)与远程节点(主机)的数据可以保证实时的同步,并保证数据的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据可以继续使用,以达到高可用的目的。
点击在新窗口中浏览此图片
因为DRBD是用网络以块的方式进行数据同步的,所以,其不依赖于文件系统、LVM、软RAID等上层设备,可用于数据库文件的同步(区别于rsync 的文件同步方式)。
官方网站:http://www.drbd.org/

二、获取介质
从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、设置主机名
确认两服务器的主机名:
引用
[root@hatest1 ~]# hostname
hatest1
[root@hatest2 ~]# hostname
hatest2

2、/etc/hosts文件
把两台服务器上的hosts文件都设置为相同的内容:
引用
# cat /etc/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软件和核心驱动模块:

# rpm -ivh kmod-drbd83-8.3.8-1AXS3.i686.rpm drbd83-8.3.8-1AXS3.i686.rpm

4、确认模块加载是否正常
drbd的同步依赖于加载到核心中的drbd.ko驱动模块,因此,在配置前,务必确认驱动模块与当前核心匹配:
引用
# modprobe drbd
# 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作为保存数据的磁盘,为了方便管理,在两台服务器上都为其创建一个单独的分区:
引用
# fdisk -l /dev/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下:
引用
[root@hatest1 ~]# cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc/

查看drbd.conf,可看到两行:
引用
include "drbd.d/global_common.conf";
include "drbd.d/*.res";

其中,global_common.conf 里面可设置全局配置项(global)、公共配置项(common),一般保留默认配置即可。
内容是:
引用
global {
        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目录下,需要手动创建。
内容如下:
引用
[root@hatest1 ~]# cat /etc/drbd.d/oradata.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.conf hatest2:/etc
[root@hatest1 ~]# scp /etc/drbd.d/oradata.res hatest2:/etc/drbd.d/

2、初始化分区
在两台机器上初始化分区(创建meta data信息),这里的oradata即为配置文件中的资源组名称:
引用
[root@hatest1 ~]# drbdadm create-md 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@hatest1 ~]# service drbd restart
[root@hatest2 ~]# service drbd start

因hatest1上已经加载过drbd.ko模块,故只需restart一下drbd服务(不执行也可以)。
用cat /proc/drbd 或 service drbd status 查看当前状态:
引用
[root@hatest1 ~]# 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
[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 ~]# drbdadm adjust oradata
[root@hatest1 ~]# drbdsetup /dev/drbd0 primary -o

这样,将把hatest1作为主机,把sdb1中的数据以块的方式同步到hatest2中。可再次查看状态:
引用
[root@hatest1 ~]# 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: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集群中的位置。使用下面的命令也可确认:
引用
[root@hatest1 ~]# drbdadm role oradata
Primary/Secondary
[root@hatest2 ~]# drbdadm role oradata
Secondary/Primary

为仍系统启动时自动加载drbd.ko模块,可把drbd服务设置为自启动方式:
引用
[root@hatest1 ~]# chkconfig --level 235 drbd on
[root@hatest2 ~]# chkconfig --level 235 drbd on

至此,镜像分区已创建完成。
最终同步完成后,两机器drbd的状态会变为:
引用
[root@hatest1 ~]# 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: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设备。
引用
[root@hatest1 ~]# drbdadm role oradata
Primary/Secondary
[root@hatest1 ~]# mkfs.ext3 /dev/drbd0
[root@hatest1 ~]# tune2fs -c 0 -i 0 /dev/drbd0

2、注意事项
需要注意,drbd0设备只能在Primary一端使用,下面的操作都是会报错的:
引用
[root@hatest2 ~]# mount /dev/sdb1 /oradata
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 ~]# mount /dev/drbd0 /oradata
[root@hatest1 ~]# df -h /oradata
文件系统              容量  已用 可用 已用% 挂载点
/dev/drbd0            2.0G   36M  1.9G   2% /oradata

4、测试
当前的primary是hatest1,我们在上面创建一个文件:
引用
[root@hatest1 ~]# echo `date +%s` > /oradata/test.txt
[root@hatest1 ~]# cat /oradata/test.txt
1278471155

正如前面提到的,只能在Primary上使用drbd设备。所以,首先,我们需要在hatest1上把卸载该设备:
引用
[root@hatest1 ~]# umount /oradata

然后,把hatest1设置为Secondary:
引用
[root@hatest1 ~]# drbdadm secondary oradata

现在两台服务器都是Secondary:
引用
[root@hatest1 ~]# drbdadm role oradata
Secondary/Secondary
[root@hatest2 ~]# drbdadm role oradata
Secondary/Secondary

这样,我们就可以把hatest2设置为Primary:
引用
[root@hatest2 ~]# drbdadm primary oradata
[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 源码

可使用类似下面的命令进行编译:

rpmbuild --rebuild --define "kversion 2.6.18-128.7AXS3" --define "kvariants '' " --target i686 drbd83-kmod-8.3.8-1AXS3.src.rpm

其他版本,可从这里获得。

2、DRBD配置说明
下面是网上的一篇关于DRBD配置及原理的说明,很值得参考,特别是关于节点Crash部分:


3、DRBD的状态
通过cat /proc/drbd,或service drbd status可查看当前节点DRBD的状态,下面是其中一些简写的说明:
引用
Field        说明                  值:
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 disconnect resource_name
drbdadm secondary resource_name
drbdadm -- --discard-my-data connect resource_name

(2)在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略)

drbdadm connect resource_name

当作完这些动作之后,从新的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內容
Tags: ,
专门来点赞
2015/12/06 15:55
难得一见的好文,作者真的太用心了。一万个赞!
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]