1.Heartbeat作用
Heartbeat可以将资源(IP及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务。在实际生产应用场景中,heartbeat的功能和另一个高可用开源软件keepalived有很多相同之处,但是在实际的业务应用中也是有区别的。
Heartbeat官方地址:http://linux-ha.org/wiki/Main_Page
2.Heartbeat工作原理
通过修改heartbeat软件的配置文件,可以指定哪一台heartbeat服务器做为主服务器,则另一台将自动成为热备服务器。然后在热备服务器上配置heartbeat守护程序来监听来自主服务器的心跳信息。如果热备服务器在指定时间内未监听到来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源和服务的所有权,接管主服务器继续不间断的提供服务,从而达到资源及服务高可用性的目的。 除了主备模式,hertbeat还支持主主的模式,即两台服务器互为主从,这时他们之间会相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未受到对方发送的心跳报文,那么一方就会认为对方失效或者宕机了,这时每个运行正常的主机就会启动自身的资源接管模块来接管运行在对方主机上的资源或者服务,继续为用户提供服务。所谓的业务不间断并不严谨,在故障转移期间也是需要切换时间的,heartbeat的切换时间一般是在5-20秒左右。
切换的常见条件:
(1)服务器宕机。
(2)Heartbeat服务本身故障。
(3)心跳连接故障。
服务故障不会导致切换,可以通过服务宕机把heartbeat服务停掉。
3.Heartbeat心跳连接
我们已经了解了heartbeat服务,至少需要两台主机来完成。那么实现高可用服务,两台机器之间是如何做到互相通信的和相互检监测的呢? 下面是两台heartbeat主机之间通信的一些常用的可行的方法:
(1)串行电缆(首选,缺点是距离不能太远)。
(2)一般以太网电缆两网卡直连(生产环境常用的方式)。
(3)以太网电缆,通过交换机等网络设备连接(次选)。这样做增加了交换机故障点,同时线路不是专用心跳线,容易受其他数据传输的影响,导致心跳报文发送问题。
4.Heartbeat裂脑
4.1 什么是裂脑
由于两台高可用服务器之间在指定时间内无法互相检测到对方的心跳(可能原因是电缆故障导致)而各自启动故障转移功能取得了资源及服务的所有权,而此时的两台高可用服务器都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时启动而发生冲突的严重问题,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这样可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被称为裂脑。也被称为分区集群或大脑垂直分割(splitbrain)。
4.2 导致裂脑的原因
一般来说裂脑的发生有以下几个原因导致:
(1)高可用服务器对之间心跳线链路故障,导致无法正常通信。
a.心跳线坏了(包括断了,老化)。
b.网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)。
c.心跳线间连接的设备故障(交换机及网卡)。
d.仲裁的机器出问题了。
(2)高可用服务器开启了防火墙阻挡了心跳消息传输。
(3)高可用服务器心跳网卡地址等信息配置不正确,导致发送心跳失败。
(4)其他服务配置不宕等原因,如心跳方式不同,心跳广播冲突,软件BUG等。
4.3 防止裂脑发生的8种方法
实际生产环境中,我们可以从下面几个方面来防止裂脑问题的发生。
(1)同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了另一个还是好的,依然能够传送心跳信息(网卡设备和网线设备,推荐使用这种方法)
(2)检测到裂脑时强行关闭一个心跳节点。(这个功能需要特殊设备支持,如Stonith、fence)。相当于程序上发现备节点心跳线故障,发送关机命令到主节点。
(3)做好对裂脑的监控报警(如邮件及手机短信等,值班),在问题发生时第一时间介入仲裁,降低损失。百度监控有上行和下行有一个和人工交互的过程。当然,如果没有人工交互的过程在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失 。对于一般的网站业务,这个损失是可控的。我们也可以第一时间登录出故障的机器,查看什么原因,如果问题很小可以修复。
(4)启用磁盘锁,正在服务一方锁住共享磁盘,“裂脑”发生时让对方完全“抢不走”共享资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动“解锁”,另一方将永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即,正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁,平时就不上锁。
(5)报警报在服务器接管之前给人员处理留足够时间。 1分钟内报警,但是服务器此时没有接管,而是5分钟接管,接管时间较长。数据不会丢,导致用户无法写数据。
(6)报警后,不直接自动服务器接管,而是由人为人员接管。
(7)增加仲裁机制,确定谁该获得资源,这里有几个参数的思路。
a.加一个仲裁机制。假如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参看IP,不通则表明断点就出在本端,不仅心跳线、还有对外服务的本地网络链路断了,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务。Ping不通参考IP的一方可以自动关机,以彻底释放有可能还占用着的一些共享资源(heartbeat也有此功能)。
b.通过第三方软件仲裁谁该获得资源。
4.4 有关fence的说明
Fence只是HA集群环境下的术语,在硬件领域,fence设备其实就是一个智能管理电源管理设备(IPMI)也叫作Intelligent PowerManagement Interface,简单的说就是智能管理设备或远程管理卡。Fence有外部fence和内部fence两种,都是是插到服务器里的不管是内部还是外部fence,这些设备带有以太网口的,用来在HA切换触发时通过网络重启服务器。先说内部设备Fence在不同的服务器的名称是不一样的,以下是不同服务器对应的fence设备名称。
IBM: RSA
HP: ILO
DELL: Idrac
至于外部设备有APC(著名的UPS电源生产商)的PowerSwitch,这是一个以太网口的电源插座,每个插口都对应一个ID号,用来在命令中指定对哪一个ID号上的电源进行切断或者重启。
5.Heartbeat的消息类型
Heartbeat高可用软件有三种消息类型,具体为:
(1)心跳消息
(2)集群转换消息
(3)重传请求
5.1 心跳消息
心跳消息约为150字节的数据包,可能为单播、广播或者多播的方式,控制心跳频率及出现故障要等待多久进行故障转换。
5.2 集群转换消息
ip-request和ip-request-resp 当主服务器恢复在线状态时,通过ip-request消息要求备机释放主服务器失败时备服务器取得的资源,然后备份服务器关闭释放主服务器失败时取得的资源及服务。 备服务器释放主服务器失败时取得的资源及服务后,就会通过ip-request-resp消息通知主服务器它不在拥有该资源及服务,主服务器收到来自备节点的ip-request-resp消息通知后,启动失败时释放的资源及服务,并开始提供正常的访问服务。
5.3 重传请求
Rexmit-request控制重传心跳请求。这种心跳控制消息都使用UDP协议发送到/etc/ha.d/ha.cf文件指定的任意端口或指定的多播端口地址。
6.Heartbeat IP地址接管和故障转移
Heartbeat是通过IP地址接管和ARP广播进行故障转移的。
ARP广播:在主服务器故障时,备用节点接管资源后,会立即强制更新所有客户端本地的ARP表(即清除客户端本地缓存的失败服务器的vip地址和mac地址的解析记录),ARP是地址解析协议。备节点会对局域网进行广播。确保客户端和新的主服务器对话。在局域网里每台机器都有一个ARP表用arp –a可以看到
7.vip/IP别名/辅助ip
真实IP又称为管理IP,一般是配置在物理网卡上的实际IP。在负载均衡及高可用环境中,管理IP是不对外提供服务的,而仅是管理服务器用,如SSH可以通过这个管理IP连接服务器。
VIP是虚拟IP,实际上就是heartbeat临时绑定在物理网卡上的别名IP(heartbeat3以上也可以采用辅助IP),如eth0:x(x为0-255的任意数字),可以在一块网卡上绑定多个别名。这样做的好处就是当提供服务的服务器宕机了,在接管的服务器上会直接会自动配置上同样的VIP提供服务。如果是使用管理IP的话,来回迁移就很难做到,而且管理IP迁移走了,我们就只能去机房连接服务了。VIP的实质就是确保两台服务器各有一个管理IP不动,就是随时可以连上机器,然后增加绑定其他的IP,这样就算VIP迁移走了,也不至于服务器本身连接不上,因为还有管理IP。
手工配置VIP的方法:
Heartbeat2软件默认是使用这个命令来添加VIP的
ifconfig eth0:1 192.168.1.131 netmask 255.255.255.0 up(IP别名)
Keepalved软件默认使用这个命令来添加VIP,heartbeat3采用的方案
ip addr add 10.0.12.1/24 broadcast 10.0.12.255 dev eth0:1(辅助IP)
手工删除VIP的方法:
ifconfig eth0:1 10.0.0.1 netmask 255.255.255.0 down (ip别名)
ip addr del 10.0.12.1/24 broadcast 10.0.12.255 dev eth0:1(辅助IP)
8.Heartbeat脚本默认目录
启动脚本:/etc/init.d/ (特别使用yum安装的时候)
重要资源目录:/etc/ha.d/resource.d/ 如果以后自己开发程序就放在这个地方,然后heartbeat在haresource文件里直接调用。
[root@heartbeat-1-130 ha.d]# ll /etc/ha.d/resource.d/
总用量 96
-rwxr-xr-x 1 root root 828 12月 3 2013 apache
-rwxr-xr-x 1 root root 805 12月 3 2013 AudibleAlarm
-rwxr-xr-x 1 root root 760 12月 3 2013 db2
-rwxr-xr-x 1 root root 910 12月 3 2013 Delay
-rwxr-xr-x 1 root root 1903 12月 3 2013 Filesystem
-rwxr-xr-x 1 root root 2325 12月 3 2013 hto-mapfuncs
-rwxr-xr-x 1 root root 3488 3月 3 23:31 httpd
-rwxr-xr-x 1 root root 951 12月 3 2013 ICP
-rwxr-xr-x 1 root root 3424 12月 3 2013 ids
-rwxr-xr-x 1 root root 2273 12月 3 2013 IPaddr
-rwxr-xr-x 1 root root 1825 12月 3 2013 IPaddr2
-rwxr-xr-x 1 root root 1391 12月 3 2013 IPsrcaddr
-rwxr-xr-x 1 root root 1165 12月 3 2013 IPv6addr
-rwxr-xr-x 1 root root 1091 12月 3 2013 LinuxSCSI
-rwxr-xr-x 1 root root 790 12月 3 2013 LVM
-rwxr-xr-x 1 root root 1125 12月 3 2013 MailTo
-rwxr-xr-x 1 root root 2926 12月 3 2013 OCF
-rwxr-xr-x 1 root root 742 12月 3 2013 portblock
-rwxr-xr-x 1 root root 1160 12月 3 2013 Raid1
-rwxr-xr-x 1 root root 1563 12月 3 2013 SendArp
-rwxr-xr-x 1 root root 1012 12月 3 2013 ServeRAID
-rwxr-xr-x 1 root root 1294 12月 3 2013 WAS
-rwxr-xr-x 1 root root 1166 12月 3 2013 WinPopup
-rwxr-xr-x 1 root root 666 12月 3 2013 Xinetd
提示:把脚本放到上面两个路径其中任意一个下面,然后在heartbeat的haresource配置文件中配置脚本名称就能调用到该脚本,进而控制资源和服务的启动和关闭。
9.Heartbeat配置文件
Heartbeat的默认配置文件目录为/etc/ha.d,常用的配合文件有3个,分别为ha.cf、authkey、haresource。
有关heartbeat的介绍可以查看下面文章
https://www.linuxidc.com/Linux/2017-02/140554.htm
https://www.aliyun.com/jiaocheng/131309.html