日期:2014-05-16  浏览次数:20640 次

Linux高可用性方案之Heartbeat架构(原创)

Heartbeat 概述
Heartbeat 是 Linux-HA 工程的一个组件, 1999 年开始到现在,发布了众多版本,是目前开源 Linux-HA 项目最成功的一个例子,在行业内得到了广泛的应用。随着 Linux在关键行业应用的逐渐增多,它必将提供一些原来由 IBM 和 SUN 这样的大型商业公司所提供的服务,这些商业公司所提供的服务都有一个关键特性,就是高可用集群。
高可用集群是指一组通过硬件和软件连接起来的独立计算机,它们在用户面前表现为一个单一系统,在这样的一组计算机系统内部的一个或者多个节点停止工作,服务会从故障节点切换到正常工作的节点上运行,不会引起服务中断。从这个定义可以看出,集群必须检测节点和服务何时失效,何时恢复为可用。这个任务通常由一组被称为“心跳”的代码完成。在 Linux-HA 里这个功能由一个叫做 heartbeat 的程序完成。而对于节点资源的控制,以及配置节点资源的监控状态等工作都交由Pacemaker也就是 CRM 来统一管理与操作。
基本框架
Heartbeat 分 1.x 和 2.x 两个大版本,v2 版本是可以兼容之前 v1 的配置文件的,但从功能的角度来看,v2 要强不少,关于Heartbeat v3版本大家可以认为是v2版本的修订版,主要修复了
Heartbeat v2版本中出现的bug,在v3版本中CRM模块更名为 Pacemaker并将相应的模块集成到了 Pacemaker模块中,下文将详细描述 :
2.x 支持 CRM 管理,资源文件由原来的 haresources 变为 cib.xml;
支持 ocf、lsb、stonith 等格式的 resource agent;
对多资源组进行独立监控,不再需要依赖 mon 或 ldirectord 等第三方脚本;
支持多节点,1.x只支持双节点;
提供 GUI 图形配置和管理工具。
Heartbeat 2.x 基于集群资源管理器(Cluster Resource Manager-CRM)CRM模 式 : 可 以 支 持 最 多 16 个 节 点 , 这 些 模 式 使 用 基 于 XML 的 集 群 信 息 ( Cluster Information Base-CIM)配置。CIB 文件(/var/lib/heartbeat/crm/cib.xml)
会在各个节点间自动复制,可以实现下面的操作:
集群节点配置和监控;
集群资源,包括属性、优先级、组和依赖性的定制;
日志、监控、仲裁和 fence 标准管理;
当服务失败或其中设定的标准满足时,需要执行的动作。

HA集群中的相关术语
节点(node)
运行Heartbeat进程的一个独立主机,称为节点,节点是HA的核心组成部分,每个节点上运行着操作系统和Heartbeat软件服务。在Heartbeat集群中,节点有主次之分,分别称为主节点和备用/备份节点,每个节点拥有惟一的主机名,并且拥有属于自己的一组资源,例如磁盘、文件系统、网络地址和应用服务等。主节点上一般运行着一个或多个应用服务,而备用节点一般处于监控状态。
资源(resource)
资源是一个节点可以控制的实体,并且当节点发生故障时,这些资源能够被其他节点接管。Heartbeat中,可以当做资源的实体有:
磁盘分区、文件系统;
IP地址
应用程序服务,如Oracle,DB2等
NFS文件系统
事件(event)
也就是集群中可能发生的事情,例如节点系统故障、网络连通故障、网卡故障和应用程序故障等。这些事件都会导致节点的资源发生转移,HA的测试也是基于这些事件来进行的。
动作(action)
事件发生时HA的响应方式、动作是由shell脚步控制的,例如,当某个节点发生故障后,备份节点将通过事先设定好的执行脚本进行服务的关闭或启动,进而接管故障节点的资源。

HA 2.x的主要模块

heartbeat模块:
整个Heartbeat软件的通信模块,各个节点之间的任何通信都是通过这个模块完成。这个模块会根据不同类型的通信启动不同的事件handler,当监听到不同类型的通信请求后会分给不同的handler来处理。这个从整个Heartbeat的启动日志中看出来。
CRM:cluster resource manager
从这个名字就可以看出这个模块基本上就是v2的heartbeat的一个指挥中心,整个系统的一个大脑了,他主要负责整个系统的各种资源的当前配置信息,以及各个资源的调度。也就是根据各资源的配置信息,以及当前的运行状况来决定每一个资源(或者资源组)到底该在哪个节点运行。不过这些事情并不是他直接去做的,而是通过调度其他的一些模块来进行。
他通过heartbeat模块来进行节点之间的通信,调度节点之间的工作协调。随时将通过heartbeat模块收集到的各个成员节点的基本信息转交给CCM模块来更新整个集群的membership信息。他指挥LRM(local resource manager)对当前节点的各资源执行各种相应的操作(如start、stop、restart和monitor等等),同时也接收LRM在进行各种操作的反馈信息并作出相应的决策再指挥后续工作。另外CRM模块还负责将各个模块反馈回来的各种信息通过调用设定的日志记录程序记录到日志文件中。
LRM:local resource manager
LRM是整个Heartbeat系统中直接操作所管理的各个资源的一个模块,负责对资源的监控,启动,停止或者重启等操作。这个模块目前好像支持有四种类型的资源代理(resource agent):heartbeat自身的,ocf(open cluster framework),lsb(linux standard base,其实就是linux下标准的init脚本),还有一种就是stonith。stonith这种我还不是太清楚是一个什么类型的。
四种类型的resource agent中的前三种所调用的脚本分别存如下路径:
heartbeat:/etc/ha.d/resource.d/
ocf:/usr/lib/resource.d/heartbeat/
lsb:/etc/init.d/
LRM就是通过调用以上路径下面的各种脚本来实现对资源的各种操作。每一种类型的脚本都可以由用户自定义,只要支持各类型的标准即可。实际上这里的标准就是接受一个标准的调用命令和参数格式,同时返回符合标准的值即可。至于脚本中的各种操作是如何,LRM并不care。
PE:CRM Policy Engine
他主要负责将CRM发过来的一些信息按照配置文件中的各种设置来进行计算,分析。然后将结果信息按照某种固定的格式通过CRM提交给TE(Transition engine)去分析出后续需要采取的相应的action。PE需要计算分析的信息主要是当前有哪些节点,各节点的状况,当前管理有哪些资源,各资源当前在哪一个节点,在各个节点的状态如何等等。
TE:Transition engine
主要工作是分析PE的计算结果,然后根据配置信息转换成后续所需的相应操作。个人感觉PE和TE组合成一个类似于规则引擎实现的功能,而且PE和TE这两个模块只有在处于active的节点被启动。另外PE和TE并不直接通信,而都是通过Heartbeat的指挥中心CRM来传达信息的。
CIB:cluster information base
CIB在系统中充当的是当前集群中各资源原始配置以及之后动态变化了的状态,统计信息收集分发中心,是一个不断更新的信息库。当他收集到任何资源的变化,以及节点统计信息的变化后,都