GaussDB数据库高可用部署方案详解

详解GaussDB数据库高可用部署方案,涵盖核心组件、数据同步机制及基于华为云和TPOPS的部署场景。

原文标题:GaussDB数据库高可用部署方案

原文作者:牧羊人的方向

冷月清谈:

本文详细介绍了GaussDB数据库高可用部署方案,包括核心组件、区域和可用区概念、主备节点数据同步机制(WAL日志、同城复制、跨Region流式复制)以及基于华为云底座和轻量化TPOPS平台的典型部署场景。

GaussDB数据库的核心组件包括CM(CM Agent、CM Server、OM Monitor)、DN节点和ETCD节点。CM负责管理服务,DN负责数据存储和查询,ETCD协助选主和信息持久化。

高可用部署中,区域(Region)指物理上独立的数据中心,可用区(AZ)指同一区域内电力和网络隔离的物理区域。GaussDB支持同Region多AZ部署和跨Region部署。

数据同步机制方面,GaussDB采用WAL日志机制保证数据可恢复性。同Region内主备节点复制通过WalSender和WalReceiver线程实现,支持最大保护、最大可用和最大性能三种模式。跨Region复制采用流式复制,无法保证RPO=0。

基于华为云底座的部署适合已建华为云平台的用户,提供同Region多AZ、跨Region多AZ等方案。跨Region部署中,可通过存储复制实现RPO=0,或采用流式复制。

基于轻量化TPOPS平台的部署不依赖华为云底座,也支持多种部署形态,例如同城3AZ5节点+异地1AZ1节点方案,可在同城保证RPO=0,并提供异地容灾能力。

怜星夜思:

1、文章提到了GaussDB支持最大保护、最大可用和最大性能三种同步模式。实际应用中,该如何选择合适的同步模式?
2、GaussDB的跨Region复制采用流式复制,不能保证RPO=0。对于需要跨Region灾备且RPO=0的场景,有什么解决方案?
3、文章最后提到了GaussDB实例部署资源最小限制为8C64G。这对于小型应用或测试环境来说确实不太友好。有什么办法可以绕过这个限制吗?或者有什么更适合小型应用的替代方案?

原文内容

GaussDB数据库主备架构的基本组件,以及基于华为云底座和轻量化部署TPOPS两种方式的典型高可用部署场景介绍。

1、GaussDB数据库组件
1.1 GaussDB数据库集中式主备集群基本组件

  • CM由CM Agent、CM Server和OM monitor构成:

    • CM Agent:管理服务组件,由OMM拉起(周期1秒),主要负责CMS、DN进程的保活及启停,仲裁指标采集、仲裁命令执行等。集群的每台主机上均有CM Agent进程。CMA故障可能会导致启停能力丢失、实例故障检测能力丢失。

    • CM Server:管理服务组件,由CMA拉起(周期1秒),根据CM Agent上报的实例状态判定当前状态是否正常,是否需要修复,并下发指令给CM Agent执行。CM Server会将集群的拓扑信息保存在ETCD。

    • OM Monitor:管理服务组件,由crontab定时任务控制拉起(周期1分钟),主要负责OMM、etcd、cm_agent进程的保活及启停

  • DN节点:数据服务组件,由CMA拉起(周期1秒),负责存储业务数据、执行数据查询任务以及返回应用结果。DN主备节点之间采用Quorum复制或Paxos协议复制。

  • ETCD节点:管理服务组件,由OMM自动拉起(周期1秒),主要协助CMS选主、持久化集群仲裁信息、保存集群的拓扑信息等。

1.2 区域和可用区
在高可用部署架构中区域(Region)和可用区(Available Zone)用来描述数据中心的位置。
  • 区域Region:指物理上相对独立的数据中心。每个区域完全独立,这样可以实现最大限度的容错能力和稳定性。在GaussDB数据库中资源创建成功后不能更换区域。

  • 可用区AZ:指同一区域内,电力和网络互相隔离的物理区域,比如同一个区域内的两个机房,一个AZ故障不会影响其它AZ。GaussDB数据库中在同一个Region内可以有多个AZ可用区,不同可用区之间物理隔离,但内网互通,既保障了可用区的独立性,又提供了低价、低时延的网络连接。

不同Region的划分和多中心的高可用架构有关,比如生产/同城/灾备机房划分为不同的Region,然后在同一个Region内按照机房模块划分为不同的AZ域。也有可能生产和同城划分为同一个Region,灾备作为一个单独的Region,不同Region之间的RPO要求也是不同的。

1.3 主备节点数据同步机制
1.3.1 WAL日志机制

GaussDB数据库为了保证数据在数据库发生故障时候可恢复,引入了Redo机制,也就是WAL日志,其思想是对数据文件的修改在提交之前都需要记录到日志文件中,也就是先写日志后写数据。当事务发生时,相关的操作记录会被组装并写入基于内存的RedoLogBuffer中。当RedoLogBuffer写满或事务没有更多日志记录需要写入时,这些日志记录会被提交给RedoLogHandler,并最终写入到XLog(即WAL日志)中。这样不需要在每次事务提交的时候都把数据页刷回到磁盘,因为出现崩溃的情况下可以用日志REDO来恢复数据库。

WAL日志机制在数据库发生故障后可以通过xlog日志文件恢复数据、主备节点也可以通过日志文件进行数据同步、备份恢复时通过WAL日志可以实现PITR恢复。与MySQL中binlog不同之处是WAL日志主要关注于数据的物理修改记录,确保在数据文件修改之前相应的日志已经写入磁盘;而binlog日志则可能更侧重于记录数据的逻辑变化,如SQL语句的执行等。在GaussDB中可以使用逻辑复制的功能将xlog日志转换为类binlog日志格式进行逻辑回放等使用场景。

1.3.2 同Region内主备节点复制
在一主多备架构中,主机通过WalSender线程向备机同步日志,备机通过WalReceiver线程接受日志,并刷到本地盘,备机读取redo日志,完成主备之间的数据同步。
  • WAL:Write-Ahead Logging,也称为XLog,预写日志系统。实现事务日志的标准方法,是指对数据文件(表和索引的载体)持久化修改之前必须先持久化相应的日志。

  • WAL Receiver:数据库复制时备机创建的一个线程的名称。此线程用于从主机接收数据、命令,并反馈确认信息至主机。一个备机只有一个WALReceiver线程。

  • WAL Sender:数据库复制过程中,主机接受到备机的连接请求后创建的一个线程的名称。此线程用于发送命令、数据到备机,并从备机接收信息。一个主机可能会有多个WAL Sender线程,每一个WAL Sender线程对应一个备机的一个连接请求。

  • WAL Writer:数据库启动时创建的一个写Redo日志的线程,用于将内存中的日志写入到持久性设备中。

  • REDO日志:记录对数据库进行操作的日志,这些日志包含重新执行这些操作所需要的信息。当数据库故障时,可以利用REDO日志将数据库恢复到故障前的状态。

GaussDB数据库在同一个Region内1主多备的部署架构下,主备节点间采用Quorum或Paxos一致性复制协议,在事务提交前会进行一致性检测,满足半数以上的多数派响应后才可以提交。因此为了满足多数派选举,日志节点会部署为奇数。

同时根据不同的业务可用模式,将日志同步分为不同的模式,有以下几种:
  • 最大保护模式:一主多备场景下,如果主机的一个事务必须等到该事务对应的xlog日志在多数派主机上都落盘后才能提交。如果因为网络原因或者多数的备机发生故障,此时主机的事务将无法提交。该模式下,可以保证RPO=0,参数设置synchronous_commit=on

  • 最大可用模式:当发现备机不可用时,会自动从最大保护模式切换为最大可用模式,保证在备机不可用时主机的事务能够继续执行。该模式下无法保证RPO=0,参数设置most_avaiable_sync=on

  • 最大性能模式:主机的事务在该事务对应的xlog日志在本地落盘之后就可以提交,主机的性能不受备机的影响。该模式下,在主机故障时,可能会有一定的数据丢失,参数配置synchronous_commit=off

1.3.3 跨Region流式复制

GaussDB跨Region之间的数据同步采用流式复制的方式,一般是在生产和灾备建立两套数据库集群,基于WAL日志建立日志复制关系。跨Region之间的复制不能保证RPO=0

流式复制是使用max_replication_slots(日志复制槽)、max_keep_log_seg(逻辑日志数)等配置来控制复制的速率,防止备机堆积过多日志影响性能。

2、华为云GaussDB数据库高可用部署

华为云GaussDB数据库有两种部署模式,一种是基于华为云HCS底座的,适合于本身已经建设了华为云IAAS平台,基于现有的云平台底座的运维和管理能力,减少重复建设的成本;另一种是轻量化TPOPS平台,TPOPS不依赖于华为云底座实现对GaussDB数据库实例的运维管理。本文主要介绍集中式架构下的高可用部署。

2.1 基于华为云底座的高可用部署

集中式主备版本的同城和异地部署的时候有不同的组合,有同Region多AZ部署、跨Region的多AZ部署。这里介绍几种典型的部署方案,其它参考官网材料。

1)生产同城单Region部署

左图为生产单中心1AZ3副本部署,适用于不要求站点级容灾,但是需要保证单中心故障高可用的场景。
  • DN主备之间采用流复制进行数据同步,至少同步到一台备机,保证RPO=0。

  • DN备节点故障,不中断业务的进行;DN主节点故障,自动进行主备切换。

右图为生产同城3AZ4副本同城双活部署,由两个业务AZ和1个仲裁AZ组成,任何AZ故障能够保证RPO=0。
  • AZ1和AZ2对等部署,AZ3作为第三方仲裁节点,不接入业务;

  • AZ3作为仲裁AZ,在1个AZ故障状态下,保证ETCD的存活节点超过多数,从而保证数据的一致性

  • DN主备之间采用流复制进行数据同步,跨AZ存在同步备,数据不会丢失。

  • DN备节点故障,不中断业务的进行;DN主节点故障,自动进行主备切换。

  • AZ1和AZ2之间可以手动切换,切换完成后业务继续运行

2)生产同城跨Region部署(保证同城RPO=0)

前文已经介绍到GaussDB数据库在不同Region之间划分为不同的集群进行部署,不同集群之间采用流式复制,不能保证RPO=0。基于华为云底座部署的时候,可能因为生产和同城机房在网络部署上划分为不同的网络区域Region,此时如果要保证RPO=0只能采用存储复制的方案。GaussDB数据库结合Dorado存储实现存算分离和存储级别的高可用方案,两个不同Region之间通过存储复制保证RPO=0。
  • 每个Region都有一套完整的数据库集群,并有完整的数据;集群内主备节点之间采用共享卷进行数据同步,保证RPO=0

  • DN备节点故障,不中断业务的进行;DN主节点故障,自动进行主备切换

  • 跨region容灾需要手工切换

  • 闪存存储需要支持远程复制LUN,支持NAS文件系统并且和主机之间的连接使用IP网络连接

如果没有要求生产和同城之间RPO=0,采用双Region部署,两个集群之间采用数据库跨Region流式复制的方式实现数据同步。另外有时候考虑到生产和同城的网络带宽及时延限制,主备之间的强一致同步会影响到性能,也会考虑生产同城双Region部署。但其实大多数场景下,生产和同城之间的网络时延在0.5ms左右,已经满足业务访问的时延要求了

对于灾备站点由于物理距离上的限制,网络时延会大很多,所以需要单独划分Region部署,并且不能保证RPO=0。因此,对于不想使用存储复制方案的高可用部署,推荐生产和同城一个Region、灾备站点一个Region的方案。

2.2 基于轻量化TPOPS高可用部署

GaussDB数据库的TPOPS轻量化部署不依赖于华为云底座,只需要部署TPOPS云数据库管理平台,然后基于TPOPS进行数据库实例的纳管和维护即可。在部署形态上也是支持多种,这里介绍几种典型的部署方案,其它参考官网材料。

1)生产同城单Region部署

与基于云底座的部署方式相同,DN主备复制支持Quorum和Paxos两种协议,跨AZ存在同步备,数据不会丢失。

2)同城3AZ5节点+异地1AZ1节点(同城RPO=0)

生产同城双活部署,由两个业务AZ和一个仲裁AZ组成。两个业务AZ之间对等部署,任何一个机房都接入业务;仲裁AZ不接入业务;任何机房故障可保证RPO=0;异地Region支持跨Region的容灾能力。
  • 同城和异地跨Region分别部署一套单独的数据库集群;

  • 单AZ故障下,保证ETCD存活节点为多数,从而保证数据一致性;

  • DN主备节点之间采用流式复制,至少同步到2台备机,保证RPO=0;

  • 同城切换支持跨AZ切换;跨Region容灾需要手动切换

相比基于华为云底座的部署,异地Region支持单节点部署,并且生产和同城不需要和云底座的Region网络域捆绑,在部署方式上更为灵活。

3、总结
华为云GaussDB数据库高可用架构能够保证AZ内RPO=0、同城AZ间RPO=0,异地RPO<10s。另外高可用部署上有灵活的配置满足不同的场景,同时还有以下特性:
  • 为保证一致性协议的多数派选举成功,ETCD实例或日志副本等按照奇数部署;

  • 集中式架构下管控平台和数据库实例之间解耦,每个数据库集群都有自己的元数据管理节点、故障检测节点,在故障检测、DDL变更等场景下不依赖于集中式的管理节点。而管控平台的作用就是资源的管理、性能指标数据的采集和展示等。缺点就是需要维护的节点增多了,比如每个集群都有自己的ETCD、CMS等。

  • 在部署模式上如果没有现成的华为云底座,还是轻量化部署更为合适,数据库也不需要和某一类云厂商捆绑,在实际部署方案上也会更为灵活。

GaussDB数据库基于云底座和云管平台实现实例的统一管理、指标采集展示、DBMind智能化运维等功能模块,并且结合DRS等迁移工具和Oracle数据库迁移国产中的兼容性及性能上的优势,在国产数据库的引进中已经具备相当的竞争力。不过吐槽一点是GaussDB数据库在实例部署时候的资源最小限制为8C64G并且在实例纳管时候无法规避,这对于小的应用或开发测试环境来说是相当不友好的。

参考资料:

  1. https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/tg/gaussdb-38-0122.html

选择同步模式就像玩游戏选择难度,最大保护=地狱模式,最大可用=困难模式,最大性能=简单模式。选择哪个模式取决于你能承受多大的风险和挑战。

最小8C64G就像去饭店吃饭,最低消费8块,但你只想吃个4块钱的包子。解决办法:1. 换个小吃店(其他数据库);2. 和老板商量能不能打包半份(联系客服);3. 自己在家做(自建数据库)。

跨Region RPO=0,就像异地恋要时刻保持联系一样,需要付出更多努力和成本。存储复制就像每天视频通话,逻辑复制就像每天写信,异步复制就像偶尔打个电话。选择哪种方式取决于你对“亲密程度”的要求和你的钱包厚度。

关于资源限制的问题,我了解到目前GaussDB还没有官方的绕过方法。如果只是测试环境,可以考虑使用GaussDB的单机版本或者社区版本,资源要求会低一些。另外,也可以考虑使用其他云厂商提供的云数据库服务,或者开源的数据库,例如MySQL、PostgreSQL等。

8C64G的最小资源限制确实对小型应用不太友好。可以考虑联系华为云的客服,看看是否有其他更灵活的资源配置方案。或者,可以尝试使用容器化技术,在容器中部署GaussDB,并限制资源的使用。

除了Dorado存储复制,还可以考虑使用其他厂商的存储复制技术,或者基于数据库的逻辑复制工具,构建跨Region的RPO=0的灾备方案。当然,也可以根据业务的重要程度,适当放宽RPO的要求,采用异步复制的方式,降低成本和复杂度。

对于RPO=0的跨Region灾备场景,文章中提到了存储复制的方案,可以结合Dorado存储实现。这种方案可以保证数据零丢失,但成本相对较高。另外,也可以考虑其他一些方案,例如数据库的逻辑复制,或者基于应用层的双写机制等,需要根据具体情况进行选择。

关于同步模式的选择,我觉得要看具体的业务场景和对数据一致性、可用性和性能的要求。如果业务对数据一致性要求非常高,例如金融场景,那就选择最大保护模式,RPO=0。但这样可能会牺牲一些性能和可用性。如果可用性优先,例如电商场景,可以选择最大可用模式,在保证一定数据一致性的前提下,优先保证业务的连续性。如果性能是瓶颈,例如一些日志分析场景,就可以选择最大性能模式。

最大保护模式适合对数据零丢失容忍度极高的核心业务,比如金融交易。最大可用模式适合高并发、对响应时间敏感的业务,比如在线游戏。最大性能模式适合对数据一致性要求不高,但对写入性能要求很高的业务,比如物联网数据采集。