Linux HA技术

HA Cluster/Failover Cluster

HA Cluster必须能够使用共享存储(NAS/SAN), HA Cluster的几种配置,参考Pacemaker的配置

  • Active/Active 两台主机通过负载均衡同时提供相同服务。
  • Active/Passive 备机做完整的冗余备份,主机宕机时,备机替代主机上线。
  • N+1 提供一台备机,但这台备机能够cover所有的服务(一般适用提供多种独立服务的Cluster),当N=1时,退化成Active/Passive。
  • N+M 当N+1配置里的一台备机无法cover所有服务时,考虑增加备机到M。
  • N-to-1 备机只是临时使用,当主机恢复后,服务还是自动切换到主机。
  • N-to-N 这是Active/Active和N+M的组合模式。

DRBD

DRBD (Distributed Replicated Block Device) 是一个用软件实现的,无共享的,服务器之间mirror块设备内容的存储复制解决方案(可以看做网络上的RAID-1)。

DRBD is a RAID-1 style block device which synchronizes over the network between two computers. In essence, it provides a virtual shared storage between two computers.

DRBD的核心功能通过Linux内核实现(IO栈),它位于文件系统以下。在HA系统中可以替代disk array。

三种复制模式(参考MySQL Replication):

  • 异步复制协议
  • 半同步复制协议
  • 同步复制协议

经常和HeartBeat协同工作,搭建HA系统。

HeartBeat

HeartBeat,消息层,作为一个daemon运行,提供集群的基础服务(communication & membership)。它可以让集群间的节点感知对方是否在线,并且互相通信。

Pacemaker

Pacemaker,资源管理层(CRM, Cluster Resource Manager),提供上层应用服务的自动迁移能力。

Pacemaker从Linux-HA 2.0项目中抽出crmd,pengine,tengine,cib等服务,底层支持HeartBeat和OpenAIS两种cluster stack。

Pacemaker的组件:

  • stonithd 节点隔离服务。
  • lrmd 本地资源管理服务(Local Resouce Management Daemon),不和集群打交道,只负责处理本地资源(脚本),提供统一接口。
  • pengine 策略引擎(Policy Engine),根据当前集群状态和配置,计算出下一状态。
  • cib 集群信息库(Cluster Information Base),包括所有的集群配置、节点、资源和当前状态,并且负责在所有节点上同步更新这些信息。
  • crmd 集群资源管理服务(Cluster Resouce Management Daemon),协调lrdm和pengine,并且负责选主(Designed Coordinator),DC将负责管理整个集群。

corosync/openais

2007年底CRM从HeartBeat项目分离出来,其中一部分成为corosync,是个功能强大的组件,它的功能基本和HeartBeat重合,同样提供membership管理和可靠组通信服务。而openais提供应用层软件的故障恢复、锁、通信等一系列服务,作为corosync的插件运行。

corosync原生支持UDP/IP和InfiniBand网络。

corosync/openais的代码框架类似这样:

  • include 对客户端程序提供的服务头文件,比如 include/saAis.h, saLck.h
  • lib 对客户端程序提供的链接库实现,比如 lib/lck.c → libSaLck.so
  • services 服务器端的具体实现,比如 services/lck.c → service_lck.lcrso
  • test 一些客户端程序示例

其中实现的services里,corosync提供最基础的编程框架,包括:

  • cfg.c 显示和配置参数的管理工具
  • confdb.c 配置数据库
  • cpg.c 当集群partition, merge和fault时,提供组群管理(似乎和EVS有点重叠?)
  • evs.c 基于Extended Virtual Synchrony实现了一个消息模型,在UDP/IP实现了一套可靠有序的1:N组播消息机制
  • pload.c 一个内置的负载测试工具
  • votequorum.c 内置的vote-based quorum服务,用于集群选主(majority)

openais提供一些分布式的应用服务,包括:

  • amf.c Availability Management Framework
  • ckpt.c Checkpointing
  • clm.c Cluster Membership
  • evt.c Eventing
  • lck.c Distributed Locking
  • msg.c Messaging
  • tmr.c Timer

openais中的服务在 services/openaisserviceenable.c 这个入口注册,然后通过调用 services/aisexec 启动,这个脚本里通过环境变量 COROSYNC_DEFAULT_CONFIG_IFACE 为corosync进程指定要启动的服务。

STONITH

STONITH(Shoot The Other Node In The Head)用于Node Fencing(意思是把某个节点从cluster中屏蔽出来),STONITH服务通常由一个独立的设备实施(比如一个远程电源开关设备,UPS)。

STONITH设备很独立,它对外提供统一的接口,供CRM调用。