高有效性系统没有单故障点。所谓的单故障点是指某个系统构件,它的故障会导致整个系统瘫痪。
Heartbeat的工作原理是:你告诉Heartbeat哪台计算机(即主服务器,primary
server)拥有特定资源,另一台计算机将自动成为备份服务器(backup
server)。然后配置运行在备份服务器上的Heartbeat进程,让它监听来自主服务器的“心博”。如果备份服务器没有听到主服务器的心博,就启动
失败接管,即接管资源的所有权。
运行在备份服务器上的Heartbeat程序可以通过正常的以太网连接检查来自主服务器的心博。但是通常在两台服务器之间将Heartbeat配置成工作于独立的物理连接。这个独立的物理连接可以是串口线,或者另一个以太网连接(通过交叉线或者集线器)。
Heartbeat可以使用一个或多个这样的物理连接。只要有任何一个物理连接上接收到心博,就认为主节点是活动的。高有效性的最佳实践表明应该在多个相互独立的通信路径上传送心博,这有助于防止通信路径成为单故障点。
- 串口连接要比以太网连接更加安全,但是,串口线非常短,两台服务器必须靠得很近,常常放在同一个计算机间。
- 使用一个新的以太网络(或以太交叉线)消除了服务器之间的距离限制。事实上,交叉线要比小型集线器更简便,也更可靠,因为前者不需要外部电源。
使用两个物理路径连接主服务器和备份服务器提供了heartbeat控制信息的冗余度,这是非单故障点配置的需要。服务器之间使用的两个物理路径并不需要是同一种类型,在一种配置中可以将以太网连接和串口线连接放在一起使用。
两个物理连接可以防止由于网络或连接线故障导致的情形,这时两个节点都试图拥有同一资源的所有权。这种情况被称为裂脑(split-brain)。为了避免裂脑,通常采取下面的预防措施:
- 在heartbeat节点之间采用冗余、可靠的物理连接(最好同时使用串口线连接和以太网连接)以传送心博控制消息。
- 第二种措施被称为“shoot the other node in the head”,缩写为STONITH。使用特别的硬件设备可以通过(串口线或网线发送)软件命令切断节点电源。
通常来说,客户机知道提供它们所需资源的服务器的名字(例如mail.mydomain.com或www.mydomain.com),它们使用域名系统(DNS)来查询服务器的IP地址。在Internet或WAN上路由报文时,IP地址被转换为物理网卡地址,即Media Access Control(MAC)地址。
这时,路由器或本地连接的客户机使用地址解析协议(ARP)发出询问:“Who owns this IP
address?”。在接收到使用这个IP地址的计算机的响应后,路由器或本地计算机将IP地址和对应的MAC地址加到内存中所谓的ARP表中,这样就无
须在每次用到这个IP地址时进行询问。一段时间后,大多数计算机都会让未用到的ARP表项过期,保证内存中没有保存未使用(或不精确)的地址。
为了将资源(服务、进程以及相关的IP地址)从一台计算机迁移到另一台计算机,我们需要将IP地址从主服务器迁移到备份服务器。
Heartbeat常使用的方法被称为IP地址接管(有时记为IPAT)。为了实现IPAT,Heartbeat用到从IP地址(在旧版本的Linux内核中称为IP别名)和Gratuitous ARP广播。
前面已经提到,客户机通常使用地址解析协议(ARP)来确认哪个硬件地址拥有特定IP地址,并保存在ARP表中。在主服务器故障时,
Heartbeat程序使用一点小窍门,称为无故ARP(Gratuitous
ARP,GARP)广播,来强制修改这些客户机的ARP表,替换成新的硬件(MAC)地址,从而使客户机能够和备份服务器进行会话。
GARP广播是sneaky ARP广播(broadcasts, remember, are only seen by
locally connected nodes)。GARP广播询问每个连接在网络上的节点,“Who owns this IP
address?”。实际上,这时的ARP请求报文头中的源(回复)IP地址等于要请求的IP地址。这样强制连接到网络的所有节点将ARP表项更换成新的
源地址。
在Heartbeat控制之下的所有脚本称为资源脚本。Heartbeat应该总是可以向资源脚本传递start和stop参数来启动和
停止资源。Heartbeat还应该了解哪台计算机拥有资源。如果计算机拥有资源,则以status参数运行脚本时,返回OK、Running或
running;否则可以返回DOWN或STOPPED。
Stonith,或者称为“shoot the other node in the
head”,(在某些其它的高有效性解决方案中,将这称为Stomith,或者是“shoot the other machine in the
head”。)是Heartbeat包的一个组件,允许系统用连接到健在服务器的一个远程或“智能”电源设备自动复位故障服务器的电源。Stonith设
备可以响应软件命令,切断服务器的电源。在高有效性系统中的一个服务器通过串口线或网线连接到这种设备,服务器上运行Heartbeat,可以控制另一台
服务器的电源供应。换句话说,主服务器可以复位备份服务器的电源,备份服务器也可以复位主服务器的电源。通过复位电源强制让主服务器重启是一种残酷的手
段,但确实是避免裂脑的最安全方式。
Stonith时间发生在备份服务器没有接收到心博信号时:
- 备份服务器发送一个Stonith复位命令到Stonith设备。
- Stonith设备切断主服务器的电源供应。
- 一旦主服务器的电源被切断,它就不再能够访问集群资源,也不能透过网络向客户机提供资源。这保证客户机不能访问主服务器上的资源,从而消除了裂脑的可能性。
- 备份服务器然后获取主服务器的资源。Heartbeat带start参数运行合适的资源脚本,同时进行Gratuitous ARP广播,这样客户机客户机开始将请求发送到备份服务器的网络接口卡。
- 一旦主服务器完成重启,它将尝试要求备份服务器放弃资源的所有权,重新收回它们,除非两个服务器都禁用了auto_failback功能。
即使做了这么多工作,我们还没有完全消除两台服务器的Heartbeat设计中的单故障点。例如,如果只是主服务器失去了和客户机在生成网络上的连接呢?
这时,即便Heartbeat配置一切完好,心博信号会继续传送到备份服务器,不需要发生失败接管。然后,客户机确无法访问主服务器上的资源进程(集群资源)。
我们可以用两种方式来解决这个问题:
- 在主服务器上运行一个外部的监视包,例如Perl程序Mon,并观察公共NIC上的故障情况。如果检测到这个NIC的故障,它应该杀死主服务器上的Heartbeat进程(或者强制让服务器转入standby模式)。备份服务器然后会接管资源。
- 使用ipfail
API插件,该插件在Heartbeat配置文件中指定一个或多个ping服务器。如果主服务器突然无法ping通其中的一个服务器,它就问备份服务器:
“Did you see that ping server go down
too?”如果备份服务器还能够ping到这个服务器,则备份服务器知道主服务器的网络通信不正常了,它就应该接管资源的所有权。