heartbeat的双机互备
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了heartbeat的双机互备相关的知识,希望对你有一定的参考价值。
heartbeat快速部署:高可用服务————将资源(IP及程序服务等资源)从一台已经故障的主机上快速转移到另一台正常运转的主机上继续提供服务
配置heartbeat软件的配置文件,指定哪一台heartbeat服务器作为主服务器,另一台作为热备服务器,在热被上配置heartbeat守护程序监听主服务器的心跳信息。(主备模式)
上面是主备模式,另外还可以做主主模式,即两台服务器互为主备,这时他们之间会相互发送报文来告诉对方自己当前的状态
如果在规定的时间内没有收到对方发送过来的心跳报文,就会认为对方挂了,此时就会启动程序接管运行在对方机器上的资源或服务。
heartbeat故障切换时间为5-20s
和keepalived一样。heartbeat也是服务器级别的,不是服务级别。
切换条件:
1、服务器宕机
2、heartbeat服务本身故障
3、心跳线故障
服务故障不会导致切换,但是可以通过服务故障,把heartbeat服务停掉,这样就符合切换条件了
heartbeat心跳连接:
1、串行线缆,即所谓的串口(缺点是两台主机之间不能距离太远)
2、以太网线两台主机上的网卡直连(推荐,但是需要在两台主机上各自做路由)
3、以太网电缆,通过交换机等网络设备连接(次选)
生产环境使用第二种或第一种,或是两种同时使用
脑裂:
两台高可用服务器对在指定的时间内,无法检测到对方的心跳而各自启动故障转移功能,也取得资源及服务所有权,此时两台高可用服务器都活着,就会导致同一个IP或服务在两端同时启动而发生冲突,后果很严重!!!
最严重的情况:两台高可用主机占用同一个VIP,当用户写入数据时,可能会导致数据分别写到两端,这样会导致服务器两端数据不一致造成数据丢失
脑裂发生的原因:本质原因是备节点接收不到主节点的心跳信息
1、高可用服务对之间心跳链路故障,导致无法正常通行
a、心跳线坏了(断了、老化)
b、网卡及相关驱动坏了,IP配置冲突(网卡直连)
c、心跳线之间连接的设备故障(网卡或交换机)
d、仲裁机出问题
2、高可用服务对机器上开启了防火墙,阻挡了心跳信息
3、高可用服务对机器上心跳网卡地址信息配置不正确,导致心跳信息发送失败
4、其他服务配置不当,如心跳方式不同,心跳广播冲突等
防止脑裂发生的措施:
1、做心跳线冗余,即同时使用串行电缆和以太网电缆连接
2、一旦检测到脑裂,强行关闭一个心跳节点(需要特殊设备,stonith、fence等),相当于程序上备节点发现心跳线故障,发送关机命令到主节点
3、做好对脑裂的监控,一旦接到告警,认为第一时间介入仲裁,降低损失
4、启用磁盘锁,正在服务的一方锁住共享磁盘,脑裂发生时,对方完全抢不走共享磁盘资源
5、告警在服务器接管之前,给人员留足够的时间去处理
6、告警后,不直接自动接管,而由人为人员控制接管
7、增加仲裁机制,确定该有哪台主机获得资源
heartbeat心跳控制消息类型:
1、心跳信息
2、集群转换信息
3、重传请求
心跳信息:约150字节的数据包,可能是单播、广播、多播的方式,控制心跳频率及出现故障等待多久进行故障转换
集群转换信息:ip-request和ip-request-resp
当主服务器恢复在线状态时,通过ip-request消息,请求备机释放主服务器失败时备服务器取得资源,备服务器释放之前从主服务器取得的资源及服务
当备服务器释放之前从主服务器取得的资源及服务后,就会通过ip-request-resp消息通知主服务器它不再拥有该资源及服务,主服务器接收到来自备节点的ip-request-resp消息后,启动接管程序,接管会之前释放的资源及服务
重传请求:rexmit-request,控制重传心跳请求
上述的三种心跳控制信息都使用UDP协议发送到/etc/ha.d/ha.cf文件指定的任意端口,或指定的多播地址
heartbeat是通过IP地址接管和ARP广播进行故障转移的:
arp广播:在主节点出现故障时,备用节点接管资源后,会立即强制更新所有客户端本地的ARP表(即清除客户端段本地缓存的失败服务器的vip地址和mac地址的解析记录),以确保客户端和服务端新的主服务对话。
管理IP和虚拟IP即VIP(别名IP、辅助IP)
管理IP:绑定在物理网卡上的真实IP,在高可用及负载均衡环境中,管理IP不对外提供用户服务
别名IP:使用 ifconfig eth0:1 10.0.0.21 netmask 255.255.255.0 up (使用ifconfig指令设置的称为别名IP)
辅助IP:使用 ip addr add 10.0.0.21/24 broadcast 10.0.0.255 dev eth1 (使用ip指令设置的称为辅助IP)
注意:
1、KeepAlived和Heartbeat3(heartbeat2使用的是别名)采用的都是辅助IP
2、ip addr 可以查看别名ip和辅助IP;ifconfig只能查询别名IP
heartbeat脚本默认目录:
启动脚本:/etc/init.d/
资源目录:/etc/ha.d/resource.d/ #很重要的资源目录,以后自己开发的程序,放在这里
默认配置文件目录:/etc/ha.d/
ha.cf 参数配置文件 配置heartbeat的一些基本参数
authkey 认证文件 高可用服务器对之间根据对端的authkey,对对端进行验证
haresource 资源配置文件 如配置IP资源及脚本程序等
heartbeat分支:
从2.1.4版本开始,HA分成了3个分支:Heartbeat(最正宗),Cluster Glue,Resource Agents
之前的Heartbeat CRM维护成Pacemaker
高可用负载均衡常见组合:
LVS+keepalive
HAProxy+Heartbeat
nginx+Heartbeat
高可用组合:
heartbeat+mysql+drbd
heartbeat+其他应用软件
高可用至少2台主机,负载均衡可以一台
数据库中: 如果自己有两个主,可使用keepalived,如果是1主多重使用Heartbeat。
存储中: 多使用heartbeat(可以对NFS以及向她相关的存储做高可用,也可以对MFS分布式存储做高可用)
在数据库和存储中涉及到资源同步的heartbeat都擅长,可以配合DRBD做底层的数据同步
搭建环境:
主节点:
eth0 10.0.0.25 web01 管理IP,用于wan数据转发,web01是主机名
eth1 172.16.1.25 用于服务器之间心跳线直连
VIP 10.0.0.27 提供程序A挂载服务
备节点:
eth0 10.0.0.26 web02 web02是主机名
eth1 172.16.1.26 用于服务器之间心跳线直连
VIP 10.0.0.28 提供程序B挂载服务
其中两个服务器的eth1是通过网线直连的(用于心跳检测,配置文件/etc/ha.cf可配置使用多播),而VIP要设置在eth0上,和eth0上原本的IP地址保持在一个网段
配置建议:将内外网配置成后8位相同,网卡做绑定,提升网卡性能
配置hosts文件:
将上述ip和主机名对应解析到各自的hosts文件中,然后测试解析(ping 主机名 返回对应的ip地址)
注意:解析结果必须要和uname -n 保持一致
配置路由:这里配置路由主要是为了让两张网卡通过心跳线直连
master:route add -host 172.16.1.26 dev eth1
slave: route add -host 172.16.1.25 dev eth1
让上述路由配置永久生效(3种方法)
1、写入到/etc/rc.local文件中(重启主机依然生效、重启网卡失效)
2、写入到/etc/sysconfig/network-script/route-eth1文件内(重启主机依然生效、重启网卡依然生效)
3、写入到/etc/sysconfig/network-script/static-routes文件内(重启主机依然生效、重启网卡依然生效)
这里配置为host而不是为net配置路由,主要是让该路由仅用于心跳信息
开始部署:
1、安装
yum install heartbeat -y #两台主机上都要执行
2、复制配置文件模板到/etc/ha.d/目录下
cp -a /usr/share/doc/heartbeat-3.0.4/{ha.cf,haresources,authkeys} /etc/ha.d/
配置ha.cf文件:
vim /etc/ha.d/ha.cf
debugfile /var/log/ha-debug #调试日志存放的位置
logfile /var/log/ha-log #heartbeat日志存放的位置
logfacility local0 #rsyslog中配置通过local1设备接收日志
keepalive 2 #心跳间隔时间(即每2s在eth1发送一次广播)
deadtime 30 #备节点30秒没有接收到主节点信号,认为主节点挂了,接管VIP
warntime 10 #10s秒备节点没有接收到主节点心跳信号,向日志中写入一条警告信息
initdead 120 #hb首次运行,需等待120秒才启动主节点的资源。至少是deamtime的2倍
udpport 694 #广播通信使用的UDP端口
bcast eth1 #指明心跳使用以太网广播方式在eht1接口上进行广播,可以使用多个接口
mcast eth1 225.0.0.1 694 1 0 #广播通信使用的接口,多播地址最后一个字节最好使用自己的iP的后缀防止冲突,694为UDP端口,1表示ttl,0表示广播包不进行回环
auto_failback on #主节点从故障中恢复后是否要将服务自动切回(on切回,off不切回)
node master-name #主节点主机名,也可使用IP地址
node slave-name #备节点主机名,也可使用IP地址
crm no #是否启用Cluster Resource Manager(集群资源管理)功能
配置authkey文件:authkey文件的权限必须是600
配置认证方式:crc/sha1/md5 共3种,其中crc是明文不建议使用,最佳使用sha1,md5次之
chmod 600 /etc/ha.d/authkey
cat /etc/ha.d/authkey
auth 1
1 sha1 a8fdc205a9f19cc1c7507a60c4f01b13d11d7fd0 #这里的字符串可以随意填写,可使用md5sum,sha1sum等生成
配置haresources文件:
只有1行较为重要
web01 IPaddr::10.0.0.27/24/eth0
web02 IPaddr::10.0.0.28/24/eth0
在web01(集群中节点的名称)这台主机上,使用IPadd脚本(脚步的路径是/etc/ha.d/resource.d/IPaddr)在eth0这块网卡上添加VIP 10.0.0.27/24(这里将VIP添加在eth0上,而不再是用于心跳的eth1上,注意VIP需要和eth0上原本的IP地址10.0.0.8保持在一个网段)
另外一个示例:mysql+drbd+heartbeat
web01 IPaddr::10.0.0.27/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext3 rsdata
web01 主机名
IPadd 位于/etc/ha.d/resource.d/目录下的配置IP的脚本名称
10.0.0.27/24/eth0 集群对外服务的VIP,出事启动在web01上,24位子网掩码,eth0为ip绑定的实际物理网卡,为heartbeat提供对外服务的通信接口,这里相当于执行:/etc/ha.d/resource.d/IPaddr 10.0.0.27/24/eth0 stop/start
drbddisk::data 启动drbd data资源,这里相当于执行:/etc/ha.d/resource.d/drbddisk data stop/start
Filesystem::/dev/drbd0::/data::ext3 drbd分区挂载到/data/目录,
这里相当于自行:/etc/ha.d/resource.d/Filesystem /dev/drbd0 ext3 stop/start
rsdata 启动mysql服务脚本,相当于执行/etc/ha.d/resource.d/rsdata stop/start
如果是自己开发的脚本(放在/etc/ha.d/resource.d/目录中),脚本必须能够传递start和stop这两个参数才可以
使用双冒号:: 分隔,前面是脚本名称,后面是传递的参数
分别启动两台主机上的Heartbeat服务
先在一台机器上启动: /etc/init.d/heartbeat start
ip a|grep -w inet 查看vip是否被设置(是只有27,还是既有27,又有28),第一次启动需要等待120秒后才会被设置
[[email protected] ha.d]# ip a|grep -w inet
inet 127.0.0.1/8 scope host lo
inet 10.0.0.7/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.27/24 brd 10.0.0.255 scope global secondary eth0
inet 10.0.0.28/24 brd 10.0.0.255 scope global secondary eth0
inet 172.16.1.7/24 brd 172.16.1.255 scope global eth1
然后在另一台机器上启动 :/etc/init.d/heartbeat start
ip a|grep -w inet 查看vip(查看是否有28)
[[email protected] ~]# ip a|grep -w inet
inet 127.0.0.1/8 scope host lo
inet 10.0.0.8/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.28/24 brd 10.0.0.255 scope global secondary eth0
inet 172.16.1.8/24 brd 172.16.1.255 scope global eth1
在第一台机器上再次查看是否还有28
[[email protected] ha.d]# ip a|grep -w inet
inet 127.0.0.1/8 scope host lo
inet 10.0.0.7/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.27/24 brd 10.0.0.255 scope global secondary eth0
inet 172.16.1.7/24 brd 172.16.1.255 scope global eth1
然后分别在两台机器上停止其中一台的heartbeat服务,在另一台查看VIP(观察VIP是否被接管)
[[email protected] ha.d]# /etc/init.d/heartbeat stop
[[email protected] ha.d]# ip a|grep -w inet
inet 127.0.0.1/8 scope host lo
inet 10.0.0.7/24 brd 10.0.0.255 scope global eth0
inet 172.16.1.7/24 brd 172.16.1.255 scope global eth1
[[email protected] ~]# ip a|grep -w inet
inet 127.0.0.1/8 scope host lo
inet 10.0.0.8/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.28/24 brd 10.0.0.255 scope global secondary eth0
inet 10.0.0.27/24 brd 10.0.0.255 scope global secondary eth0
inet 172.16.1.8/24 brd 172.16.1.255 scope global eth1
再次启动web02主机上的heartbeat服务:
[[email protected] heartbeat]# /etc/init.d/heartbeat start
[[email protected] ha.d]# ip a|grep -w inet
inet 127.0.0.1/8 scope host lo
inet 10.0.0.7/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.27/24 brd 10.0.0.255 scope global secondary eth0 #再次接管回来
inet 172.16.1.7/24 brd 172.16.1.255 scope global eth1
[[email protected] ~]# ip a|grep -w inet
inet 127.0.0.1/8 scope host lo
inet 10.0.0.8/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.28/24 brd 10.0.0.255 scope global secondary eth0
inet 172.16.1.8/24 brd 172.16.1.255 scope global eth1
这种方式的高可用,在主备之间进行切换时仅转移VIP(不涉及具体的服务,这种形式做高可用,应用服务必须在两台机器上都启动,通常用于web服务,不涉及写数据的服务)
上述主备切换时仅仅是切换VIP,还没有涉及到具体的服务,提供高可用是通过VIP来控制,下面是另一种形式(VIP和应用服务同时切换):
两台主机上的httpd服务都不启动,且也不要开机自启动(交给hearbeart管理):
[[email protected] heartbeat]# /etc/init.d/httpd stop
Stopping httpd: [ OK ]
[[email protected] heartbeat]# chkconfig httpd off
[[email protected] html]# /etc/init.d/httpd stop
Stopping httpd: [ OK ]
[[email protected] html]# chkconfig httpd off
这种形式,由heartbeart控制VIP的切换,同时控制应用服务的启动和停止
[[email protected] html]# cp /etc/init.d/httpd /etc/ha.d/resource.d/ #不拷贝也可以heartbeart也可以找到/etc/init.d/httpd
/etc/ha.d/resource.d/ 是heartbeat的默认脚本目录
[[email protected] ha.d]# ll /etc/ha.d/resource.d/httpd
-rwxr-xr-x 1 root root 3488 Mar 28 21:49 /etc/ha.d/resource.d/httpd
[[email protected] ha.d]# vim haresources #修改这个文件
web02 IPaddr::10.0.0.27/24/eth0 httpd httpd服务的高可用,web02是主,web01是备,httpd是httpd服务的启停脚本名称,必须在/etc/ha.d/resource.d/中存在
web01 IPaddr::10.0.0.28/24/eth0 mysql mysql服务的高可用,web01是主,web02是备,mysql是mysql服务的启停脚本名称,必须在/etc/ha.d/resource.d/中存在
web02上同样进行上述修改
然后暂停两台机器上的heartbeat服务
[[email protected] ha.d]# /etc/init.d/heartbeat stop
[[email protected] ha.d]# lsof -i :80
[[email protected] ha.d]#
[[email protected] ha.d]# /etc/init.d/heartbeat stop
[[email protected] ha.d]# lsof -i :80
[[email protected] ha.d]#
启动heartbeat服务
[[email protected] ~]# ip a|grep -w inet
inet 127.0.0.1/8 scope host lo
inet 10.0.0.7/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.27/24 brd 10.0.0.255 scope global secondary eth0
inet 172.16.1.7/24 brd 172.16.1.255 scope global eth1
[[email protected] ~]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 11029 root 8u IPv6 24640 0t0 TCP :http (LISTEN)
httpd 11031 apache 8u IPv6 24640 0t0 TCP :http (LISTEN)
httpd 11032 apache 8u IPv6 24640 0t0 TCP :http (LISTEN)
httpd 11033 apache 8u IPv6 24640 0t0 TCP :http (LISTEN)
[[email protected] ha.d]# ip a|grep -w inet
inet 127.0.0.1/8 scope host lo
inet 10.0.0.8/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.28/24 brd 10.0.0.255 scope global secondary eth0
inet 172.16.1.8/24 brd 172.16.1.255 scope global eth1
[[email protected] ha.d]# lsof -i :80 #没有结果
此时将web02上的heartbeat服务停掉,然后去web01上查看
[[email protected] ~]# /etc/init.d/heartbeat stop
Stopping High-Availability services: Done.
[[email protected] ~]# ip a|grep -w inet
inet 127.0.0.1/8 scope host lo
inet 10.0.0.7/24 brd 10.0.0.255 scope global eth0
inet 172.16.1.7/24 brd 172.16.1.255 scope global eth1
[[email protected] ~]# lsof -i :80
[[email protected] ha.d]# ip a|grep -w inet
inet 127.0.0.1/8 scope host lo
inet 10.0.0.8/24 brd 10.0.0.255 scope global eth0
inet 10.0.0.28/24 brd 10.0.0.255 scope global secondary eth0
inet 10.0.0.27/24 brd 10.0.0.255 scope global secondary eth0
inet 172.16.1.8/24 brd 172.16.1.255 scope global eth1
[[email protected] ha.d]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 9118 root 8u IPv6 23601 0t0 TCP :http (LISTEN)
httpd 9122 apache 8u IPv6 23601 0t0 TCP :http (LISTEN)
httpd 9123 apache 8u IPv6 23601 0t0 TCP :http (LISTEN)
httpd 9124 apache 8u IPv6 23601 0t0 TCP :http (LISTEN)
httpd 9126 apache 8u IPv6 23601 0t0 TCP *:http (LISTEN) #可以看出VIP和httpd服务都切换到web01备节点上
从上面可知,这两种方式如果vip和httpd服务是同步的,要么都启动,要么都转移
heartbeat控制的脚本要求:
1、脚本要放入/etc/init.d/httpd 或 /etc/ha.d/resource.d/ 这两个目录其中之一(如果两边同时存在,heartbeat启动是使用后者)
2、脚本执行需要以/etc/init.d/httpd stop/start 方式
3、脚本具有可执行权限
4、/etc/init.d/httpd 名称要和 web01 IPaddr::10.0.0.27/24/eth0 httpd 前后两个httpd名称要一样
当然这里的httpd服务也可以替换成nginx、lvs、HAProxy)注意不能直接替换成mysql数据库(除非是实时同步,如使用drbd)
这里也可以是自己写的脚本,只要能够使用/etc/init.d/ stop/start这种格式来启动后关闭就可
这种方式,Heartbeat同时控制VIP的切换和控制服务的开启以及停止
注意: /usr/share/heartbeat目录下各个脚本的使用
[[email protected] heartbeat]# ll /usr/share/heartbeat/
-rwxr-xr-x 1 root root 21417 Dec 3 2013 BasicSanityCheck
-rwxr-xr-x 1 root root 1021 Dec 3 2013 ha_config
-rwxr-xr-x 1 root root 1094 Dec 3 2013 ha_propagate
-rwxr-xr-x 1 root root 652 Dec 3 2013 hb_addnode
-rwxr-xr-x 1 root root 652 Dec 3 2013 hb_delnode
-rwxr-xr-x 1 root root 379 Dec 3 2013 hb_setsite
-rwxr-xr-x 1 root root 393 Dec 3 2013 hb_setweight
-rwxr-xr-x 1 root root 1133 Dec 3 2013 hb_standby #手动执行释放资源
-rwxr-xr-x 1 root root 951 Dec 3 2013 hb_takeover #手动执行接管资源
-rwxr-xr-x 1 root root 1678 Dec 3 2013 mach_down
-rwxr-xr-x 1 root root 2436 Dec 3 2013 req_resource
-rwxr-xr-x 1 root root 10680 Dec 3 2013 ResourceManager
-rwxr-xr-x 1 root root 1518 Dec 3 2013 TestHeartbeatComm
手动释放和接管VIP:
/usr/share/heartbeat/hb_standby 选项
选项有:all(默认,释放所有的VIP),local(仅释放本机为主节点的VIP),foreign(仅释放本机为备节点的VIP),failback(故障恢复,保留本机为主节点的VIP,释放本机为备及节点的VIP,等同于foreign)
/usr/share/heartbeat/hb_takeover 选项
选项有:all(默认,接管所有的VIP),local(仅接管本机为主节点的VIP),foreign(仅接管本机为备节点的VIP),failback(故障恢复,接管所有VIP)
以上是关于heartbeat的双机互备的主要内容,如果未能解决你的问题,请参考以下文章