一、DRBD简介

DRBD的全称为:Distributed ReplicatedBlock Device(DRBD)分布式块设备复制,DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。你可以把它看作是一种网络RAID。它允许用户在远程机器上建立一个本地块设备的实时镜像。

二、DRBD是如何工作的呢?

(DRBD Primary)负责接收数据,把数据写到本地磁盘并发送给另一台主机(DRBD Secondary)。另一个主机再将数据存到自己的磁盘中。目前,DRBD每次只允许对一个节点进行读写访问,但这对于通常的故障切换高可用集群来说已经足够用了。有可能以后的版本支持两个节点进行读写存取。

三、DRBDHA的关系

 

一个DRBD系统由两个节点构成,与HA集群类似,也有主节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问DRBD设备(/dev/drbd*)。在主节点写入的数据通过DRBD设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的DRBD设备,最终写入备用节点的磁盘设备上,在备用节点上,DRBD只是将数据从DRBD设备写入到备用节点的磁盘中。现在大部分的高可用性集群都会使用共享存储,而DRBD也可以作为一个共享存储设备,使用DRBD不需要太多的硬件的投资。因为它在TCP/IP网络中运行,所以,利用DRBD作为共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多;其性能与稳定性方面也不错

 

四、DRBD复制模式

 

协议A

 

异步复制协议。一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。在一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列。尽管,在故障转移节点上的数据是一致的,但没有及时更新。这通常是用于地理上分开的节点

 

协议B

 

内存同步(半同步)复制协议。一旦本地磁盘写入已完成且复制数据包达到了对等节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘

 

协议C

 

同步复制协议。只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但I / O吞吐量依赖于网络带宽

 

 

一般使用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议

 

205518193.gif

 

HeartBeat的工作原理:

    heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未受到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。

 

 

Heartbeat仅仅是个HA软件,它仅能完成心跳监控和资源接管,不会监视它控制的资源或应用程序。要监控资源和应用程序是否运行正常,必须使用第三方的插件,例如ipfailLdirector等。Heartbeat自身包含了几个插件,分别是ipfailLdirectord

  通过修改Heartbeat的软件的配置文件,可以制定那一台Heartbeat服务器作为主服务器,则另一台将自动成为热备服务器。然后在热备服务器上配置Heartbeat

 

守护程序来监听来自主服务器的心跳消息。如果热备服务器在指定时间内为监听到来自主服务器的心跳,就会启动故障转义程序,并取得主服务器上的相关资源服务的

 

所有权,接替主服务器继续不间断的提供服务,从而达到资源以及服务高可用的目的。

 

   以上的描述heartbeat的主备模式,heartbeat还支持主主模式,即两台服务器互为主备,这是他们之间还会互相发送报文来告诉对方自己的当前的状态,如果在

 

指定的时间内未收到对方发送的心跳报文,那么,一方就会认为对方失效或者是已经宕机了,这时每个运行正常的主机就会启动自身的资源接管模块来接管运行在对方

 

主机上的资源或者是服务,继续为用户提供服务。一般情况下,可以较好的实现一台主机故障后,企业业务能够不间断的持续的提供服务。注意:所谓的业务不间断,

 

在故障转移期间也是需要切换时间的,heartbeat的切换时间是5-20秒。

HeartBeat的作用:

 

  通过HeartBeat,可以将资源(IP以及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用的服务。在实际的生产应用场景中,heartbeat的功能和另一个高可用的开源软件keepalived有很多的相同之处,在我们实际的生产业务中也是有区别的。

HeartBeat的作用:

 

  通过HeartBeat,可以将资源(IP以及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用的服务。在实际的生产应用场景中,heartbeat的功能和另一个高可用的开源软件keepalived有很多的相同之处,在我们实际的生产业务中也是有区别的。

heartbeat的心跳连接:

 

  讲过上面的描述,要部署heartbeat服务,至少需要两台主机才能完成。那么,要实现高可用服务,这两台主机之间,是如何做到互相通信互相监控的呢/

 

  下面是两台heartbeat主机之间通信的一些常用的可行的方法:

 

    1)串行电缆,即所谓的串口(首选,缺点是距离不能太远)

 

    2)一根以太网电缆量网口直连(生产环境中常用的方式)

 

    3)以太网电缆,通过交换机等网络设备连接(次选,原因是增加了故障点,不好排查故障,同时,线路不是专用的心跳线,容易受其他数据传输的影响,导

 

      致心跳报文发送问题)

 

Heartbeat裂脑:

 

     什么是裂脑?

 

    由于两台高可用服务器之间在指定的时间内,无法互相检测到对方心跳而各自启动故障转移功能,取得了资源以及服务的所有权,而此时的两台高可用服务器

 

对都还活着并作正常运行,这样就会导致同一个IP湖综合服务在两端同时启动而发生冲突的严重问题,最严重的就是两台主机同时占用一个VIP的地址,当用户写入数

 

据的时候可能会分别写入到两端,这样可能会导致服务器两端的数据不一致或造成数据的丢失,这种情况就本成为裂脑,也有的人称之为分区集群或者大脑垂直分隔

 

 

 

导致裂脑发生的原因:  

 

  一般来说,裂脑的发生,主要是由以下的几个原因导致的:

 

  1)高可用服务器对之间心跳线路故障,导致无法正常的通信。原因比如:

 

    (1.心跳线本身就坏了(包括断了,老化)

 

    (2.网卡以及相关驱动坏了,IP配置及冲突问题

 

    (3.心跳线间连接的设备故障(交换机的故障或者是网卡的故障)

 

    (4.仲裁的服务器出现问题

 

  2)高可用服务器对上开启了防火墙阻挡了心跳消息的传输

 

  3)高可用服务器对上的心跳网卡地址等信息配置的不正确,导致发送心跳失败。

 

  4)其他服务配置不当等原因,如心跳的方式不同,心跳广播冲突,软件出现了BUG

 

防止脑裂发生的方法总结:

 

  发生脑裂的时候,对业务的影响是及其严重的,有的时候甚至是致命的。如:两台高可用的服务器对之间发生脑裂,导致互相竞争同一个IP资源,就如同我们局域

 

网内常见的IP地址冲突一样,两个机器就会有一个或者两个不正常,影响用户正常访问服务器。如果是应用在数据库或者是存储服务这种极重要的高可用上,那就导致

 

用户发布的数据间断的写在两台服务器上的恶果,最终数据恢复及困难或者是难已恢复

 

  实际的生产环境中,我们可以从以下几个方面来防止裂脑的发生:

 

  1)同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个线路还是好的,依然能传送消息(推荐的)

 

  2)检测到裂脑的时候强行的关闭一个心跳节点(需要特殊的节点支持,如stonithfence),相当于程序上备节点发现心跳线故障,发送关机命令到主节点。

 

  3)做好对裂脑的监控报警(如邮件以及手机短信等),在问题发生的时候能够人为的介入到仲裁,降低损失。当然,在实施高可用方案的时候,要根据业务的实

 

    际需求确定是否能够容忍这样的损失。对于一般的网站业务,这个损失是可控的(公司使用)

 

  4)启用磁盘锁。正在服务一方锁住共享磁盘,脑裂发生的时候,让对方完全抢不走共享的磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的乙

 

    方不主动解锁,另一方就永远得不到共享磁盘。现实中介入服务节点突然死机或者崩溃,另一方就永远不可能执行解锁命令。后备节点也就截关不了共享的资

 

    源和应用服务。于是有人在HA中涉及了“智能”锁,正在服务的一方只在发现心跳线全部断开时才启用磁盘锁,平时就不上锁了

 

  5)报警报在服务器接管之前,给人员处理留足够的时间

 

    就是1分钟内报警了,但是服务器不接管,而是5分钟之后接管,接管的时间较长。

 

    数据不会丢失,但就是会导致用户无法写数据。

 

  6)报警后,不直接自动服务器接管,而是由人员接管。

 

  7)增加仲裁的机制,确定谁该获得资源,这里面有几个参考的思路:

 

    1)增加一个仲裁机制。例如设置参考的IP,当心跳完全断开的时候,2个节点各自都ping一下参考的IP,不同则表明断点就出现在本段,这样就主动放弃竞

 

      争,让能够ping通参考IP的一端去接管服务。

 

    2)通过第三方软件仲裁谁该获得资源,这个在阿里有类似的软件应用

 

集群技术主要分为三大类:

高可用性(High Available Cluster),:Linux-HA

负载均衡(Load balancing Cluster),:LVSMOSIX

高性能计算(High Performance Computing),:Beowulf

HeartBeat Linux-HA 的高可用性集群软件,它的主要作用是:

安装在 Load Balancer Backup ,运行于 active/standby 模式。

Load Balancer 失效时,Backup 自动激活,成为实际的 Load Balancer

切换到 active 模式时,按顺序启动 Virtual IPIPVS Ldirectord

切换到 standby 模式时,按顺序关闭 LdirectordIPVS Virtual IP

directord

安装 HeartBeat 过程中,已经自动安装了 Ldirectord,它的作用是:

监测 Real Server,Real Server 失效时,把它从 Load Balancer 列表中

删除,恢复时重新添加。

实验环境:两台虚拟机

server1:172.25.50.100

server2:172.25.50.100

所需的安装包:

heartbeat-3.0.4-2.el6.x86_64.rpm heartbeat-libs-3.0.4-2.el6.x86_64.rpm heartbeat-devel-3.0.4-2.el6.x86_64.rpm  ldirectord-3.9.5.1.x86_64.rpm

安装:rpm -ivh *.rpm -y

配置目录:cd /etc/ha.d/

查找文件:rpm -q heartbeat -d

cd /etc/ha.d/

cp /usr/share/doc/heartbeat-3.0.4/authkeys .

cp /usr/share/doc/heartbeat-3.0.4/haresources .

cp /usr/share/doc/heartbeat-3.0.4/ha.cf .

修改配置文件:vim ha.cf

去掉注释:

keepalive 2 #检测心跳 两秒检测一次

deadtime 30 #用于配置对方节点挂掉的时间间隔

warntime 10 #发出最后的心跳警告报文的间隔

initdead 120 #网络启动时间

udpport 694 #广播或者单播通讯使用的udp端口

bcast   eth0 #心跳使用的网络接口

ping 172.25.50.250

respawn hacluster /usr/lib64/heartbeat/ipfail

apiauth ipfail gid=haclient uid=hacluster #设定你指定的的启动进程的权限

保存退出

vim authkeys

打开注释:auth 1 1 crc #有三种算法crc不提供认证 而sha1,md5算法需要密钥来认证 md5消耗的资源最多

vim haresources

在最末尾:server4.example.com IPaddr::172.25.50.100/24/eth0 httpd

把配置好的文件scp到另一台虚拟机

chmod 600  authkeys #修改权限

/etc/init.d/heartbeat start #启动服务

在另一台虚拟机同样进行此操作

 

DRBD的本功能

分布式复制块设备(DRBD 技术)是一种基于软件的,无共享,复制的存储解决方案,在服

务器之间的对块设备(硬盘,分区,逻辑卷等)进行镜像。

DRBD 镜像数据

实习性:当应用对磁盘的数据进行修改时,复制立即发生。

透明性:应用程序的数据存储在镜像设备上是独立和透明的,数据可存储在不同的服务器

上。

同步镜像和异步镜像:同步镜像,当本地发申请进行写操作进行时,同步写到两台服务器

上。异步镜像,当本地写申请已经完成对本地的写操作时,开始对对应的服务器进行写操作。

 

drbd的安装:

yun install gcc flex kernel-devel rpm-build -y #解决安装时的依赖性

安装包:drbd-8.4.2.tar.gz

pmbuild ~ #在家目录生成 rpmbuild 编译所需路径

cp drbd-8.4.0.tar.gz rpmbuild/SOURCES/

tar zxf drbd-8.4.2.tar.gz

cd drbd-8.2.0

执行命令:./configure --enable-spec --with-km

pmbuild -bb drbd.spec #编译生成 drbd rpm

rpmbuild -bb drbd-km.spec #编译 drbd 内核模块

cd ~/rpmbuild/RPMS/x86_64

rpm -ivh * #安装生成的包

拷贝生成的 rpm 包到另一主机,并安装软件包:

scp ~/rpmbuild/RPMS/x86_64/* 172.25.50.200:

rpm -ivh *

以下配置在两台主机上完成:

编辑/etc/drbd.d/drbd.res,修改如下:

resource example {

meta-disk internal;

device /dev/drbd1;

syncer {

verify-alg sha1;

}

net {

allow-two-primaries;

}

on seerver1.example.com {

disk /dev/vg0/lv0;

address 172.25.50.100:7789;

}

on server2.example.com {

disk /dev/vg0/lv0;

address 192.168.0.251:7789;

}

}

在两台虚拟主机上分别执行以下命令:

drbdadm create-md example

/etc/init.d/drbd start

server1上:drbdadm primary example --focre

server2主机上:drbdadm secondary example

在两台主机上查看同步状态:watch cat /proc/drbd

数据同步结束后创建文件系统:mkfs.ext4 /dev/drbd1

server1上:mount /dev/drbd1 /mnt/ 挂载文件系统

scp /etc/passwd /mnt/ #存放数据 便于测试

cd /mn/

ls

lost+found  passwd #可以看到数据

umount /mnt/ #卸载

server1设为secondary server2设为primary

server2上:mount /dev/drbd1

cd /mnt/

ls #可以看到刚才在server1上创建的文件说明数据以及同步过来

注意:两台主机上的/dev/drbd1 不能同时挂载,只有状态为 primary ,才能被挂载使

,而此时另一方的状态为 secondary

如果在此之前在两台虚拟机上做过HA集群实验,一定要不集群和其他启动项关掉,否则会影响heartbeat的安装和启动不成功

自动挂载文件系统:

vim haresources

server4.example.com IPaddr::172.25.50.100/24/eth0  Filesystem::/dev/drvd1::/var/www/html::ext4 httpd

两台虚拟机一样执行此配置

然后两边重启:/etc/init.d/heartbeat restart

df  #可以看到自动挂载/dev/drvd1 /var/www/html