OLAP MPP分布式关系型数据库的双活容灾系统的设计
简介
OLAP MPP集群容灾系统能满足对T+1,T+0.X等非实时的批处理的数仓场景的容灾需求,但是RPO,RTO会较大,往往达到小时级;随着数仓业务对连续性要求的不断提高,尤其是实时数仓的场景,需要建设实时的双活系统来满足对业务的连续性要求;当主库出现故障时,要求备库立即进行接管,对于实时数仓,要建立RPO,RTO达到分钟级或者秒级甚至到0的准实时或者实时双活系统才能保障主备库数据不丢失以及数据的一致性,从而保障业务的连续性。
OLAP MPP分析型集群的容灾以及双活在技术实现上、灾备级别要求上都与在线生产系统的OLTP事务数据库有较大差异。如事务数据库具有完备的WAL(write ahead logging)事务日志,灾备可以通过事务日志实现数据库的备份、双活复制、异地容灾等;OLAP MPP分析型数据库为追求大吞吐性能,无法完全按照事务数据库基于事务日志的容灾以及双活设计方案,目前业界采用的主流容灾和双活方案主要有:数据同步模式、ETL模式、双活模式,具体说明如下:
数据同步方式
主备集群间的数据同步是双活容灾系统建设的基础,高效、稳定、一致性的同步是双活容灾系统稳定运行的关键;本节列举下市面上常见的数据同步方式,以及各自的优缺点;
1.1 基于事务日志、数据块的数据同步
优势:直接同步变化的数据增量,只适合数据变化量较少的数据仓库。
劣势:对主数据库有侵入性,一旦主库繁忙,同步时效低;面对变化数据量大的场景,不适合。
1.2 基于备份恢复的数据同步
利用备份恢复工具进行数据的全量备份和增量备份,存放到某个存储介质上,然后恢复到备库上。
优势:采用产品已有的备份恢复工具来实现。
劣势:要求数据库支持增备能力,且往往锁等待严重;备库对外只能提供读;对备库进行恢复时不能马上提供服务,备份恢复无法达到与流式同步方式的RPO, 做不到RPO=0的程度, RTO时间较长,而且需要较大空间保存备份的数据。
1.3 基于导入导出的数据同步
基于上层应用对主库导出,备库导入,业务需要设计对增量数据的识别,对业务的设计和调度有较高的侵入性。以作业为单位,需要应用记住该作业产生的相关表,等作业完成后,主库发起对这些表的导出操作,备库进行导入操作。
优势:可以基于表级进行数据同步,基于导入导出,导出的是文本文件,因此主库和备库可以是异构的,例如主库是产品A,备份是产品B。
劣势:对主库的应用调度和数据库设计侵入性高,实施困难。
双活容灾模式
本节介绍双活容灾的一些实现方案,有些是产品能力,有些是应用解决方案,供大家参考;
2.1 基于ETL双加工双活模式
采用两套独立的调度系统进行作业的加工,由上层应用进行控制。
优势:不依赖于数据库产品自生的容灾能力,有应用自己进行控制,不依赖产品。一般采取主库对外提供持续服务,待主备库数据准实时或批后校验一致后,再开放备库对外服务。
劣势:因为主备库同时跑ETL作业,需要同时消耗主备库的CPU,内存和IO资源;另外对存在不确定值的SQL函数导致主备集群数据不一致,例如now、random、row_number排序这种同一份数据产生不同结果集的函数。建议用户修改SQL语句,明确唯一取值、唯一排序,确保主备数据的一致性。若主备集群数据发生不一致场景,主要以主库数据为准,覆盖备库,该同步过程可以采用“基于事务日志以及数据块的数据同步”技术。
2.2 基于产品提供的中间件进行调度的双活模式
产品级调度中间件是由OLAP产品提供一个组件,对外提供产品统一接口,实现主备集群SQL的调度、校验和同步(同步采用数据库自生的基于事务日志以及数据块的数据同步的底层技术);客户业务只需在产品级中间件下发任务;产品级中间件会自动调度任务:加载语句可以同时发送给主备库,实现双加载;DML语句可以灵活配置,可以主备库同时执行后进行校验,也可以主库执行完成后把增量数据同步到备库;只有主备库的数据校验成功后,本次任务才算执行成功。