【架构】Heartbeat高可用服务(1)

Heartbeat高可用服务


 

【1】Heartbeat简介

  Heartbeat一款开源提供高可用(Highly-Available)服务的软件,通过Heartbeat,可以将资源(IP及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务。 

  Keepalived主要是控制IP的漂移,配置、应用简单,而Heartbeat则不但可以控制IP漂移,更擅长对资源服务的控制,配置、应用比较复杂。

【2】Heartbeat工作原理及常见切换条件

  Heartbeat的主备高可用的切换时间一般是在5-20秒左右(服务器宕机的切换比人工切换要快)。

  另外,和Keepalived高可用软件一样,Heartbeat高可用是操作系统级别的,不是服务(软件)级别的,可以通过简单的脚本控制,实现软件级别的高可用。

  高可用服务器切换的常见条件场景:

  1. 主服务器物理宕机(硬件损坏,操作系统故障)。主要解决目标
  2. Heartbeat服务软件本身故障
  3. 两台主备服务器之间心跳连接故障。

  服务故障不会导致切换,可以通过服务宕机把Heartbeat服务停掉。

【3】Heartbeat心跳线方案及生产场景选择建议

  下面是两台Heartbeat主机之间通信的一些常用的可行方法:

  • 利用串行电缆,即所谓的串口线连接两台服务器(可选)。
  • 一根以太网电缆两网卡直连(可选)
  • 以太网电缆,通过交换机等网络设备连接(次选)。

  如何为高可用服务器端选择心跳通信方案?

  1. 串口线信号不会和以太网网络交集,也不需要单独配置IP地址等信息,因此传输稳定不容易出现问题,使用串口线的缺点是两个服务器之间的距离不能太远。串口线对应服务端的设备为/dev/ttyS0
  2. 使用以太网网线(无需特殊的交叉线了)直连网卡的方式,配置也比较简单,只需对这两块直连网线的网卡配置好独立的IP段地址能够互相通信即可,普通的网线就可以了。
  3. 使用联网以太网网线和网卡作为心跳线是次选的方案,因为这个链路里增加了交换机设备这样的故障点,且这个线路不是专用心跳线路,容易受以太网其他数据传输的影响,导致心跳报文发送延迟或者无法送达问题。

  选择方案小结:

  1. 和数据相关的业务,要求较高,可以串口和网线直连的方式并用。
  2. Web业务,可以网线直连的方式或局域网通信方式也可。

【4】裂脑的概念及原理讲解

  由于某些原因,导致两台高可用服务器对之间在指定时间内,无法互相检测到对方心跳而各自启动故障转义功能,取得了资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时启动而发生冲突的严重问题,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这样可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被称为裂脑。Split brain.

【5】企业场景裂脑发生的多种原因介绍

  导致裂脑发生的多种原因

  • 高可用服务器对之间心跳线链路故障,导致无法正常通信
  1. 心跳线坏了
  2. 网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)
  3. 心跳线间连接的设备故障(网卡及交换机)
  4. 仲裁的机器出问题(仲裁的方案)
  • 高可用服务器对上开启了如iptables防火墙阻挡了心跳信息传输
  • 高可用服务器对上心跳网卡地址等信息配置不正确,导致发送心跳失败。
  • 其他服务配置不当等原因,如心跳方式不同,心跳广播冲突,软件BUG等

  提示:另外的高可用软件Keepalived配置里如果virtual_router_id参数,两端配置不一致,也会导致裂脑问题发生。

【6】防止裂脑发生的8种秘籍

  • 同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能传送心跳信息。(网卡设备和网线设备)
  • 当检测到裂脑时强行关闭一个心跳节点。(这个公跟那个需要特殊设备支持,如Stonlth、fence)。相当于程序上备节点发现心跳故障,发送关机命令到主节点。
  • 做好对裂脑的监控报警(如邮件及手机短信等,值班),在问题发生时人为第一时间介入仲裁,降低损失。百度的报警监控有上行和下行,和人工交互的过程。当然,在事实高可用方案时,要根据业务需求确定是否能容忍这样的损失。对伊一般的网站常规业务,这个损失是可控的。
  • 启动磁盘锁。正在服务一方锁住共享磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动“解锁”,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了“智能”锁。即,正在服务的一方只会发现心跳线全部断开(察觉不到对端)时才启动磁盘锁。平时就不上锁了。此功能适合共享场景。
  • 报警报在服务器接管之前,给人员处理留足够时间。

         1分钟内报警了,但是服务器此时没有接管,而是5分钟接管。接管的时间较长。数据不会丢,导致用户无法写数据。

  • 报警后,不直接自动服务器接管,而是人为人员控制接管。
  • 增加仲裁机制,确定谁该获得资源。这又有几个参考的思路:
    • 加一个仲裁机制。例如设置参考IP(如网卡IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端,不但心跳线、还有对外服务的本地网络链路断了,这样就主动放弃竞争,让能够ping通参考IP的一端去接管服务。ping不通参考IP的一方可以自我重启,以彻底释放有可能还占用着哪些共享资源(heartbeat也有此功能)
    • 通过第三方软件仲裁谁该获得资源,这个在阿里的集团有类似的软件和应用。

  小结:如何开发程序判断裂脑?

    1、简单判断,只要备节点出现VIP就报警。(a,主机宕机了,备机接管了。b.主机没宕机,裂脑了),不管哪个情况,人工查看。

    2、严谨判断,备机出现VIP,并且主机及服务还活着,裂脑了(依赖报警)。

【7】fance介绍

fance只是在HA集群环境下的术语,在硬件领域,fance设备其实就是一个智能电源管理设备(IPMI),远程管理卡或只能电源管理设备。

【8】HA高可用特殊服务概念仲裁机制介绍

  小结:

    大前提都是主备无法通信(心跳问题)的时候发生的。

  1. 各自ping网关,ping不通自己关机。
  2. 主备和仲裁设备连接,出问题的时候,把各自存活状态,写到仲裁设备里,由仲裁设备控制主备服务器的电源。

【9】Stonith介绍及Stonith事件触发流程机制

  Stonith是“shoot the other node in the head”的首字母缩写,它是Heartbeat软件包的一个组件。

  Stonith事件触发工作步骤:

  1、当备用服务器听不到心跳时Stontih事件开始。

  注意:这并不一定意味着主服务器没有发送心跳,心跳可能有多种原因而没有抵达备用服务器,这就是为什么建议至少需要两条物理路径传输心跳以避免出现假象的原因了。  

  2、备用服务器发出一个Stonith复位命令到Stonith设备。

  3、Stonith设备关闭主服务器的电力供应。

  4、一经切断主服务器的电源,它就不能再访问集群资源,也不能再为客户端提供资源,保证客户端计算机不能访问主服务器上的资源,排除可能发生的头脑分裂状态。

  5、然后备用服务器获得主服务器的资源,Heartbeat用start参数运行资源脚本,并执行ARP欺骗广播以便客户端计算机发送它们的请求到它的网络接口上。

【10】Heartbeat消息类型

  Heartbeat高可用软件在工作过程中,一般来说,有三种消息类型,具体为:

  • 心跳消息
  • 集群转换消息
  • 重传消息

  心跳消息

    心跳消息为约150字节的数据包,可能是串口、单播、广播或多播的方式,控制心跳频率及出现故障要等待多久进行故障转换。

  集群转换消息

    ip-request和ip-request-resp

    当主服务器恢复在线状态时,通过ip-request消息要求备机释放主服务器失败时备服务器取得的资源,然后备份服务器关闭释放主服务器失败时取得的资源及服务。

    备服务器释放主服务器失败时取得的资源及服务后,就会通过ip-request-resp消息通知主服务器它不再拥有该资源及服务,主服务器收到来自备节点的ip-request-resp消息通知后,启动失败时释放的资源及服务,并开始提供正常的访问服务。

  重传请求

    rexmit-request控制重传心跳请求。  

  提示:以上心跳控制消息都使用UDP协议发送到/etc/ha.d/ha.cf文件指定的任意端口,或指定的多播地址,如果使用多播默认端口为694。

【11】HA高可用的ARP问题及ARP企业级故障案例介绍

  Heartbeat是通过IP地址接管和ARP广播进行故障转移的。

  ARP广播:在主服务器故障时,备用节点接管资源后,会立即强制更新所有客户端本地的ARP表(即清除客户端本地缓存的失败服务器的VIP地址和mac地址的解析记录)。确保客户端和新的主服务器对话。

【12】管理与虚拟IP介绍

  Linux系统给网卡配置VIP的方式常见的有两种,即别名IP(alias ip)以及辅助IP(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.224 up 

  ifconfig eth0:1 10.0.0.7/24 up 

  #==>heartbeat2软件默认是使用这个命令来添加VIP的。

  2.手工查看VIP别名的方法:

  使用别名的方法配置的VIP,可以通过ifconfig查看,也可以通过ip add查看。

  ifconfig

  3.手工删除别名VIP的方法

  ifconfig eth0:1 124.42.61.109 netmask 255.255.255.224 down

  ifconfig eth0:1 down

  4.让别名IP永久生效

  写入到网卡配置文件可让别名IP永久生效:名字可以为ifcfg-eth0:X,X为0-255的任意数字,IP等内容格式和ifcfg-eth0一致。

  别名IP将被遗弃了。用辅助IP替代。

  辅助IP(secondary ip address)重点掌握

   辅助IP则是由Linux系统的ip命令创建和维护的,ip addr add创建的辅助IP,不能通过ifconfig查看,但是通过ifconfig创建的别名IP却可在ip addr show命令查看。

  1、手工配置辅助VIP的方法:

  ip addr add 10.0.15.1/24 broadcast 10.0.15.255 dev eth0

  ip addr add 10.0.2.1/24 dev eth0

  2、手工查看VIP别名的方法:

  不同的命令配置的VIP查看方法也是有区别的。使用辅助IP的方法配置的VIP,不能通过ifconfig查看,只能通过ip add来查看:

  使用辅助IP的方法配置的VIP,可以通过ip add查看:

  ip add

  3、手工删除辅助IP的方法:

  ip addr del 10.0.2.1/24 broadcast 10.0.2.255 dev eth0

  ip addr del 10.0.2.1/24 dev eth0

  小结:heartbeat2.1.4及以前使用的是别名IP,以后使用的都是辅助IP,提供VIP服务的。

    而Keepalived一直都是用的辅助IP提供服务。

 

posted @ 2017-10-15 20:54  登高一呼  阅读(897)  评论(0编辑  收藏  举报