1.高可用概念
可用是指对用户而言,一款软件或服务能够被正常使用的一种状态;高可用则是在可用状态的基础上试着对状态持久保持或异常状态下快速恢复的相关理念;并通过编码与程序设计,能一定程度减少系统不能提供服务的时间。因此一个高可用的系统,在设计时就要求在关键时期提供不间断的计算服务,以能够在整个生命周期里不间断的工作,实现用户对持续服务的较高要求。
一个系统满足高可用理念应具备以下特征:
- 最大限度的减少数据丢失,甚至是防止数据丢失(数据不丢)。
- 能够容忍在故障发生的情况下,不间断或者极少中断的对外提供服务(应用不断)。
- 能够容忍对系统,数据,或者应用的改变,或者说这些改变对用户是透明的(对用户透明)。
- 提供尽可能简单的管理工具,方便用户使用(简单易用)。
- 以最低的成本达到服务等级协议中规定的目标(比如恢复时间目标 RTO 和恢复点目标 RPO) (成本可控)
下面是高可用部分常用的一些概念及相关解释,如下表所示:
术语 | 定义 |
SLA | 服务等级协议(Service Level Agreement),指服务的提供者与使用者之间就服务的可用性、可靠性、性能等方面所达成的协议或契约 |
RTO | 恢复时间目标(Recovery Time Object),是指一个基于信息系统的商业流程失效到它开始为组织造成不可接受的影响(财产损失,客户不满意,信誉受损等等)的时间总和。概括的讲,恢复时间目标是一个组织或者是商业流程对停机时间的容忍度 |
RPO | 恢复点目标(Recovery Point Object),是指基于信息系统的商业流程,在不会对组织带来任何损害的情况下所能允许丢失的最大数据量。总的来说,它体现了组织或者业务流程对数据丢失的容忍程度 |
Failover | 故障转移(Failover),指集群中任何一个节点故障都不会影响用户使用,连接到故障节点的用户会被自动转移到健康节点 |
HA | 高可用(High Availiablity),简称HA,可用性是指应用或数据库服务处于可用状态的程度,高可用是指通过设计减少系统不能提供服务的时间 |
如果系统一直能不间断提供服务,我们可以说系统的可用性是100%;如果系统在时间单位内有1%的时间不能提供服务,我们可以说系统的可用性是99%。为了评估可用性,业内通常使用MTTF和MTTR来量化一个模块的可用性:
- 平均无故障时间(MTTF,mean time to failure),指模块处在正常服务状态的平均时间。
- 平均修复时间(MTTR,mean time to repair),指模块处在服务中断状态的平均时间。
系统可用性的定义是MTTF/(MTTF + MTTR),一个大于等于0,小于等于1的数值。且该数值越大,系统可用性越高。
2. 高可用的实现
为了实现系统的高可用,应对各种各样的故障,KES提供了多个高可用相关的能力模块。
2.1 预写日志(Write Ahead Log,WAL)
预写式日志(WAL,Write-Ahead Logging)是保证数据完整性、实现事务日志的一种标准方法。 预写式日志在实现上的关键点就是先写日志,再写数据,即:在写数据的过程中加入了写对应的WAL log的过程,先写Buffer再刷新到Disk。
- 当需要更新数据时,先将变更后的内容写入WAL Buffer、再将更新后的数据写入Data Buffer。
- 当提交变更时(commit),会将WAL Buffer刷新到Disk,Data Buffer写磁盘会推迟。
- 当checkpoint时,会将Data Buffer刷新到Disk。
2.2 备份与恢复
备份和恢复是指为了保护数据,避免数据丢失以及在某些灾难情况下能够重建数据库所要进行的一系列策略和过程。对于事务内部故障和系统故障,KES将使用预写式日志文件自动恢复数据,不需要人工进行干预。但对于硬件故障、操作员的失误以及恶意破坏事件,数据可能无法进行自动恢复。因此,数据库管理员要进行数据的定期备份数据;当故障发生时,可以使用备份来恢复数据库。KES提供的备份恢复方式可以分为两种:
- 基于备份集(数据文件)和预写式日志的物理备份恢复:物理备份恢复是一种文件系统级别备份恢复方式,可以直接备份磁盘中数据目录下的物理文件(数据文件、控制文件和日志文件等),依靠还原数据文件和日志恢复技术来保护数据。
- 基于SQL转储的逻辑备份恢复:逻辑备份恢复是指创建一个由SQL命令组成的文件,当把这个文件回馈给服务器时,服务器将利用其中的SQL命令重建与转储时状态一样的数据。
2.3 集群化与自动故障转移
KES高可用保证的另一种手段是“集群化”,或者叫“冗余”。假定数据库只有一个单点提供服务,该单点故障后(假定服务器电源发生故障),整个服务就会不可用。如果此时有冗余服务(数据冗余和服务冗余),单点故障后还有其他备份能够顶上继续提供服务。因此,保证系统高可用,KES的核心准则是“冗余”。有了冗余之后还不够,每次出现故障需要人工介入恢复服务势必会增加系统的不可服务时间。所以,还需要通过“自动故障转移”来实现系统的高可用。所以就实现手段而言,KES高可用的核心之一是通过集群化+自动故障转移来实现的,目前KES集群化主要是形成读写分离集群。
2.4 读写分离集群
读写分离集群是基于即时归档实现的高性能数据库集群,该集群提供数据保护、容灾等数据守护功能,还支持读写分离等特性。读写分离集群可以配置多个即时备库,提供数据同步、故障自动转移、故障节点自动恢复等功能,也支持自动故障切换和手动故障切换两种守护模式。
一个读写分离集群节点通常包括以下部分:
- KingbaseES实例: 对外提供数据服务,primary节点通过walsender服务发送wal日志给standby节点,standby节点通过walreceiver服务接收日志数据。
- 守护进程repmgrd(HAMGRD): 此进程会通过libpq访问并检查各自数据库节点KingbaseES实例状态,同时主库repmgrd也会检查备库,备库的repmgrd也会检查主库。
- 守护进程kbha(KBHA): 此进程主要监控守护进程repmgrd状态。