DRBD分布式块设备复制

1、 DRBD介绍

1.一、数据镜像软件DRBD介绍
分布式块设备复制(Distributed Relicated Block Deivce,DRBD),是一种基于软件、基于网络的块复制存储解决方案,主要用于对服务器之间的磁盘、分区、逻辑卷等进行数据镜像,当用户将数据写入本地磁盘时,还会将数据发送到网络中另外一台主机的磁盘上,这样的本地主机(主节点)与远程主机(备节点)的数据就能够保证明时同步,当本地主机出现问题,远程主机上还保留着一份相同的数据,能够继续使用,保证了数据的安全
node

1.二、DRBD的基本功能
DRBD的核心功能就是数据的镜像,其实现方式是经过网络来镜像整个磁盘设备或者磁盘分区,将一个节点的数据经过网络实时地传送到另一个远程节点,保证两个节点间数据的一致性,这有点相似于一个网络RAID1的功能,对于DRBD数据镜像来讲,它具备以下特色:
实时性: 当应用对磁盘数据有修改操做时,数据复制当即发生。
透明性: 应用程序的数据存储在镜像设备上是透明和独立的。数据能够存储在基于网络不一样服务器上。
同步镜像: 当本地应用申请写操做时,同时也在远程主机上开始进行写操做
异步镜像: 当本地写操做已经完成时,才开始对远程主机上进行写操做。
linux

1.三、DBRD的构成
DRBD是Linux内存存储层中的一个分布式存储系统,具体来讲两部分构成,
(1) 一部分:内核模板,主要用于虚拟一个块设备;
(2) 一部分:是用户控件管理程序,主要用于和DRBD内核模块通讯,以管理DRBD资源,
在DRBD中,资源主要包含DRBD设备,磁盘配置,网络配置等。
一个DRBD系统有两个以上的节点构成,分为主节点和备节点两个角色,在主节点上,能够对DRBD设备进行不受限制的读写操做,能够用初始化、建立、挂在文件系统,在备节点上,DRBD设备没法挂载,只能用来接收主节点发送过来的数据,也就是说备节点不能用于读写访问,这样的目的是保证数据缓冲区的一致性。
     主用节点和备用节点不是一成不变的。能够经过手工的方式改变节点的角色,备用节点能够升级为主节点,主节点也降级为备节点。
   DRBD设备在整个DRBD系统中位于物理块设备上,文件系统之下,在文件系统和物理磁盘之间造成了一个中间层,当用户在主节点的文件系统中写入数据时,数据被正式写入磁盘前会被DRBD系统截获,同时,DRBD在捕捉到有磁盘写入的操做时,就会通知用户控件管理程序把这些数据复制一份。写入远程主机的DRBD镜像,而后存入DRBD镜像全部映射的远程主机磁盘,
 
DRBD负责接收数据,把数据写到本地磁盘,而后发送给另外一台主机,另外一台主机再将数据存到本身的磁盘中,目前,DRBD每次只容许对一个节点进行读写访问,这对于一般的故障切换高可用性集群来说已经足够用了,
算法

1.四、DRBD与集群的关系
 DRBD由两个或者两个以上节点构成,与HA集群相似,也有主节点和备节点之分,于是常常用于高可用集群和负载集群系统中做,因为DRBD系统是在IP网络运行,因此,在集群中使用DRBD做为共享存储设备,不须要任何硬件投资,能够节约不少成本,由于在价格上IP网络要比专用的存储网络更加经济。另外DRBD也能够用于数据备份、数据容灾等方面。
vim

1.五、DRBD的主要特性
DRBD系统在实现数据镜像方面有不少有用的特性,咱们能够根据本身的需求和应用环境,选择合适本身的功能特性。下面一次介绍DRBD几个很是重要的特性:
(1)、单主模式:
这是使用最频繁的一种模式,主要用于在高可用集群的数据存储方面,解决集中数据共享的问题,在这种模式下,集群中只有一个主节点能够对数据进行读写操做,能够用在这种模式下的文件系统有EXT3 EXT4 XFS等。
(2)、双主模式:
这种模式只能在DRBD8.0之后的版本使用,主要用于负载均衡集中,解决数据共享和一致性问题,在这种模式下,集群中存在两个主节点,因为两个主节点都有可能对数据进行并发操做的读写操做,所以单一的文件系统就没法知足需求了,所以须要共享的集群文件系统来解决并发读写问题,经常使用在这种模式下的文件系统有GFS,OCFS2等,经过集群文件系统的分布式锁机制就能够解决集群中两个主节点同时操做数据的问题。
(3)、复制模式
DRBD提供了三种不一样的复制方式,分别是;
协议A: 只要本地磁盘写入已经完成,数据包已经在发送队列中,则认为一个写操做过程已经完成,
这种方式在远程节点故障或者网络故障时,可能形成数据丢失,由于要写入到远程节点的数据可能还在发送队列中。
协议B:只要本地磁盘写入已经完成,而且数据包已经到达远程节点,则认为一个写操做过程已经完成。
   这种方式在远程节点发生故障时,肯能形成数据丢失。
协议C: 只有本地和远程节点的磁盘已经都确认了
写操做完成,则认为一个写操做过程已经完成,
这种方式没有任何数据丢失,就目前而已应用最多,最普遍的就是协议C,旦在此方式下磁盘的I/O的吞吐量依赖于网络带宽,建议在网络带宽比较好的状况下使用这种方式。
protocol C; #使用drbd的同步协议
(4)、传输的完整性校验
    这个特性在DRBD8.20及之后版本中可使用,DRBD使用MD五、SHA-1,或者CRC 32C等加密算法对信息进行终端到终端的完整性验证,利用这个特性,DRBD对每个复制到远程节点数据都生成信息摘要,同时,远程节点也采用一样的方式对复制的数据块进行完成性验证,若是验证信息不对,就请求主节点从新发送,经过这种方式保证镜像数据的完整性和一致性。
(5)、脑裂通知和自动修复。
  因为集群节点之间的网络链接临时故障、集群软件管理干预或者人为错误,致使DRBD两个节点都切换为主节点而断开链接,这就是DRBD的脑裂问题,发生脑裂意味着数据不能同步从主节点复制到备用节点,这样致使DRBD两个节点的数据不一致,而且没法合并。
  在DRBD8.0以及更高的版本,实现了脑裂自动修复功能,在DRBD8.2.1以后。又实现了脑裂通知特性,在出现脑裂后,通常建议经过手工方式修复脑裂问题,

安全

2、 DRBD安装

2.一、环境描述
系统版本:redhat x64(内核2.6.32)
DRBD版本: DRBD-8.4.3
node1: 192.168.1.138(主机名:master)
node2: 192.168.1.139 (主机名:slave)
(node1)为仅主节点配置 Primary
(node2)为仅从节点配置Secondary
(node1,node2)为主从节点共同配置

服务器

2.二、服务器时间同步以及关闭防火墙Selinux
#/etc/init.d/iptables stop  关闭防火墙
#setenforce 0        关闭Selinux
# cat /etc/selinux/config
SELINUX=disabled
#ntpdate -u asia.pool.ntp.org  真实环境这样同步
# date –s “2014-09-24 15:55:33” 测试时间。临时能够这样同步,两台机器都迅速执行此命令

网络

2.三、修改主机名
#:vim /etc/sysconfig/network   主节点 138
HOSTNAME=master
 #:vim /etc/sysconfig/network   从节点139
HOSTNAME=slave
若是使用虚拟机器作测试。尚未增长硬盘的的话。请关闭虚拟机器。
开始增长一块硬盘,若是原有的虚拟机硬盘还有空间的话。拿出一块空间,作一个分区。也行。

并发

2.四、全部节点增长硬盘
在主节点138 和从节点139上。划分增长的/dev/sdb 硬盘。进行分区
# fdisk /dev/sdb
 分一个叫作/dev/sdb1分区出来。就能够。注意千万不要格式化它。划分出来就好了。不须要格式化。

负载均衡

2.五、全部的节点安装
在主节点138和从节点139上同时安装
# wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz
# tar zxvf drbd-8.4.3.tar.gz
# cd drbd-8.4.3
# ./configure --prefix=/usr/local/drbd --with-km --with-heartbeat  km表明开启内核模块
./configure命令中添加--with-heartbeat,安装完成后会在/usr/local/drbd/etc/ha.d /resource.d生成drbddisk和drbdupper文件,把这两个文件复制到/usr/local/heartbeat/etc/ha.d /resource.d目录,命令cp -R /usr/local/drbd/etc/ha.d/resource.d/* /etc/ha.d/resource.d。
# make KDIR=/usr/src/kernels/2.6.32-279.el6.x86_64/
# make install
# mkdir -p /usr/local/drbd/var/run/drbd
# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d
# chkconfig --add drbd
# chkconfig drbd on
 加载DRBD模块:
# modprobe drbd
查看DRBD模块是否加载到内核:
# lsmod |grep drbd
异步

 

三、全部节点配置文件

在主节点138和从节点139 配置文件保持一致。
# /usr/local/drbd/etc/drbd.conf
drbd.conf 包含了2个类型的文件。为了方便起见全局配置和资源配置分开了。global_common.conf为固定全局配置文件,*.res 能够包含多个,跟Nginx虚拟机器同样。*.res 带包含了全部的资源文件。
 

(1) 修改全局配置文件:
global {
        usage-count yes; #是否参加drbd的使用者统计,默认此选项为yes
        # minor-count dialog-refresh disable-ip-verification
}

common {
        protocol C; #使用drbd的同步协议
        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;  #配置I/O错误处理策略为分离
                # 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 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 1024M; #设置主备节点同步时的网络速率
}
}

(2)建立资源配置文件
资源文件须要本身手工建立,目录是在/usr/local/drbd/etc/drbd.d下面
#cd /usr/local/drbd/etc/drbd.d
# vim  drbd.res
resource  r1 {   #这个r1是定义资源的名字
on  master{            #on开头,后面是主机名称
device    /dev/drbd0;  #drbd设备名称
disk      /dev/sdb1;   #drbd0使用的磁盘分区为sdb1
address   192.168.1.138:7789; #设置drbd监听地址与端口
meta-disk  internal;
}
on  slave{            #on开头,后面是主机名称
device    /dev/drbd0;  #drbd设备名称
disk      /dev/sdb1;   #drbd0使用的磁盘分区为sdb1
address   192.168.1.139:7789; #设置drbd监听地址与端口
meta-disk  internal;
}
}


四、激活节点启动服务

在主节点138 从节点139 作一样的操做
(1)、激活和建立设备块
# mknod /dev/drbd0 b 147 0
# drbdadm create-md r1   资源名称为r1
等待片刻,显示success表示drbd块建立成功
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.

(2)、准备启动服务: 启动DRBD服务:(node1,node2)
注:须要主从共同启动方能生效
# service drbd start

(3)、查看状态:(node1,node2)
# cat /proc/drbd 或  # service drbd status  



(4)受权节点201为,主节点
# drbdsetup /dev/drbd0 primary --force


(5)、分别查看主从DRBD状态:
# service drbd status (主节点)

# service drbd status(从节点)

---------------------
ro在主从服务器上分别显示 Primary/Secondary和Secondary/Primary
ds显示UpToDate/UpToDate
表示主从配置成功。

五、挂载drbd0设备(主节点201)

从刚才的状态上看到mounted和fstype参数为空,因此咱们这步开始挂载DRBD到系统目录
# mkdir /data
# mkfs.ext4 /dev/drbd0
# mount  /dev/drbd0 /data
注:Secondary节点上不容许对DRBD设备进行任何操做,包括只读,全部的读写操做只能在Primary节点上进行,只有当Primary节点挂掉时,Secondary节点才能提高为Primary节点继续工做

六、模拟DRBD1 故障,DRBD2()接管并提高为Primary

(1)、(节点138 node1)  故障
# cd /data
# touch 1 2 3 4 5
# cd ..


# umount  /data
# drbdsetup /dev/drbd0 secondary  故障后。降级为从
注:这里实际生产环境若DRBD1宕机,在DRBD2状态信息中ro的值会显示为Secondary/Unknown,只须要进行DRBD提权操做便可。
# service drbd status


(节点139 node2 提权为主)
# drbdsetup /dev/drbd0 primary   提权为主
# mount /dev/drbd0 /data
# cd /data
# touch 6 7 8 9 10
# ls
1 10 2 3 4 5 6 7 8 9 lost+found


# service drbd status


不过如何保证DRBD主从结构的智能切换,实现高可用,这里就须要Heartbeat来实现了。 
Heartbeat会在DRBD主端挂掉的状况下,自动切换从端为主端并自动挂载/data分区


七、总结: 这里是DRBD官方推荐的手动恢复方案:


假设你把Primary的eth0挡掉,而后直接在Secondary上进行主Primary主机的提高,而且mount上,你可能会发如今 Primary上测试考入的文件确实同步过来了,以后把Primary的eth0恢复后,看看有没有自动恢复 主从关系。通过查看,发现DRBD检测出了Split-Brain的情况,也就是两个节点都处于standalone状态,故障描述以下:Split- Brain detected,dropping connection! 这就是传说中的“脑裂”

(node2)
# drbdadm secondary r0
# drbdadm disconnect all
# drbdadm --discard-my-data connect r0
(node1)
# drbdadm disconnect all
# drbdadm connect r0
# drbdsetup /dev/drbd0 primary

八、Heartbeat实现自动切换

3.一、HeartBeat简单介绍


Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通讯是高可用集群的两个关键组件,在 Heartbeat 项目里,由 heartbeat 模块实现了这两个功能。下面描述了 heartbeat 模块的可靠消息通讯机制,并对其实现原理作了一些介绍。

Ø HeartBeat的组成:
Heartbeat内部结构由三大部分组成
(1)集群成员一致性管理模块(CCM)
CCM用于管理集群节点成员,同时管理成员之间的关系和节点间资源的分配。Heartbeat模块负责检测主次节点的运行状态,以决定节点是否失效。ha-logd模块用于记录集群中全部模块和服务的运行信息。

(2)本地资源管理器(LRM)
LRM负责本地资源的启动、中止和监控,通常由LRM守护进程lrmd和节点监控进程Stonith Daemon组成。lrmd守护进程负责节点间的通讯;Stonith Daemon一般是一个Fence设备,主要用于监控节点状态,当一个节点出现问题时处于正常状态的节点会经过Fence设备将其重启或关机以释放IP、 磁盘等资源,始终保持资源被一个节点拥有,防止资源争用的发生。
  REDHAT的fence device有两种,内部fence设备(如IBM RSAII卡,HP的iLO卡,Dell的DRAC,还有IPMI的设备等)和外部fence 设备(如UPS,SAN SWITCH,NETWORK SWITCH等)。
对于外部fence 设备,能够作拔电源的测试,由于备机能够接受到fence device返回的信号,备机能够正常接管服务,
对于内部fence 设备,不能作拔电源的测试,由于主机断电后,备机接受不到主板芯片作为fence device返备的信号,就不能接管服务,clustat会看到资源的属主是unknow,查看日志会看到持续报fence failed的信息

(3)集群资源管理模块(CRM)
CRM用于处理节点和资源之间的依赖关系,同时,管理节点对资源的使用,通常由CRM守护进程crmd、集群策略引擎和集群转移引擎3个部分组成。 集群策略引擎(Cluster policy engine)具体实施这些管理和依赖;集群转移引擎(Cluster transition engine)监控CRM模块的状态,当一个节点出现故障时,负责协调另外一个节点上的进程进行合理的资源接管


Ø 原理:
heartbeat (Linux-HA)的工做原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测能够经过网络链路和串口进行,并且支持 冗 余链路(心跳通常会接2条跳线,1条冗余),它们之间相互发送报文来告诉对方本身当前的状态,若是在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运 行在对方主机上的资源或者服务

相关文章
相关标签/搜索