Heartbeat 高可用软件在工作过程中,一般来说,有三种消息类型,具体为:
心跳消息为约 150 字节的数据包,可能为单播、广播或多播的方式,控制心跳频率及出现故障要等待多久进行故障转换。
ip-request 和 ip-request-resp
当主服务器恢复在线状态时,通过 ip-request 消息要求备机释放主服务器失败时被服务器取得的资源,然后备份服务器关闭释放主服务器失败时取得的资源及服务。
备服务器释放主服务器失败时取得的资源及服务后,就会通过 ip-request-resp 消息通知主服务器它不再拥有该资源及服务,主服务器收到来自备节点的 ip-request-resp 消息通知后,启动失败时释放的资源及服务,并开始提供正常的访问服务。
rexmit-request 控制重传心跳请求。此消息不太重要,细节就不浪费笔墨了。
提示:以上心跳控制消息都使用 UDP 协议发送到 /etc/ha.d/ha.cf 文件制定的任意端口,或制定的多播地址,如果使用多播默认端口为 694。
heartbeat集群心跳配置及mgmt调用修改方法
集群心跳可在文件etc/ha.d/ha.cf中进行配置,如下所示:
node server-1 server-2
bcast eth0
ucast eth1 192.168.127.132
心跳有如下四种类型:串口、广播、多播、ucast,以下分别进行介绍:
#serial 串口名称
#serial /dev/ttyS0 # Linux
#serial /dev/cuaa0 # FreeBSD
#serial /dev/cuad0 # FreeBSD 6.x
#serial /dev/cua/a # Solaris
#广播heartbeats的接口
#bcast eth0 # Linux
#bcast eth1 eth2 # Linux
#bcast le0 # Solaris
#bcast le1 le2 # Solaris
#设置一个多播心跳介质
#mcast [dev] [mcast group] [port] [ttl] [loop]
#[dev]发送/接收heartbeats的设备
#[mcast group]加入到的多播组(D类多播地址224.0.0.0 - 239.255.255.255)
#[port]端口用于发送/接收udp(设置这个值跟上面的udpport为相同值)
#[ttl]外流的heartbeats的ttl值。这个影响多播包能传播多远。(0-255)必须要大于0 。
#[loop]为多播heartbeat开关loopback。如果enabled,一个外流的包将被回环到原处并由发送它的接口接收。(0或者1)设置这个值为0。
#mcast eth0 225.0.0.1 694 1 0
#配置一个unicast / udp heartbeat 介质
#ucast [dev] [peer-ip-addr]
#[dev]用于发送/接收heartbeat的设备
#[peer-ip-addr]包被发送到的对等的IP地址
#ucast eth0 192.168.1.2
Heartbeat 是通过 IP 地址接管和 ARP 广播进行故障转移的。
ARP 广播在主服务器故障时,备节点接管资源后,会立即强制更新所有客户端本地的 ARP 表(即清除客户端本地缓存的失败服务器的 vip 地址和 mac 地址的解析记录)。确保客户端和新的主服务器对话。
虚拟 IP
虚拟 IP 即 VIP,在老男孩看来,这只是个概念而已,可能会误导你,实际上就是 heartbeat 临时绑定在物理网卡上的别名 IP(heartbeat3 以上也采用了辅助 IP),如 eth0:x ,x 为 0-255 的任意数字,你可以在一块网卡上绑定多个别名。这个 VIP 可以看作是你上网的 QQ 网名、昵称、外号等,如:一提到老男孩,很多人都知道我,这个老男孩就是我的网名,在实际生产环境中,需要在 DNS 配置中把网站域名地址解析到这个 VIP 地址,由这个 VIP 对用户提供服务。如: 把 www.baidu.com 解析到 VIP 211.100.98.99 上。
这样做的好处就是当提供服务的服务器宕机以后,在接管的服务器上回直接会自动配置上同样的 VIP 提供服务。如果是使用管理 IP 的话,来回迁移就难以做到,而且,管理 IP 迁移走了。我们就只能取机房连接服务器了。 VIP 的实质就是确保两台服务器各有一个管理 IP 不懂,就是随时可以连上机器,然后,增加绑定其他的 VIP,这样就算 VIP 转移走了,也不至于服务器本身连不上,因为还有管理 IP 呢,读者应该明白了吧?
Linux 系统给网卡配置 VIP 的方法常见的有两种,即别名 IP(alias ip)以及辅助 IP(secondary ip address)。
the Linux kernel supports both IP aliases and secondary IP addresses, though IP aliases are deprecated in favor of secondary IP addresses.
ip alias 和 secondary ip address 是两种不同的实现方式,用来在 Linux 系统中给同一个物理网卡增加多个 ip 地址。
别名 IP (alias ip)
ip alias 是由 Linux 系统的 ifconfig 命令来创建和维护的,别名 IP 就是在网卡设备上绑定的第二个及以上的 IP,例如:
1. 手工配置别名 VIP 的方法
ifconfig eth0:1 10.0.0.7 netmask 255.255.255.0 up # ip alias 这个配置是临时的,重启网卡就丢了。
或者 ifconfig eth0:1 10.0.0.7/24 up
#====> heartbeat 2 软件默认是使用这个命令来添加 VIP 的
[root@ha1 ~]# cat /etc/redhat-release
CentOS release 5.8 (Final)
[root@ha1 ~]# ip addr help
Usage: ip addr {add|del} IFADDR dev STRING
ip addr {show|flush} [ dev STRING ] [ scope SCOPE-ID ]
[ to PREFIX ] [ FLAG-LIST ] [ label PATTERN ]
IFADDR := PREFIX | ADDR peer PREFIX
[ broadcast ADDR ] [ anycast ADDR ]
[ label STRING ] [ scope SCOPE-ID ]
SCOPE-ID := [ host | link | global | NUMBER ]
FLAG-LIST := [ FLAG-LIST ] FLAG
FLAG := [ permanent | dynamic | secondary | primary | tentative | deprecated ]
[root@ha1 ~]# whereis ip
ip: /sbin/ip /usr/share/man/man8/ip.8.gz /usr/share/man/man7/ip.7.gz
[root@ha1 ~]# which ip
/sbin/ip
[root@ha1 ~]# rpm -qf /sbin/ip
iproute-2.6.18-13.el5
2、手工查看 VIP 别名的方法
使用别名的方法配置的 VIP,可通过 ifconfig 查看,也可以通过 ip add 查看。
使用辅助 IP 的方法配置的 VIP,可通过 ip add 查看。
[root@ha1 ~]# ifconfig eth0:0 172.16.1.21 netmask 255.255.255.0 up
[root@ha1 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:11:5D:AF
inet addr:172.16.1.20 Bcast:172.16.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe11:5daf/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2651 errors:0 dropped:0 overruns:0 frame:0
TX packets:172 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:550072 (537.1 KiB) TX bytes:26707 (26.0 KiB)
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:11:5D:AF
inet addr:172.16.1.21 Bcast:172.16.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:336 (336.0 b) TX bytes:336 (336.0 b)
[root@ha1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:11:5d:af brd ff:ff:ff:ff:ff:ff
inet 172.16.1.20/24 brd 172.16.1.255 scope global eth0
inet 172.16.1.21/24 brd 172.16.1.255 scope global secondary eth0:0
inet6 fe80::20c:29ff:fe11:5daf/64 scope link
valid_lft forever preferred_lft forever
[root@ha1 ~]# ip addr add 172.16.1.22/24 dev eth0
[root@ha1 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:11:5D:AF
inet addr:172.16.1.20 Bcast:172.16.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe11:5daf/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2937 errors:0 dropped:0 overruns:0 frame:0
TX packets:229 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:593474 (579.5 KiB) TX bytes:36911 (36.0 KiB)
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:11:5D:AF
inet addr:172.16.1.21 Bcast:172.16.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:336 (336.0 b) TX bytes:336 (336.0 b)
[root@ha1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:11:5d:af brd ff:ff:ff:ff:ff:ff
inet 172.16.1.20/24 brd 172.16.1.255 scope global eth0
inet 172.16.1.21/24 brd 172.16.1.255 scope global secondary eth0:0
inet 172.16.1.22/24 scope global secondary eth0
inet6 fe80::20c:29ff:fe11:5daf/64 scope link
valid_lft forever preferred_lft forever
3、手工删除辅助 IP 的方法
ip addr del 172.16.1.22/24 broadcast 172.16.1.255 dev eth0 #广播地址可以加也可以不加
ip addr del 172.16.1.22/24 dev eth0
小结:
heartbeat 2.1.4 及以前版本使用的是 别名 IP, heartbeat 2.1.4 以后版本 使用的都是 辅助 IP,提供 VIP 服务的。而 Keepalived 一直都是用的辅助 IP 提供服务的。
下面以 yum/rpm 包的方式为例讲解:
heartbeat 启动脚本: /etc/init.d/
[root@ha1 ~]# ll /etc/init.d/heartbeat
-rwxr-xr-x. 1 root root 10485 Dec 3 00:37 /etc/init.d/heartbeat
heartbeat 资源目录: /etc/ha.d/resource.d/ <===脚本,这些控制资源的脚本,用来被 HA 调用,也可以放在 /etc/init.d / 下。
提示:把脚本放到上面两个路径其中任意一个下面,然后在 heartbeat 的 haresource 配置文件中配置脚本名称就能调用到该脚本,进而控制资源和服务的启动和关闭。
heartbeat 配置文件目录:/etc/ha.d/
heartbeat 的默认配置文件目录为 /etc/ha.d。 heartbeat 常见的配置文件有三个,分别为:ha.cf、authkey、haresource,如果你细看,可以发现名字信息就如其实际功能,这里列成表格方便大家学习了解。
配置名称 | 作用 | 备注 |
ha.cf | heartbeat参数配置文件 | 在这里配置 heartbeat 的一些基本参数 |
authkey | heartbeat 认证文件 | 高可用服务器对之间根据对端的 authkey,对对端进行认证。 |
haresource | heartbeat 资源配置文件 | 如配置启动 IP 资源及脚本程序、服务等。调用 /etc/ha.d/resource.d/ 下面的配置 |
重要资源目录:/etc/ha.d/resource.d ,如果以后自己开发程序被 heartbeat 控制,就放在这个地方,然后在 haresource 文件里直接调用。