drbd主从

简介

  DRBD(Distributed Replication Block Device,分布式复制块设备)是由内核模块和相关脚本构成,用以构建高可用集群;其实现方式是通过网络来镜像整个设备,可以看做是一种网络raid1。

工作要点

1.drbd的数据传输有三种:同步,半同步,异步,为了数据的安全性,最好选择同步协议;
2.drbd资源的工作模型有主从模型和双主模型:
(1).主从模型时2个节点不能使用同一个资源,即主节点能挂载能读能写,而此时从节点不能挂载,也不能读不能写;文件系统为是ext3、ext4、xfs等。
(2).双主模型是2个节点均为主,需要使用共享集群文件系统,如gfs和ocfs;可以实现并发访问。

本文介绍主从模型。

安装配置DRBD

IPHostname系统内核版本
10.10.10.56test1.drbdCentos6.52.6.32-573.12.1.el6.x86_64
10.10.10.57test2.drbdCentos6.52.6.32-573.12.1.el6.x86_64

1.安装epel源

rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

若出现以下错误:

Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again

编辑/etc/yum.repos.d/epel.repo中[epel]下的baseurl前的#号去掉,mirrorlist前添加#号即可。

2.安装drbd
  drbd共有两部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果您的内核版本高于此版本的话,你只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。CentOS 6.5的内核版本是2.6.32-573.12.1.el6.x86_64,因此两部分都要安装。

yum -y install drbd84 kmod-drbd84

3.修改配置文件
  DRBD的主配置文件为/etc/drbd.conf;为了管理的便捷性,目前通常会将些配置文件分成多个部分,且都保存至/etc/drbd.d目录中,主配置文件中仅使用”include”指令将这些配置文件片断整合起来。通常,/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件。其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。

编辑/etc/drbd.d/global-common.conf

vim global_common.conf
global {
        #是否参加DRBD使用者统计,默认是yes
        usage-count no;
        # minor-count dialog-refresh disable-ip-verification
        # cmd-timeout-short 5; cmd-timeout-medium 121; cmd-timeout-long 600;
}

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 degr-wfc-timeout outdated-wfc-timeout wait-after-sb
        }

        options {
                # cpu-mask on-no-data-accessible
        }

        disk {
                # size 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
                # 当磁盘io异常,将分离当前设备
                 on-io-error detach;
        }

        net {
                # 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
                # 消息验证校验码
                 cram-hmac-alg "sha1";
                # 加密key
                 shared-secret "drbd";
        }
        syncer {
                # drbd设备同步速率
                rate 1000M;
        }
}

配置/etc/drbd.d/r0.conf,定义资源

vim r0.res
resource r0 {
        on test1.drbd {
                device /dev/drbd0;
                disk /dev/sdb1;
                address 10.10.10.56:7789;
                meta-disk internal;
        }
        on test2.drbd {
                device /dev/drbd0;
                disk /dev/sdb1;
                address 10.10.10.57:7789;
                meta-disk internal;
        }
}

4.磁盘分区

#将sdb分区为sdb1
fdisk /dev/sdb

将以上配置在test1,test2上同步操作。

5.在test1,test2上初始化资源

#test1
[root@test1 drbd.d]# drbdadm create-md r0
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
#test2
[root@test2 drbd.d]# drbdadm create-md r0
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.

若此步报错:

[root@test1 ~]# drbdadm create-md r0
ERROR: modinfo: could not find module drbd
ERROR: modinfo: could not find module drbd
'r0' not defined in your config (for this host).
[root@test1 ~]# modprobe drbd
FATAL: Module drbd not found.

原因:这是两个错误,一个是因为系统默认的内核并不支持此模块,所以需要更新内核yum install kernel*,需要重启;一个是我们的资源文件配置有问题。
第一个错误升级内核并重启后:

[root@test1 ~]# modprobe drbd
[root@test1 ~]# lsmod |grep drbd
drbd                  365931  0 
libcrc32c               1246  1 drbd

再次初始化资源

[root@test1 drbd.d]# drbdadm create-md r0
'r0' not defined in your config (for this host).

原因:这是由于配置文件导致, resource 配置文件中的 on hostname 一定要和主机名一致,否则 create-md 初始化失败。
解决方法:修改/etc/hostname使hostname和资源文件中的”on hostname”一致即可。

6.启动drbd

#test1
[root@test1 drbd.d]# service drbd start
Starting DRBD resources: [
     create res: r0
   prepare disk: r0
    adjust disk: r0
     adjust net: r0
]
#test2
[root@test2 drbd.d]# service drbd start
Starting DRBD resources: [
     create res: r0
   prepare disk: r0
    adjust disk: r0
     adjust net: r0
]

7.查看状态

#test1
[root@test1 drbd.d]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R6, 2015-04-09 14:35:00
 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:f oos:10482024
[root@test1 drbd.d]# drbd-overview
 0:r0/0  Connected Secondary/Secondary Inconsistent/Inconsistent
#test2
[root@test2 drbd.d]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R6, 2015-04-09 14:35:00
 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:f oos:10482024
[root@test1 drbd.d]# drbd-overview
 0:r0/0  Connected Secondary/Secondary Inconsistent/Inconsistent

从以上看出此时两个节点均处于Secondary状态。

8.将test1设置为主节点

#test1
[root@test1 drbd.d]# drbdsetup primary /dev/drbd0 --force
[root@test1 drbd.d]# drbd-overview 
 0:r0/0  SyncSource Primary/Secondary UpToDate/Inconsistent 
    [>....................] sync'ed:  0.8% (10164/10236)M
#test2
[root@test2 drbd.d]# drbd-overview
 0:r0/0  SyncTarget Secondary/Primary Inconsistent/UpToDate 
    [>...................] sync'ed:  5.7% (9660/10236)M

此时看到test1和test2正在同步数据,待两个都变成UpToDate/UpToDate,表示同步完成。

9.格式化并挂载

[root@test1 drbd.d]# mkfs.ext4 /dev/drbd0
[root@test1 drbd.d]# mkdir -p /drbd
[root@test1 drbd.d]# mount /dev/drbd0 /drbd

注意:此时只有主节点test1上进行挂载,从节点test2不进行挂载

10.往/drbd写入数据

[root@test1 drbd.d]# cd /drbd
[root@test1 drbd]# ls
lost+found
[root@test1 drbd]# dd if=/dev/zero of=hello.txt bs=100M count=10
10+0 records in
10+0 records out
1048576000 bytes (1.0 GB) copied, 3.73007 s, 281 MB/s
[root@test1 drbd]# ls
hello.txt  lost+found

11.主从切换
对主从(Primary/Secondary)模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary。

#test1
[root@test1 ~]# umount /drbd
[root@test1 ~]# drbdadm secondary r0
[root@test1 ~]# drbd-overview 
 0:r0/0  Connected Secondary/Secondary UpToDate/UpToDate 
此时test1变为从节点

#test2
[root@test2 drbd.d]# drbdadm primary r0
[root@test2 drbd.d]# drbd-overview 
 0:r0/0  Connected Primary/Secondary UpToDate/UpToDate 
[root@test2 drbd.d]# mkdir -p /drbd
[root@test2 drbd.d]# mount /dev/drbd0 /drbd
[root@test2 drbd.d]# cd /drbd
[root@test2 drbd]# ls
hello.txt  lost+found
此时test2变为主节点,并且数据已经同步完毕

总结

1.普通的主从不支持自动切换,需要结合heartbeat等可实现自动切换
2.主从模式下只能有一个主节点进行读写,从节点无法挂载且不能读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值