Heartbeat+LVS 大型互联网集群架构介绍

heartbeat集群中的相关术语

节点(node)

运行heartbeat进程的一个独立主机,称为节点,节点是HA的核心组成部分,每个节点上运行着操作系统和heartbeat软件服务,在heartbeat集群中,节点有主次之分,分别称为主节点和备用/备份节点,每个节点拥有唯一的主机名,并且拥有属于自己的一组资源,例如,磁盘、文件系统、网络地址和应用服务等。主节点上一般运行着一个或多个应用服务。而备用节点一般处于监控状态。

资源(resource)

资源是一个节点可以控制的实体,并且当节点发生故障时,这些资源能够被其它节点接管,heartbeat中,可以当做资源的实体有:

  • 磁盘分区、文件系统
  • IP地址
  • 应用程序服务
  • NFS文件系统

事件(event)

集群中可能发生的事情,例如节点系统故障、网络连通故障、网卡故障、应用程序故障等。这些事件都会导致节点的资源发生转移,HA的测试也是基于这些事件来进行的。

动作(action)

事件发生时HA的响应方式,动作是由shell脚步控制的,例如当某个节点发生故障后,备份节点将通过事先设定好的执行脚本进行服务关闭或启动, 进而接管故障节点的资源。

Heartbeat2.0的内部组成

  • heartbeat: 节点间通信检测模块
  • ha-logd: 集群事件日志服务
  • CCM(Consensus Cluster Membership):集群成员一致性管理模块
  • LRM (Local Resource Manager):本地资源管理模块
  • Stonith Daemon: 使出现问题的节点从集群环境中脱离
  • CRM(Cluster resource management):集群资源管理模块
  • Cluster policy engine: 集群策略引擎
  • Cluster transition engine:集群转移引擎

heartbeat使用第三方插件监控资源和应用程序是否运行正常

  • ipfail

此插件的功能直接包含在Heartbeat里面,主要用于检测网络故障,并作出合理的反应,为了实现这个功能,ipfail使用ping节点或者ping节点组来检测网络连接是否出现故障,从而及时的做出转移措施。

  • Stonith

此插件可以在一个没有响应的节点恢复后,合理接管集群服务资源,防止数据冲突,当一个节点失效后,会从集群中删除,如果不使用Stonith插件,那么失效的节点可能会导致集群服务在多于一个节点上运行,从而造成数据冲突甚至是系统崩溃。因此,使用Stonith插件可以保证共享存储环境中的数据完整性。

  • Ldirector

此插件是一个监控集群服务节点运行状态的插件。Ldirector如果监控到集群节点中某个服务出现故障,就屏蔽此节点的对外连接功能,同时将后续请求转移到正常的节点提供服务,这个插件经常用在LVS负载均衡集群中。

  • watchdog模块

一个Linux内核模块,它通过定时向/dev/watchdog设备文件执行写操作,从而确定系统是否正常运行,如果watchdog认为内核挂起,就会重新启动系统,进而释放节点资源。在linux中完成watchdog功能的软件叫softdog,softdog维护一个内部计时器,此计时器在一个进程写入/dev/watchdog设备文件时更新,如果softdog没有看到进程写入/dev/watchdog文件,就认为内核可能出了故障。watchdog超时周期默认是一分钟,可以通过将watchdog集成到Heartbeat中,从而通过Heartbeat来监控系统是否正常运行。

HeartBeat的作用

通过HeartBeat,可以将资源(IP以及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用的服务。在实际的生产应用场景中,heartbeat的功能和另一个高可用的开源软件keepalived有很多的相同之处,在我们实际的生产业务中也是有区别的。

HeartBeat的工作原理

heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。

  • Heartbeat: (心跳检测)本身是整个集群的基础(cluster messaging layer),负责维护集群各节点的信息以及它们之前通信;只提供主从备份功能,并不能对各个节点进行监控,需要安装ldirectord。
  • Resource-agent: (资源代理)就是各种的资源的ocf脚本,这些脚本将被LRM调用从而实现各种资源启动、停止、监控等等。
  • Cluster-glue: 相当于一个中间层,可以将heartbeat和crm(pacemaker)联系起来,主要包含2个部分,LRM和STONITH。
  • Ldirector: 负责realserver的健康检查,可以自动将realserver中宕机的机器移除,不再分配请求。

heartbeat内部结构有三大部分组成

  • 集群成员一致性管理模块(CCM)

用于管理集群节点成员,同时管理成员之间的关系和节点间资源的分配,heartbeat模块负责检测主次节点的运行状态,以决定节点是否失效。ha-logd模块用于记录集群中所有模块和服务的运行信息。

  • 本地资源管理器(LRM)

负责本地资源的启动,停止和监控,一般由LRM守护进程lrmd和节点监控进程(Stonith Daemon)组成,lrmd守护进程负责节点间的通信,Stonith Daemon通常是一个Fence设备,主要用于监控节点状态,当一个节点出现问题时处于正常状态的节点会通过Fence设备将其重启或关机以释放IP、磁盘等资源,始终保持资源被一个节点拥有,防止资源争用的发生。

  • 集群资源管理模块(CRM)

用于处理节点和资源之间的依赖关系,同时,管理节点对资源的使用,一般由CRM守护进程crmd、集群策略引擎和集群转移引擎三个部分组成,集群策略引擎(Cluster policy engine)具体实施这些管理和依赖,集群转移引擎(Cluster transition engine)监控CRM模块的状态,当一个节点出现故障时,负责协调另一个节点上的进程进行合理的资源接管。

在Heartbeat集群中,最核心的是heartbeat模块的心跳监测部分和集群资源管理模块的资源接管部分,心跳监测一般由串行接口通过串口线来实现,两个节点之间通过串口线相互发送报文来告诉对方自己当前的状态,如果在指定时间内未收到对方发送的报文,则就认为对方失效,这时资源接管模块将启动,用来接管运行在对方主机上的资源或者服务。

HeartBeat的心跳连接

两台heartbeat主机之间通信的一些常用的可行方法:

  • 串行电缆,即所谓的串口(首选,缺点是距离不能太远)
  • 一根以太网电缆两网口直连(生产环境中常用的方式)
  • 以太网电缆,通过交换机等网络设备连接(次选,原因是增加了故障点,不好排查故障,同时线路不是专用的心跳线,容易受其他数据传输的影响,导致心跳报文发送问题)

Heartbeat的裂脑

也称分区集群或者大脑垂直分隔。

两台服务都正常,但是就是检测不到对方的心跳信息(心跳通信出现故障),两台heartbeat都绑定VIP,这就是脑裂。由于相互失去联系,两台服务器本能的争取接管资源,最严重的后果:共享资源被瓜分,服务都起不来了,又或者服务都起来,但是共享资源同时写,最后数据就被破坏了!

导致裂脑发生的原因:

  • 心跳链路故障,导致无法正常通信(比如: 网线误拔,心跳线断了,无法通信,心跳线之间的中转设备坏了,仲裁设备坏了)
  • 开启了防火墙阻挡了心跳信息传输
  • 心跳网卡地址等配置不正确,使用网路直连时,网卡驱动坏了,局域网IP冲突
  • 心跳方式,心跳广播冲突,软件bug

防止Heartbeat脑裂的办法:

  • 同时使用串行电缆和以太网电缆连接,同时使用两条心跳线
  • 检测到裂脑时,强制关闭一个节点,(需要特殊设备支持,如stonish和fence),相当于程序上的备节点发现心跳故障,发送关机指令到主节点
  • 做好监控预警,即做好脑裂监控报警(在仲裁设备上做),仲裁方式停服
  • 多个仲裁机制(仲裁设备,第三方仲裁软件,并确定让哪个节点接管服务)
  • 一旦报警,短信电话通知运维人员,服务不要自动接管服务,由人员操作
  • 启用磁盘锁
posted @ 2021-09-14 11:35  Varden  阅读(272)  评论(0)    收藏  举报