Linux Enterprise Cluster NOtes Ch6 Heartbeat介绍和原理

1. heartbeat是一个软件包,实现HA的功能(目前heartbeat只支持双机的HA)。原理很简单,设定一个primary server,设定一个需要HA的resource,然后将其他的机器(称为backup server)和这台server连起来, backup servers不停的接收来自primary server的heartbeat,一旦heartbeat中断,那么,backup server接替工作。

2. 为了放置primary server和backup server中间通讯的failure,一般我们推荐用多个physical connection来连接两台机器。比如,我们可以将两台机器用以太网直连网线连在一起,用一根串口线连在一起等。这里有张图,附件1:

3. 使用串口线互联机器有一个好处,就是如果我们的primary server被hacker攻入了,那么,hacker无法从primary server以telnet或ssh等方式来登入backup server,这样就保证了backup server的安全性,从而保证业务的正常运转。

4. Partitioned Clusters and STONITH. Partitioned Cluster指的是这种情况:如果primary和backup server之间只有一条物理连接,那么,当这条物理连接失效后,primary和backup server都会认为对方失效了,于是,两台机器都去抢着获得resource的控制权,这是十分危险的事情。为了避免这种情况的发生,有两种解决方法: (1)建立多个物理连接,也就是上面所说的。(2)建立一种机制(通过硬件实现也好,软件实现也好),可以让我们非常快的关闭掉一台server,这种机 制就被称为STONITH-中文就是“爆头”,HOHO。Heartbeat软件可以实现一种Stonith配置,从而避免partitioned cluster情况的出现。

5. Heartbeat control messages目前有三种:Heartbeats(有时称为status messages)、Cluster transition message和Retransmission requests。

Heartbeats这种message可以通过广播、单一传播和多播的方式发送,每个message只有150个byte长。我们可以控制多长时间发布一次这种消息以及多长时间接收一次。

Cluster Transition Message是一种recovery的消息。这种消息共两个:ip-request和ip-request-resp。当primary server修复能正常工作时,他向backup server发送消息ip-request,backup server得到消息后,释放他控制的资源,并回送ip-request-resp,最后primary server重新取回对资源的控制并开始服务。

Retransmission Requests称为rexmit-request(or ns_rexmit) message,这种消息发生在这种情况下:每个heartbeat消息都会带有一个sequence number,利用这个sequence number,backup server可以判断heartbeat消息是否连续和正确。当backup server收到某个heartbeat不正确时,他会要求primary server重新发送一个不带sequence number的message,以保证primary server是正常工作的(此时不需要sequence number了,因为只需要验证一下primary server是正常工作的即可),所以,ns_rexmit中的ns是non sequence number的意思。

6. 上述的三种message在以太网结构上,heartbeat是通过UDP的方式来发送的。UDP的端口可以在/etc/ha.d/ha.cf文件中定义,多播的地址也可以在该文件中定义。

7. 目前heartbeat只支持双机的HA。但是我们可以将多对HA的server接在一个网段内,此时需要注意每对HA Server发送heartbeat的UDP端口要不一样哦。


8. Heartbeat实现双机切换的原理-Secondary IP Address 或 IP Alias。这两种方法原理差不多,只不过配置的时候不太一样,后面会分别讲述。这种技术叫IP Address Takeover(IPAT),下面会详细解释利用这两种方法怎么实现service migration。

9. Secondary IP address 和 ip alias 在实现HA的时候,原理都是一样的,只不过配置的方法不太一样而已,一个是通过ip这个命令配置,也只能通过ip命令来查看配置结果;另外一个(ip alias)可以通过ifconfig配置和查看。

10. 现来看看HA实现的原理(通过secondary ip和ip alias)。这里有两张图,一看就明白了,看附件1和附件2:

从图上可以很明确的看到了,在正常情况下,primary server上配置了四个IP地址,10.1.1.1是用来和backup server作heartbeat的;209.100.100.2是配置在网卡上的真实IP地址;209.100.100.3, 209.100.100.4这两个是两个secondary ip(或ip alias),这两个IP地址其实也是绑定在209.100.100.2这块网卡上的,这样一来,我们就可以在这两个“假”的IP上分别配置 sendmail和http这样的服务,这样一台服务器在外部看来是两台服务器,分别是sendmail和http服务,其实在后台是一台服务器。此 时,backup server配置了两个IP,10.1.1.2用来做heartbeat,另外一个209.100.100.5是配置在网卡上的真实IP。

现在看第二张图,可以看到,当primary server down掉的时候,backup server立刻也配置了209.100.100.3, 209.100.100.4这两个secondary ip(或ip alias),这样一来,sendmail和http这两个服务就立刻被接管了过来。这样就实现了HA。后面会提到,backup server除了将ip地址takover过来了,此外,也会通过一种叫GARP的协议,通知路由器更新ARP table,让针对这两个IP的MAC地址也更新到backup server网卡的MAC地址上来。

11. 下面开始分别讲解secondary ip和ip alias。通过以下的命令可以查看secondary ip的配置情况:

#ip addr show -- 查看
#ip addr add 209.100.100.3/24 broadcast 209.100.100.255 dev eth0 -- 在eth0上增加一个secondary ip为209.100.100.3/255.255.255.0
#ip addr del 209.100.100.3/24 broadcast 209.100.100.255 dev eth0 -- 删除eth0上的secondary ip

不过在将来真正使用heartbeat的时候,我们不需要手工来输入这些命令,因为heartbeat提供了一个叫做IPaddr2的脚本,我们 只需要在heartbeat的配置文件中配置好secondary ip,那么,这个IPaddr2的脚本会自动为我们调上面的命令行。

12. IP alias. 通过以下命令配置:

#ifconfig eth0:0 209.100.100.3 netmask 255.255.255.0 up -- 配置ip alias eth0:0
#ifconfig -- 查看eth0:0的配置,可以看到MAC地址,中断和资源使用都和eth0一样
#ifconfig eth0:0 down -- remove ip alias

和secondary ip一样,我们不需要手动来输入上面的命令配置,heartbeat提供了一个叫做IPaddr的脚本来帮助我们设置ip alias. 此外,注意,ip alias必须和真实的IP在一个子网,不能跨网段。

13. 注意!!!不要将上述的哪些命令放到Linux系统启动中去,因为heartbeat会帮我们来配置这些secondary ip或ip alias(配置/etc/hd.d/haresouces这个文件),所以,只需要确保heartbeat在linux启动的时候能启动即可,不需要我 们手动在linux启动的时候配置他们。千万注意!!

14. GARP -- Gratuitous ARP。前面已经提到了,backup server光把IP地址接管过来是没有用的,因为路由器的ARP Table表中还保存者IP地址和MAC的对应信息,必须将这些IP地址对应的MAC地址也更新过来。在这种情况下,heartbeat用了一个比较诡异 的做法,使用GARP。他的基本原理是这样的:heartbeat有一个叫做send_arp的程序,利用这个程序发送一个ARP广播,这个广播中将需要 查询的IP地址和MAC地址,以及响应的IP地址都放进去了,就好比这样,这个ARP广播首先在网内询问“209.100.100.3这个IP地址的 MAC地址是什么?”,然后这个广播自问自答“209.100.100.3这个IP地址的MAC地址是XXXXXX”,通过这种办法,路由器就会更新 ARP Table了。

15. 书中很不错,提供了一个实现GARP的脚本,这个脚本会利用到send_arp这个程序:

Code: Select all
#!/bin/bash
#
# iptakeover script
#
# Simple script to take over an IP address.
#
# Usage is "iptakeover {start|stop|status}"
#
# SENDARP is the program included with the Heartbeat program that
# sends out an ARP request. Send_arp usage is:
#
#
SENDARP="/usr/lib/heartbeat/send_arp"
#
# REALIP is the IP address for this NIC on your LAN.
#
REALIP="299.100.100.2"
#
# ROUTERIP is the IP address for your router.
#
ROUTER_IP="299.100.100.1"
#
# SECONDARYIP is the first IP alias for a service/resource.
#
SECONDARYIP1="299.100.100.3"
# or
#IPALIAS1="299.100.100.3"
#
# NETMASK is the netmask of this card.
#
NETMASK="24"
# or
# NETMASK="255.255.255.0"
#
BROADCAST="299.100.100.0"
#
# MACADDR is the hardware address for the NIC card.
# (You'll find it using the command "/sbin/ifconfig")
#
MACADDR="091230910990"
case $1 in
start)
    # Make sure our primary IP is up
    /sbin/ifconfig eth0 $REALIP up
    # Associate the virtual IP address with this NIC
    /sbin/ip addr add $SECONDARYIP1/$NETMASK broadcast $BROADCAST dev eth0
    # Or, to create an IP alias instead of secondary IP address, use the
    command:
    # /sbin/ifconfig eth0:0 $IPALIAS1 netmask $NETMASK up
    # Create a new default route directly to the router
    /sbin/route add default gw $ROUTER_IP
    # Now send out 5 Gratuitous ARP broadcasts (ffffffffffff)
    # at two second intervals to tell the local computers to update
    # their ARP tables.
    $SENDARP -i 2000 -r 5 eth0 $SECONDARYIP1 $MACADDR $SECONDARYIP1 ffffffffffff
;;
stop)
    # Take down the secondary IP address for the service/resource.
    /sbin/ip addr del $SECONDARYIP1/$NETMASK broadcast $BROADCAST dev eth0
    # or
    /sbin/ifconfig eth0:0 down
;;
    status)
    # We check to see if we own the IPALIAS.
    OWN_ALIAS=`ifconfig | grep $SECONDARYIP1`
    if [ "$OWN_ALIAS" != "" ]; then
    echo "OK"
    else
    echo "DOWN"
    fi
;;
# End of the case statement.
    esac


上面的脚本很清楚的展示了这个广播包中包含的内容和如何发送这个广播。我们可以用这个脚本来确认我们的网络能否接受这种GARP的广播。GARP完成后,通过ifconfig命令或是登上路由器,查看其ARP Table的内容可以来确认GARP是否生效了。

16. 前面讲述了heartbeat如何实现双机切换的-通过IP地址的takeover。现在来看到heartbeat原理中另外一个非常重要的部分 -Resource Scripts。这个script是我们自己写的,目的只有一个,就是通过这种方式让heartbeat确切的知道我们的应用的状态,从而 heartbeat完成他的功能。比如说我们想让heartbeat监控我们的http服务(当http服务down掉的时候做双机切换),那么,我们就 需要自己写一个监控http服务的脚本,通过返回不同的关键字,让heartbeat知道我们http服务的运行状态。

17.一个典型的resource script是这样的:

Code: Select all
#!/bin/bashcase $1 in
start)
    commands to start my resource
    ;;
stop)
    commands to stop my resource
    ;;
status)
    commands to test if I own the resource
    ;;
*)
    echo "Syntax incorrect. You need one of {start|stop|status}"
    ;;
esac


18. heartbeat要求一个resource script至少要能对start, stop和status三种输入做出响应,其中start和stop用来给heartbeat控制我们的resource;status用来给 heartbeat判断我们的resource是否active,而且在status的返回信息中,heartbeat有这样的要求,即在status的 返回中,必须返回OK/Running/running这样的字符串,这样heartbeat就会认为这个resource目前是active的,其他的 返回信息heartbeat都会认为resource处于inactive的状态,不过千万注意,不要返回no OK, no Running这样的字符串,如果这样,heartbeat也会认为resource是active的,因为heartbeat是通过在字符串中查找 OK, running这样的字符串来判别的。此外,我们的resource script的return code也必须是0,以告诉heartbeat,脚本正常执行。

19. 当我们写好这样的一个resource script之后,heartbeat就可以知道我们的resource的情况,同时也可以控制这个resource了(resource的相关逻辑由我 们自己定义在resource script中)。将这个script放在/etc/init.d目录或/etc/ha.d/resource.d目录下即可,不过千万注意哦,不要将这 个script放到启动中去,因为heartbeat负责帮我们handle这个resource的启动和关闭的动作。

20. 书中还很体贴的,对resource script的内容给出了一些建议,比如,我们现在要做HA的是sendmail这个service,那么可以用pidof这个命令(RedHat和 SuSE有这个命令)来查询sendmail这个进程是否存在,此外,也可以用ip命令或ifconfig命令来确认secondary ip address和ip alias是否正在正常工作。所有这些写在resource script中的话,都可以帮助我们确定我们的resource是否工作正常,从而给status这个关键参数的输入做出响应。

21. 总结一下,我们需要自己写一个resource script,这个script类似于/etc/init.d中的脚本,这个脚本必须能handle start/stop/status 这些输入参数,从而让heartbeat来控制我们的resource/service。另外,不要将这个script放到启动中去,因为在 heartbeat启动的时候,他会负责调用这个脚本,从而保证我们的resource/service能正常启动。

22. OK,heartbeat的原理已经讲完了,下面我们就会开始配置一个heartbeat,heartbeat的配置文件主要有三个:

/etc/ha.d/ha.cf
Specifies how the heartbeat daemons on each system communicate with each other.

/etc/ha.d/haresources
Specifies which server should normally act as the primary server for a particular resource and which server should own the IP address that client computers will use to access the resource.

/etc/ha.d/authkeys
Specifies how the Heartbeat packets should be encrypted.

下一章我们就开始具体配置一个heartbeat。
 

原文地址:https://www.cnblogs.com/super119/p/2017843.html