heartbeat
http://linux-ha.org/wiki/Main_Page
heartbeat简介及作用
heartbeat是一款开源提供高可用(High-Available)服务的软件。
通过HeartBeat,可以将资源(IP以及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用的服务。
在实际的生产应用场景中,heartbeat的功能和另一个高可用的开源软件keepalived有很多的相同之处,在我们实际的生产业务中也是有区别的。
例如:keepalived主要是控制IP的漂移、配置,应用简单,而heartbeat则不但可以控制IP漂移,更擅长对资源服务的控制(CRM - 集群资源管理),应用比较复杂。
heart工作原理
通过修改heartbeat软件的配置文件,可以指定哪台heartbeat服务器作为主服务器,则另一台将自动成为热备服务器。
然后热备服务器上配置heartbeat守护程序来监听来自主服务器的心跳消息,如果热备服务器在指定之间内未监听到来自主服务器的心跳,就会启动故障转移程序,
并取得主服务器上的相关资源服务器的所有权(启VIP、启应用),接替主服务器继续不间断的提供服务,从而达到资源及服务器高可用的目的。(如果设置了回切参数,主恢复时,会切回)
以上描述为heart主备模式,heartbeat还支持主主模式(配置不同业务),即两台服务器互为主备时。这时他们之间会相互发送报文来告诉对方自己当前的状态,
如果在指定的时间内未收到对方发送的心跳报文,那么,一方就会认为对方失效或者宕机,这时每个运行正常的主机就会启动自身的资源接管模块来接管运行在对方主机上的资源或者服务,继续为用户提供服务。
一般情况下,可以较好的实现一台主机故障后,企业业务仍能够不间断的持续运行。注意,所谓的业务不间断,在故障转移期间也是需要切换时间的,heartbeat的主备高可用的切换时间一般是5-20秒左右。 另外:和keeplive服务一样,heartbeat高可用是服务器级别的,不是服务级别的。可以通过简单脚本,实现软件级别的高可用。 切换的常见场景: 服务器物理宕机。(硬件损坏、OS故障) #高可用软件主要解决的目标 heartbeat服务本身故障。 心跳连接故障。 服务故障不会导致切换,可以通过服务宕机把heartbeat服务停掉。
heartbeat心跳连接
要部署heartbeat服务,至少需要两台主机来完成,那么,要实现高可用服务,这两台主机之间是如何做到互相通信和互相监测的呢? 下面是两台heartbeat主机之间通信的一些常用的可行方法: 1、 串行电缆,即串口线连接两台服务器(可选)#距离不能远 /dev/ttvS0 2、 一根以太网电缆两网卡直连(可选) #配置好IP即可,建议与生产不同网段 3、 以太网电缆,通过交换机等网络设备连接(次选,增加了交换机故障点,同时线路不是专用心跳线,容易受其他数据传输的影响,导致心跳报文发送问题)
提示:如果条件允许,上述连接可同时使用,来加大保险系数防止脑裂问题 选择方案小结:1、和数据相关业务,要求较高,可以串口和网线直连方式并用 2、web业务,可以网线直连的方式或局域网通信方式也可
heartbeat裂脑
什么是脑裂 由于两台高可用服务器之间在指定的时间内,无法互相检测到对方心跳而各自启动故障转移功能,取得了资源及服务器的所有权,而此时的两台高可用服务其对都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时启动而发生冲突的严重问题,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能分别写入到两端,这样可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被称为脑裂,也有人称其为分区集群或大脑垂直分割,英文为splitbrain。 导致脑裂发生的多种原因 一般来说,脑裂的发生,有以下几个原因导致 1、高可用服务器对之间心跳线链路故障,导致无法通信 a、心跳线坏了 b、网卡及相关驱动坏了,IP配置及冲突问题 c、心跳线间连接的设备故障 d、仲裁的机器出问题 2、高可用服务器对上开启了防火墙阻挡了心跳消息传输 3、高可用服务器对上心跳网卡地址等信息配置不正确,导致发送心跳失败 4、其他服务配置不当等原因,如心跳方式不同,心跳广播冲突、软件BUG等 实际生产环境中,我们可以从以下几个方面来防止脑裂问题的发生 1、同时使用串行电缆和以太网电缆连接,同时用两条心跳线路 2、检测到脑裂时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith、fence)。相当于程序上备节点发现心跳线故障,发送关机命令到主节点。 3、做好脑裂的监控报警(邮件、手机、值班),在问题发生时人为第一时间介入仲裁,降低损失。百度监控有上行和下行,和人工交互的过程。
当然在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失,对于一般的网站常规业务,这个损失可控。 4、启用磁盘锁。正在服务一方锁住共享磁盘,裂脑发生时,让对方完全抢不走共享磁盘资源。但使用锁磁盘也会有个不小的问题,如果占用共享盘的一方不主动“解锁”,另一方就永远得不到共享磁盘。
现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令,后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能锁”。即,正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁,平时就不上锁。 5、报警报在服务器接管之前,给人员处理留足够时间。(报警后5分钟接管) 6、报警后,不直接自动服务器接管,而是由人为控制接管 7、增加仲裁机制,确定谁该获的资源,这有几个参考思路 a、加一个仲裁机制。例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点在本端不仅心跳线,还有对外服务的本地网络链路断了,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务。
ping不通参考IP的一方可以自我重起以彻底释放有可能还占用着的那些共享资源(heartbeat也有此功能) b、通过第三方软件仲裁谁该获的资源,这个在阿里集团有类似的软件应用 小结:如何开发程序判断裂脑 1、初步判断,只要备节点出现VIP,告警 (a、主机确实宕机。b、主机没宕,视为裂脑),不管哪个情况,人工查看。 2、严谨判断,备机出现VIP,并且主机及服务还活着,裂脑了。(依赖报警) fence设备 说下内部fence设备,fence只是HA集群环境下的术语 ,在硬件领域,fence设备就是一个智能电源管理设备(IPMI)。以主流的服务器举例,fence设备在不同的服务器中的名称是不一样的,以下是不同品牌服务器对应的fence设备名称 IBM RSA HP ILO DELL iDRAC 小结: 大前提都是主备无法通信(心跳问题)的时候发生 1、各自ping网关,ping不通就自己关机 2、主备和仲裁设备连接,出问题的时候,把各自存活状态写入仲裁设备,由仲裁设备控制主备服务器的电源 Stonith概述(很少用) http://czmmiao.iteye.com/blog/1174667 stonith是“shoot the other node in the head”的首字母简写,它是Heartbeat软件包的一个组件,它允许使用一个远程或“智能的”连接到健康服务器的电源设备自动重启失效服务器的电源,
stonith设备可以关闭电源并响应软件命令,运行Heartbeat的服务器可以通过串口线或网线向stonith设备发送命令,它控制高可用服务器对中其他服务器的电力供应,换句话说,主服务器可以复位备用服务器的电源,备用服务器也可以复位主服务器的电源。 注意:尽管理论上连接到远程或“智能的”循环电源系统的电力设备的数量是没有限制的,但大多数stonith实现只使用两台服务器,因为双服务器stonith配置是最简单的,最容易理解,它能够长时间运行且不会降低系统的可靠性和高可用性。 Stonith事件触发工作步骤 1、当备用服务器听不到心跳时Stontih事件开始。 注意:这并不一定意味着主服务器没有发送心跳,心跳可能有多种原因而没有抵达备用服务器,这就是为什么建议至少需要两条物理路径传输心跳以避免出现假象的原因了。 2、备用服务器发出一个Stonith复位命令到Stonith设备。 3、Stonith设备关闭主服务器的电力供应。 4、一经切断主服务器的电源,它就不能再访问集群资源,也不能再为客户端提供资源,保证客户端计算机不能访问主服务器上的资源,排除可能发生的头脑分裂状态。 5、然后备用服务器获得主服务器的资源,Heartbeat用start参数运行资源脚本,并执行ARP欺骗广播以便客户端计算机发送它们的请求到它的网络接口上。 一旦主服务器完成重启,它会尝试回收它的资源,要求备用服务器释放资源,除非两台服务器都关闭了auto_failback选项
heartbeat消息类型
heartbeat高可用软件在工作过程中,一般来说,有三种消息类型,具体为a、心跳消息 b、集群转换消息 c、重传请求
心跳消息 心跳消息约为150字节的数据包,可能为串口、单播、广播或多播的方式,控制心跳频率及出现故障要等待多久进行故障转换
集群转换消息 ip-request和ip-request-resp 当主服务器恢复在线状态时,通过ip-request消息要求备机释放主服务器失败时备服务器取得的资源,然后备份服务器关闭释放主服务器失败时取得的资源及服务 备服务器释放主服务器失败时取得的资源及服务后,就会通过ip-request-resp消息通知主服务器它不再拥有该资源及服务,主服务器收到来自备节点的ip-request-resp消息通知后,启动失败时释放的资源及服务,并开始提供正常的访问服务。
重传请求消息 rexmit-request控制重传心跳请求。此消息不太重要 提示:以上心跳控制消息都使用UDP协议发送到/etc/ha.d/ha.cf文件指定的任意端口,或指定的多播地址。
heartbeat IP地址接管和故障转移
heartbeat是通过IP地址接管和ARP广播进行故障转移的 ARP广播:在主服务器故障时,备用节点接管资源后,会立即强制更新所有客户端本地的ARP表(即清除客户端本地缓存的失败服务器的vip地址和mac地址的解析记录),确保客户端和新的主服务器对话。 提示:本节提到的客户端机器是和heartbeat高可用服务器在同一网络中的客户机,并不是最终的互联网用户,这里的客户端机器是相对heartbeat高可用服务器对说的 真实IP/VIP/IP别名/辅助IP 真实IP:又称为管理IP,一般是配置在物理网卡上的实际IP,在负载均衡及高可用环境中,管理IP是不对外提供用户访问服务的,而仅是管理服务器用 VIP:是虚拟IP,实际上就是heartbeat临时绑定在物理网上的地别名IP(heartbeat3以上也采用了辅助IP),如eth:0。
在实际生产环境中,需要在DNS配置中把网站域名地址解析到这个VIP地址,提供对外服务。这样做的好处是当提供服务的服务器宕机后,在接管的服务器上会直接自动配置上同样的VIP提供服务。
Heartbeat安装与配置
本次实验IP规划 data-1-1(master) eth0: 192.168.0.91 eth1: 192.168.1.91 ==>不设置DNS及gateway VIP: 192.168.0.191 data-1-2(backup) eth0: 192.168.0.92 eth1: 192.168.1.92 ==>不设置DNS及gateway VIP: 192.168.0.191
两台服务器上配置心跳路由,来实现两台机器检查对端时使用这个心跳线线路检查写入到rc.local(测试中查看到重启并没失效)
添加网卡,配置心跳IP及心跳路由)
data-1-1上 /sbin/route add -host 192.168.1.92 dev eth1
data-1-2上 /sbin/route add -host 192.168.1.91 dev eth1
heartbeat安装
rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm 1>/dev/null
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
yum clean all
yum install heartbeat -y
rpm -qa | grep heartbeat
heartbeat-3.0.4-2.el6.x86_64
heartbeat-libs-3.0.4-2.el6.x86_64
heartbeat目录及主要文件
/etc/init.d/ heartbeat 启动脚本
/etc/ha.d/resource.d/ 资源目录#如果以后自己开发程序,放此处,然后在haresource文件里直接调用
/etc/ha.d/ 常用的配置文件有三个,分别为ha.cf、authkey、haresource
ha.cf 参数配置文件 在这配置heartbeat的一些基本参数
authkey 认证文件 高可用服务其对之间根据对端的authkey,对对端进行认证
haresources 资源配置文件 如配置IP资源及脚本程序,服务等,调用/etc/ha.d/resource.d/下的配置
#cp /usr/share/doc/heartbeat-3.0.4/{authkeys,ha.cf,haresources} /etc/ha.d/
配置文件一 ha.cf
# cat /etc/ha.d/ha.cf
debugfile /var/log/ha-debug #ha调试日志文件位置
logfile /var/log/ha-log #ha日志
logfacility local1 #在rsyslog中使用local1设备接受日志
keepalive 2 #心跳间隔为2秒
deadtime 30 #指定备机在30秒内没有收到主机心跳信息,则接管资源
warntime 10 #指定心跳延迟时间为10秒。当10秒钟内备机不能接收到主节点心跳信号时,就会往日志中写入一个警告日志,但是不会切换
initdead 60 # deadtime*2 #指定heartbeat首次运行后,需要等待120秒才启动主服务器的任何资源,该选项用于解决这种情况产生的时间间隔,取值至少为deadtime的2倍。
单机启动时会遇到绑定vip很慢,为正常现象,该值设置的长的原因#
mcast eth1 225.0.0.1 694 1 0 #设置广播通信使用的端口,694为默认端口号
auto_failback on #用来定义当主节点恢复后,是否将服务自动回切,一般off掉
node data-1-1 #主节点主机名uname -n
node data-1-2 #备节点主机名uname -n
crm no #是否开启Cluster Resource Manager(集群资源管理)功能
配置文件二 authkeys
# Must be mode 600 (chmod 600 authkeys )
# tail -6 /etc/ha.d/authkeys
#auth 1
#1 crc
#2 sha1 HI!
#3 md5 Hello!
auth 1
1 sha1 0145a867ac4d266620cef1e5ed5a7680ec93339c
======================================================= authkeys
#echo oldboy | sha1sum
0145a867ac4d266620cef1e5ed5a7680ec93339c -
md5方法同sha1
crc配置方法
auth 1
1 crc
配置文件三 haresources
# (VIP) IPaddr是/etc/ha.d/resource.d/IPaddr脚本
#tail -2 /etc/ha.d/haresources
data-1-1 IPaddr::192.168.0.191/24/eth0
data-1-2 IPaddr::192.168.0.192/24/eth0
提示:以上配置,实际就是执行/etc/ha.d/resource.d/IPaddr 192.168.0.191/24/eth0脚本
#-->表示初始状态会在data-1-1的物理网卡eth0绑定VIP 192.168.0.191/24
Heartbeat管理
启动data-1-1的heartbeat [root@data-1-1 ~] /etc/init.d/heartbeat start [root@data-1-1 ~] ip addr | grep 192.168.0.19 inet 192.168.0.192/24 brd 192.168.0.255 scope global secondary eth0 #data-1-2上的启动后VIP飘走 inet 192.168.0.191/24 brd 192.168.0.255 scope global secondary eth0
[root@data-1-1 resource.d]# more /var/log/ha-log
Apr 12 18:32:40 data-1-1 heartbeat: [7591]: info: Pacemaker support: no
Apr 12 18:32:40 data-1-1 heartbeat: [7591]: WARN: Logging daemon is disabled --enabling logging daemon is recommended
Apr 12 18:32:40 data-1-1 heartbeat: [7591]: info: **************************
Apr 12 18:32:40 data-1-1 heartbeat: [7591]: info: Configuration validated. Starting heartbeat 3.0.4
Apr 12 18:32:40 data-1-1 heartbeat: [7592]: info: heartbeat: version 3.0.4
Apr 12 18:32:40 data-1-1 heartbeat: [7592]: info: Heartbeat generation: 1491989229
Apr 12 18:32:40 data-1-1 heartbeat: [7592]: info: glib: UDP multicast heartbeat started for group 225.0.0.1 port 694 interface eth1
(ttl=1 loop=0)
Apr 12 18:32:40 data-1-1 heartbeat: [7592]: info: G_main_add_TriggerHandler: Added signal manual handler
Apr 12 18:32:40 data-1-1 heartbeat: [7592]: info: G_main_add_TriggerHandler: Added signal manual handler
Apr 12 18:32:40 data-1-1 heartbeat: [7592]: info: G_main_add_SignalHandler: Added signal handler for signal 17
Apr 12 18:32:40 data-1-1 heartbeat: [7592]: info: Local status now set to: 'up'
Apr 12 18:33:41 data-1-1 heartbeat: [7592]: WARN: node data-1-2: is dead
Apr 12 18:33:41 data-1-1 heartbeat: [7592]: info: Comm_now_up(): updating status to active
Apr 12 18:33:41 data-1-1 heartbeat: [7592]: info: Local status now set to: 'active'
Apr 12 18:33:41 data-1-1 heartbeat: [7592]: WARN: No STONITH device configured.
Apr 12 18:33:41 data-1-1 heartbeat: [7592]: WARN: Shared disks are not protected.
Apr 12 18:33:41 data-1-1 heartbeat: [7592]: info: Resources being acquired from data-1-2.
harc(default)[7614]: 2017/04/12_18:33:41 info: Running /etc/ha.d//rc.d/status status
mach_down(default)[7652]: 2017/04/12_18:33:41 info: Taking over resource group IPaddr::192.168.0.192/24/eth0
ResourceManager(default)[7709]: 2017/04/12_18:33:41 info: Acquiring resource group: data-1-2 IPaddr::192.168.0.192/24/eth0
/usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_192.168.0.191)[7682]: 2017/04/12_18:33:41 INFO: Resource is stopped
Apr 12 18:33:41 data-1-1 heartbeat: [7615]: info: Local Resource acquisition completed.
/usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_192.168.0.192)[7765]: 2017/04/12_18:33:41 INFO: Resource is stopped
ResourceManager(default)[7709]: 2017/04/12_18:33:41 info: Running /etc/ha.d/resource.d/IPaddr 192.168.0.192/24/eth0 start
IPaddr(IPaddr_192.168.0.192)[7930]: 2017/04/12_18:33:41 INFO: Adding inet address 192.168.0.192/24 with broadcast address 192.16
8.0.255 to device eth0
IPaddr(IPaddr_192.168.0.192)[7930]: 2017/04/12_18:33:41 INFO: Bringing device eth0 up
IPaddr(IPaddr_192.168.0.192)[7930]: 2017/04/12_18:33:41 INFO: /usr/libexec/heartbeat/send_arp -i 200 -r 5 -p /var/run/resource-a
gents/send_arp-192.168.0.192 eth0 192.168.0.192 auto not_used not_used 清arp
/usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_192.168.0.192)[7904]: 2017/04/12_18:33:41 INFO: Success
mach_down(default)[7652]: 2017/04/12_18:33:41 info: /usr/share/heartbeat/mach_down: nice_failback: foreign resources acquired
mach_down(default)[7652]: 2017/04/12_18:33:41 info: mach_down takeover complete for node data-1-2.
Apr 12 18:33:41 data-1-1 heartbeat: [7592]: info: mach_down takeover complete.
Apr 12 18:33:41 data-1-1 heartbeat: [7592]: info: Initial resource acquisition complete (mach_down)
harc(default)[8026]: 2017/04/12_18:33:41 info: Running /etc/ha.d//rc.d/ip-request-resp ip-request-resp
ip-request-resp(default)[8026]: 2017/04/12_18:33:41 received ip-request-resp IPaddr::192.168.0.191/24/eth0 OK yes
ResourceManager(default)[8049]: 2017/04/12_18:33:41 info: Acquiring resource group: data-1-1 IPaddr::192.168.0.191/24/eth0
/usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_192.168.0.191)[8077]: 2017/04/12_18:33:41 INFO: Resource is stopped
ResourceManager(default)[8049]: 2017/04/12_18:33:41 info: Running /etc/ha.d/resource.d/IPaddr 192.168.0.191/24/eth0 start
IPaddr(IPaddr_192.168.0.191)[8202]: 2017/04/12_18:33:41 INFO: Adding inet address 192.168.0.191/24 with broadcast address 192.16
8.0.255 to device eth0
IPaddr(IPaddr_192.168.0.191)[8202]: 2017/04/12_18:33:41 INFO: Bringing device eth0 up
IPaddr(IPaddr_192.168.0.191)[8202]: 2017/04/12_18:33:41 INFO: /usr/libexec/heartbeat/send_arp -i 200 -r 5 -p /var/run/resource-a
gents/send_arp-192.168.0.191 eth0 192.168.0.191 auto not_used not_used
/usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_192.168.0.191)[8176]: 2017/04/12_18:33:41 INFO: Success
Apr 12 18:33:51 data-1-1 heartbeat: [7592]: info: Local Resource acquisition completed. (none)
Apr 12 18:33:51 data-1-1 heartbeat: [7592]: info: local resource transition completed.
清空data-1-1的ha-log
启动data-1-2的heartbeat
[root@data-1-2 ~]# /etc/init.d/heartbeat start
[root@data-1-2 ~]# ip addr | grep 192.168.0.19
inet 192.168.0.191/24 brd 192.168.0.255 scope global secondary eth0
[root@test92 ha.d]# ps -ef | grep heartbeat
root 4248 1 0 00:22 ? 00:00:00 heartbeat: master control process
root 4250 4248 0 00:22 ? 00:00:00 heartbeat: FIFO reader
root 4251 4248 0 00:22 ? 00:00:00 heartbeat: write: mcast eth2
root 4252 4248 0 00:22 ? 00:00:00 heartbeat: read: mcast eth2
再次查看data-1-1的ha-log
[root@data-1-1 resource.d]# more /var/log/ha-log
Apr 12 18:40:26 data-1-1 heartbeat: [7592]: info: Link data-1-2:eth1 up. 心跳
Apr 12 18:40:26 data-1-1 heartbeat: [7592]: info: Status update for node data-1-2: status init
Apr 12 18:40:26 data-1-1 heartbeat: [7592]: info: Status update for node data-1-2: status up
harc(default)[8302]: 2017/04/12_18:40:26 info: Running /etc/ha.d//rc.d/status status
harc(default)[8320]: 2017/04/12_18:40:26 info: Running /etc/ha.d//rc.d/status status
Apr 12 18:40:28 data-1-1 heartbeat: [7592]: info: Status update for node data-1-2: status active
harc(default)[8337]: 2017/04/12_18:40:28 info: Running /etc/ha.d//rc.d/status status
Apr 12 18:40:29 data-1-1 heartbeat: [7592]: info: remote resource transition completed.
Apr 12 18:40:29 data-1-1 heartbeat: [7592]: info: data-1-1 wants to go standby [foreign]
Apr 12 18:40:29 data-1-1 heartbeat: [7592]: info: standby: data-1-2 can take our foreign resources
Apr 12 18:40:29 data-1-1 heartbeat: [8355]: info: give up foreign HA resources (standby).
ResourceManager(default)[8368]: 2017/04/12_18:40:29 info: Releasing resource group: data-1-2 IPaddr::192.168.0.192/24/eth0
ResourceManager(default)[8368]: 2017/04/12_18:40:29 info: Running /etc/ha.d/resource.d/IPaddr 192.168.0.192/24/eth0 stop
IPaddr(IPaddr_192.168.0.192)[8431]: 2017/04/12_18:40:30 INFO: IP status = ok, IP_CIP=
/usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_192.168.0.192)[8405]: 2017/04/12_18:40:30 INFO: Success
Apr 12 18:40:30 data-1-1 heartbeat: [8355]: info: foreign HA resource release completed (standby).
Apr 12 18:40:30 data-1-1 heartbeat: [7592]: info: Local standby process completed [foreign].
Apr 12 18:40:30 data-1-1 heartbeat: [7592]: WARN: 1 lost packet(s) for [data-1-2] [11:13]
Apr 12 18:40:30 data-1-1 heartbeat: [7592]: info: remote resource transition completed.
Apr 12 18:40:30 data-1-1 heartbeat: [7592]: info: No pkts missing from data-1-2!
Apr 12 18:40:30 data-1-1 heartbeat: [7592]: info: Other node completed standby takeover of foreign resources.
heartbeat3.0.4资源接管与释放命令
资源释放
# /usr/share/heartbeat/hb_standby --help usage: /usr/share/heartbeat/hb_standby [all|foreign|local|failback] 资源接管 # /usr/share/heartbeat/hb_takeover --help usage: /usr/share/heartbeat/hb_takeover [all|foreign|local|failback]
初始状态 [root@data-1-1 ~]# ip addr | grep 192.168.0.19 inet 192.168.0.191/24 brd 192.168.0.255 scope global secondary eth0 [root@data-1-2 ~]# ip addr | grep 192.168.0.19 inet 192.168.0.192/24 brd 192.168.0.255 scope global secondary eth0
[root@data-1-1 ~]# /usr/share/heartbeat/hb_takeover all #运行后data-1-1接管全部资源
[root@data-1-1 ~]# ip addr | grep 192.168.0.19
inet 192.168.0.191/24 brd 192.168.0.255 scope global secondary eth0
inet 192.168.0.192/24 brd 192.168.0.255 scope global secondary eth0
[root@data-1-2 ~]# /usr/share/heartbeat/hb_takeover local
[root@data-1-2 ~]# ip addr | grep 192.168.0.19 #运行后data-1-2将自有资源接回
inet 192.168.0.192/24 brd 192.168.0.255 scope global secondary eth0
heartbeat 实现web高可用
在data-1-1 data-1-2安装httpd 1、#yum install httpd 2、#echo "heartbeat test" >/var/www/html/index.html 3、#service httpd start ====已经实现了keepalive的功能,ip漂移实现高可用
在data-1-1 data-1-2上配置haresources文件 #vi /etc/ha.d/haresources 两端同样配置,通过VIP 192.168.0.191对外服务 data-1-1 IPaddr::192.168.0.191/24/eth0 httpd #data-1-2 IPaddr::192.168.0.192/24/eth0 在data-1-2上停止httpd [root@data-1-1 ~]# /etc/init.d/heartbeat stop #data-1-1停止heart服务 [root@data-1-2 ~]# ip addr | grep 91 #可以看到IP已经漂移过来,httpd服务也已经启动,可以继续通过VIP 192.168.0.191 inet 192.168.0.191/24 brd 192.168.0.255 scope global secondary eth0 [root@data-1-2 ~]# more /var/log/ha-log Apr 13 08:55:37 data-1-2 heartbeat: [4838]: info: Received shutdown notice from 'data-1-1'. Apr 13 08:55:37 data-1-2 heartbeat: [4838]: info: Resources being acquired from data-1-1. Apr 13 08:55:37 data-1-2 heartbeat: [6588]: info: acquire local HA resources (standby). Apr 13 08:55:37 data-1-2 heartbeat: [6589]: info: No local resources [/usr/share/heartbeat/ResourceManager listkeys data-1-2] to acq uire. Apr 13 08:55:37 data-1-2 heartbeat: [6588]: info: local HA resource acquisition completed (standby). Apr 13 08:55:37 data-1-2 heartbeat: [4838]: info: Standby resource acquisition done [foreign]. harc(default)[6614]: 2017/04/13_08:55:37 info: Running /etc/ha.d//rc.d/status status mach_down(default)[6631]: 2017/04/13_08:55:37 info: Taking over resource group IPaddr::192.168.0.191/24/eth0 ResourceManager(default)[6658]: 2017/04/13_08:55:37 info: Acquiring resource group: data-1-1 IPaddr::192.168.0.191/24/eth0 httpd /usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_192.168.0.191)[6686]: 2017/04/13_08:55:38 INFO: Resource is stopped ResourceManager(default)[6658]: 2017/04/13_08:55:38 info: Running /etc/ha.d/resource.d/IPaddr 192.168.0.191/24/eth0 start IPaddr(IPaddr_192.168.0.191)[6811]: 2017/04/13_08:55:38 INFO: Adding inet address 192.168.0.191/24 with broadcast address 192.16 8.0.255 to device eth0 IPaddr(IPaddr_192.168.0.191)[6811]: 2017/04/13_08:55:38 INFO: Bringing device eth0 up IPaddr(IPaddr_192.168.0.191)[6811]: 2017/04/13_08:55:38 INFO: /usr/libexec/heartbeat/send_arp -i 200 -r 5 -p /var/run/resource-a gents/send_arp-192.168.0.191 eth0 192.168.0.191 auto not_used not_used /usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_192.168.0.191)[6785]: 2017/04/13_08:55:38 INFO: Success ResourceManager(default)[6658]: 2017/04/13_08:55:38 info: Running /etc/init.d/httpd start mach_down(default)[6631]: 2017/04/13_08:55:38 info: /usr/share/heartbeat/mach_down: nice_failback: foreign resources acquired mach_down(default)[6631]: 2017/04/13_08:55:38 info: mach_down takeover complete for node data-1-1. Apr 13 08:55:38 data-1-2 heartbeat: [4838]: info: mach_down takeover complete. Apr 13 08:56:08 data-1-2 heartbeat: [4838]: WARN: node data-1-1: is dead Apr 13 08:56:08 data-1-2 heartbeat: [4838]: info: Dead node data-1-1 gave up resources. Apr 13 08:56:08 data-1-2 heartbeat: [4838]: info: Link data-1-1:eth1 dead.
提示:heart控制服务脚本要求(以httpd为例)
1、脚本路径放入/etc/init.d 或者/etc/ha.d/resource.d/
2、脚本执行要以/etc/init.d/httpd start/stop方式
3、脚本要可执行权限
4、/etc/init.d/httpd名字和/etc/ha.d/haresources中一致
另外,如果http服务停不掉,会导致系统重启
heartbeat调用资源的生产场景的应用
在实际工作中有两种常见方法实现高可用问题 1、heartbeat可以仅控制vip资源的漂移,不负责服务资源的启动与停止------>适合web服务 2、heartbeat既控制vip资源的漂移,同时又控制服务资源的启动与停止----->适合数据服务(数据库和存储)只能一端写。 上述http高可用中,heartbeat正常,web服务宕了,这时候不会做高可用切换。可以写个简单的脚本定时或守护进程判断web服务,如果有问题,则停止heartbeat,主动使其上的业务切换到另一台 3、对于两端服务需要同时起的,最好不要交给heartbeat,上述http高可用中,两端的服务其实可以同时启动状态,所以可以不用交给heartbeat进行资源管理
heartbeat 和keepalived的应用场景的区别
1、对于一般的web、db、负载均衡(nginx,haproxy)等,heartbeat 和keepalived都可以实现 2、lvs负载均衡最好和keepalived结合,虽然heartbeat也可以调用带有ipvsadm命令脚本来启动和停止lvs负载均衡,但是heartbeat本身没有对rs的健康检查功能,这个缺陷可以通过ldirectord插件来弥补,所以当你搜索heartbeat+lvs+ldirectord可以有lvs另外的解决方案 3、需要数据同步的高可用性业务最好用heartbeat,如果你解决了数据同步,那么就可以考虑keepalived,例如共享存储或者inotify+rsync,那么就可以考虑keepalived 4、运维人员对哪个更熟悉就用哪个,其实就是你要能控制维护你部署的服务。目前,总体更倾向于使用keepalived多些
有关企业高可用切换特别说明
高可用服务的切换一般用于主故障备用自动切换接管,快速顶替故障机提供服务的
接管后的善后工作,最好人工处理解决
不管准备多么完善,监控多么智能,一般都不会自动切回主库,而是人工控制,因为这个回切是可控的,有时间准备的,而一开始的主挂导致的切换是突然的不可控的
重要的业务数据是不能来回自动切的,即auto_failback 应该是off状态
有关主的heartbeat是不是开机自启动,这个要具体业务具体分析
负载均衡和高可用服务器一般来说都非常重要,因此,操作时一定要谨慎小心,一定记得事先写好操作步骤及回滚步骤,然后再去实施操作,贸然很容易导致网站宕机影响用户体验,特别是涉及到数据库和存储高可用的heartbeat的维护就更加要小心