配置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秒后才会被设置
[root@web02 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)
[root@web01 ~]# 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
[root@web02 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是否被接管)
[root@web02 ha.d]# /etc/init.d/heartbeat stop
[root@web02 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
[root@web01 ~]# 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服务:
[root@web02 heartbeat]# /etc/init.d/heartbeat start
[root@web02 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
[root@web01 ~]# 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管理):
[root@web02 heartbeat]# /etc/init.d/httpd stop
Stopping httpd: [ OK ]
[root@web02 heartbeat]# chkconfig httpd off
[root@web01 html]# /etc/init.d/httpd stop
Stopping httpd: [ OK ]
[root@web01 html]# chkconfig httpd off
这种形式,由heartbeart控制VIP的切换,同时控制应用服务的启动和停止
[root@web01 html]# cp /etc/init.d/httpd /etc/ha.d/resource.d/ #不拷贝也可以heartbeart也可以找到/etc/init.d/httpd
/etc/ha.d/resource.d/ 是heartbeat的默认脚本目录
[root@web01 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
[root@web01 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服务
[root@web01 ha.d]# /etc/init.d/heartbeat stop
[root@web01 ha.d]# lsof -i :80
[root@web01 ha.d]#
[root@web02 ha.d]# /etc/init.d/heartbeat stop
[root@web02 ha.d]# lsof -i :80
[root@web02 ha.d]#
启动heartbeat服务
[root@web02 ~]# 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
[root@web02 ~]# 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)
[root@web01 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
[root@web01 ha.d]# lsof -i :80 #没有结果
此时将web02上的heartbeat服务停掉,然后去web01上查看
[root@web02 ~]# /etc/init.d/heartbeat stop
Stopping High-Availability services: Done.
[root@web02 ~]# 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
[root@web02 ~]# lsof -i :80
[root@web01 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
[root@web01 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目录下各个脚本的使用
[root@web01 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)
原文地址:http://blog.51cto.com/nickfox/2092242