写点什么

一文带你了解 GaussDB(DWS) 的 Roach 逻辑备份实现原理

发布于: 2021 年 02 月 26 日

摘要:Roach 工具是 GaussDB(DWS)推出的一款主力的备份恢复工具,包含物理与逻辑备份两种主要能力,本文着重于讲解 Roach 逻辑备份的实现原理。


一、简介


在大数据时代,数据的完整和可靠性成为一个数仓最核心的能力之一。GaussDB(DWS)以其出众的分布式计算和存储能力广受用户青睐的同时,也特别着眼于数据备份容灾领域的创新和打磨。数据的可靠性可以说是数仓的“命门”。对于企业、政府等用户,如果因为硬件故障导致的文件损坏,或是业务操作的误删,导致了数据损坏或丢失,那么损失将是不可估量的。GaussDB(DWS)提供的 Roach 工具,将以其稳定、快速、可靠的备份能力,通过备份恢复数据库或业务表,为客户准备一个可靠的“后悔药”,从而有效地挽回客户损失。


二、Roach 备份恢复基本框架


GaussDB(DWS)的 Roach 工具,同时提供物理备份和逻辑备份两种主要形态的备份。物理备份直接通过拷贝文件块,存储于备份介质之上,恢复时使用备份的文件块,重建集群中实例 DN 与 CN 的数据目录进行恢复。


本文中我们主要着眼于逻辑备份,在当前的 GaussDB(DWS)中,相比于物理备份,逻辑备份拥有更好的灵活性,其充分利用了 GaussDB(DWS)强大的数据导入导出能力,不同于物理备份的文件整体拷贝,逻辑备份针对数据库的逻辑对象进行抽取和备份,粒度可以做到表级、schema 级、database 级,根据客户需要进行定制选择;在一个拥有成千上万表的客户数仓中,如果仅想要备份一张表,那么当前逻辑备份是更好的选择。


在逻辑备份讲解之前,我们首先讲一下 Roach 工具的设计架构,这个框架是一切逻辑或者物理备份的实现基础——



1 Roach 备份恢复工具框架示意图


GaussDB(DWS)提供的 Roach 是一个分布式的备份恢复工具,以一个 Node1、2、3 组成的集群为例,备份的总入口是 python 进程 GaussRoach.py,它将在当前节点拉起一个 roach master 进程,在集群其他所有节点各拉起一个 roach agent 进程,是典型的 master-slave 框架,master 进程与所有的 agent 进程分别建立 TCP 长连接,并封装报文与各个节点通信,下发备份等任务,在每个节点上,将分布式地为节点上的 CN、DN 等数据库对象进行备份。


三、逻辑备份的原理


下面简述一下逻辑备份的执行过程:


1) 待备份表定义的导出和备份


如果是库级的备份,将逐个 schema 地进行元数据导出;处理每一个 schema 时,又将逐个导出所有的表定义,因此,我们下图展示了 Roach 逻辑备份导出一个表 DDL 的过程。Roach Master 节点接到备份指令后,向一个有 CN 的节点 Roach Agent 下发指令,该 Agent 进程再调用 gs_dump,连 CN 进行表定义 DDL 的导出。



2 逻辑备份表元数据 DDL 导出备份示意图


2) 创建外表


Roach 逻辑备份过程,本质是建立外表进行数据导出的过程,类似上一步的表定义导出,Roach Agent 接受 Master 指令后,基于导出的表定义,连 CN 创建写外表,创建的外表使用 gsmpp_server, server 的 option 中,location 为 roach://{Roach Agent 监听端口},其中,Roach Agent 监听端口为参数可配置,将接受该节点上所有 DN 实例的连接,Roach 逻辑备份外表定义类似如下形式,该待备份表仅有一个 int 类型字段 id,图中举例的 Roach Agent 监听端口为 8080,可配置,导出格式为 csv。



3 Roach 逻辑备份创建的外表


3) Roach 工具与 DN 的建连及数据导出备份当前 GaussDB(DWS)的集中主要数据导入导出外表包括 GDS、HDFS、OBS、Roach 等四种,Roach 外表同其他几种外表类似,都通过 FDW(Foreign Data Wrapper)完成,但注册了一系列属于 Roach 的 FDW API 接口实现,此外,Roach 还实现了 Open/Read/Write/Close/ErrorReport 等五个主要的底层读写 API,实现 DN 与 Roach Agent 之间的数据交互。



图 4 逻辑备份表数据备份流程示意图


如图 4 所示,逻辑备份数据的流程可以用以下 phase1 ~ phase5 简单描述


  • Phase1: 备份数据的命令被 Master 下发给所有 Agent,连一个 CN,连数据库创建外表导出 server、创建导出外表,每个节点的 Roach Agent 同样会创建一个 TblServer 线程,监听 Agent Port 端口,等待 DN 连接;

  • Phase2: 连一个 CN 执行 insert into roachft select * from A;sql 查询会被下发到所有 DN,通过注册的 Roach FDW API,DN 调用回调函数,封装一个 PGXCNode 的消息,以自明 instance 身份,去尝试连接 server url 中的本节点 Agent Port;

  • Phase3: Roach Agent 的 TblServer 每接收一个 DN 的连接,会分配一个数据通信的 socket 槽位,并 fork 一个子进程为该 DN 实例的备份服务;Agent 会等待该节点上所有的 DN 都建立连接,创建 lengthof(节点所有 DN)个子进程,并行进行数据备份。

  • Phase4: 每个备份子进程通过建立的连接,不断读取表数据,待该表所有切分的数据块读取完成,发送一个 FINISH_BACKUP 消息给 Roach Agent,则停止数据传输,从 DN 读取的数据首先存入 Agent 子进程的 buffer 中。

  • Phase5:    每个 Agent 进程内会创建一个 BackupSender 线程,负责消费存入 buffer 的表数据,与备份介质建立连接,流式进行数据的发送;Phase4、5 在实际运行中是个异步并行的动作,并非等所有表数据都写入 buffer 后,才向备份介质发送。


四、小结


关于 Roach 逻辑备份的原理大致就讲解完成了,逻辑备份能够有效地应对单表、schema 级等较细粒度的备份,较为灵活和便利。逻辑备份的恢复的过程,与上述备份过程基本是个逆向过程,简而言之即表定义恢复,节点及 DN 元数据恢复,数据导入的过程,恢复的一大优势是,不会停集群或移动其他数据,对其他库或者表的业务几乎不影响。在后续的博文中,我们可以更详细地解读。


本文分享自华为云社区《侵略如火,GaussDB(DWS)高可用容灾利器之逻辑备份》,原文作者:世纪末的魔术师。


点击关注,第一时间了解华为云新鲜技术~


发布于: 2021 年 02 月 26 日阅读数: 15
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
一文带你了解GaussDB(DWS) 的Roach逻辑备份实现原理