首页 > 其他分享 >【我和openGauss的故事】openGauss 主备架构及同步复制模式理论学习与验证测试

【我和openGauss的故事】openGauss 主备架构及同步复制模式理论学习与验证测试

时间:2023-08-10 20:32:40浏览次数:66  
标签:架构 standby 数据库 synchronous sync state 主备 openGauss

【我和openGauss的故事】openGauss 主备架构及同步复制模式理论学习与验证测试

尚雷 [openGauss](javascript:void(0);) 2023-08-08 18:00 发表于四川

收录于合集#第六届openGauss技术文章征集初审合格文章62个

备注:非常感谢在这研究本文相关内容中 openGauss 数据库官网 行尘(张旭博)老师在群里给予的知识点解答。

一、openGauss主备架构

openGauss 支持多种主备部署方案,每种方式都有其适合的场景,每种方案也都有一定的优劣势,要根据不同的业务场景和安全需求选择最适合的架构方案,openGauss主备架构主要支持如下几种方案:

1)单中心

2)同城双中心

3)两地三中心

4)两地三中心流式容灾方案

openGauss 自 1.0.0版本开始支持DN主备。DN 是指数据库节点(Database Node)的缩写。数据库节点是 openGauss 分布式架构的基本组成单元,每个数据库节点都是一个独立的数据库实例,负责处理客户端请求和执行数据库操作。

AZ,全称为 Availability Zone,是云计算领域中常见的概念,特别是在云服务提供商(如AWS、Azure、阿里云等)的架构中使用广泛。AZ 是云计算数据中心的物理隔离区域,每个 AZ 都是一个独立的、物理上隔离的数据中心,这些数据中心之间相互之间有高带宽、低延迟的连接。

在 openGauss 数据库的架构中,可以使用 AZ 来部署主备数据库实例,使其在不同的 AZ 中运行。这样,当某个 AZ 出现故障或不可用时,可以快速切换到其他 AZ 中的备用数据库实例,实现数据库的高可用性和容灾保护。使用 AZ 的架构可以大大提高系统的可靠性,确保服务的持续性和稳定性。

二、主备状态查看

可以使用 gs_om -t status --detail --all 命令来查看openGauss主备详细状态信息,如下所示:

[omm@opengauss-db1 ~]$ gs_om -t status --detail --all
[  CMServer State   ]

node             node_ip         instance                               state
-------------------------------------------------------------------------------
1  opengauss-db1 10.110.3.155    1    /opt/gaussdb/install/cm/cm_server Primary
2  opengauss-db2 10.110.3.156    2    /opt/gaussdb/install/cm/cm_server Standby

[   Cluster State   ]

cluster_state   : Normal
redistributing  : No
balanced        : No
current_az      : AZ_ALL

[  Datanode State   ]

node             node_ip         instance                          state            
------------------------------------------------------------------------------------
1  opengauss-db1 10.110.3.155    6001 /opt/gaussdb/install/data/dn P Standby Normal
2  opengauss-db2 10.110.3.156    6002 /opt/gaussdb/install/data/dn S Primary Normal

我也是第一次注意到CMServer State和Cluster State的主备状态不是一一对应的,之前这套主备环境曾做过主备切换。于是就查询和向群里老师请教了解了下CMServer State 和 Datanode State 的相关含义。

CMServer和 Datanode分别有自己的主备, 两个都可以数量不一样, 比如 node1、node2、node3 安装CMServer,node2和node3 安装 DB。

1)CMServer State

CMServer是cm的服务端,负责收集CMA(Cluster Management Agent)【集群管理代理】上报的状态,并作为仲裁中心和全局配置中心,主备集群能否稳定运行以及在发生单点故障后,openGauss 备库能否正常切换为主库来保证集群的可用性,都与CMServer是否稳定有很紧密的关系。

CMServer状态可能是如下几种状态中的一种:

Normal(正常状态): 集群管理服务器正常运行,能够管理和监控整个数据库集群的各个节点。

Degraded(降级状态): 集群管理服务器可能出现了部分功能的问题或故障,导致其功能降低。

Fault(故障状态): 集群管理服务器可能发生了严重的故障,导致无法正常管理和监控数据库集群。

Pending(待命状态): 集群管理服务器正在进行状态切换,可能是从备用服务器切换为主服务器,或者从主服务器降级为备用服务器。

Unknown(未知状态): 集群管理服务器的状态无法确定,可能是由于网络故障或通信问题导致状态不明确。

2)Datanode State

Datanode State(数据节点状态)是指数据库集群中每个数据节点的运行状态。数据节点是分布式数据库集群中的基本组成单元,负责存储数据和处理数据库操作。每个数据节点都可以是主节点或备节点,用于实现高可用性和容灾保护。

Datanode State状态可能是以下几种状态的一种:

Primary(主节点): 数据节点被选举为主节点,负责处理客户端请求、执行事务以及维护数据的最新状态。

Standby(备节点): 数据节点作为备节点,实时复制主节点的数据,并可以在主节点故障时接管服务,保障数据库的持续可用性。

Pending(待命状态): 数据节点正在进行状态切换,可能是从备节点升级为主节点,或者从主节点降级为备节点。

Unknown(未知状态): 数据节点的状态无法确定,可能是由于网络故障或通信问题导致状态不明确。

Offline(离线状态): 数据节点不可用,可能是由于硬件故障、网络问题或其他原因导致节点无法正常运行。

三、复制模式

3.1 复制模式

openGauss 部署了主备环境后,可以通过在主库查询pg_stat_replication视图来获取当前复制模式的信息,记住是只能在主库查询到相关信息,在备库是查询不到的,如下所示:

-- openGauss 主库
[omm@opengauss-db2 ~]$ gsql -d postgres -p 26000
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;
       pid       |   state   | client_addr  | sync_priority | sync_state 
-----------------+-----------+--------------+---------------+------------
 140128500840192 | Streaming | 10.110.3.155 |             1 | Quorum
(1 row)
-- openGauss 备库
[omm@opengauss-db1 ~]$ gsql -d postgres -p 26000
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;
 pid | state | client_addr | sync_priority | sync_state 
-----+-------+-------------+---------------+------------
(0 rows)

和PostGreSQL原生数据库不同,使用OM部署的openGauss主备环境默认采用Quorum这种复制模式,而PostGreSQL采用的是Async复制模式。

3.2 Quorum和Async差异

Quorum和Async是用于实现数据复制和高可用性的两种不同策略,它们在数据一致性、可用性和性能方面有所不同。

两者的差异主要体现在如下方面:

同步复制 (Quorum)

  • Quorum 同步复制要求主服务器在提交事务之前,必须等待至少一定数量的备份服务器确认已成功写入相同的数据。
  • 这种方式确保了较高的数据一致性,因为事务只有在多个服务器都写入成功后才会提交。
  • 如果其中一个备份服务器发生故障,主服务器可能会等待其他备份服务器的确认,从而导致一些性能损失。
  • 由于需要等待确认,因此 Quorum 同步复制可能会对性能产生一定的影响,尤其是在网络延迟较大的情况下。

异步复制 (Async):

  • 异步复制允许主服务器提交事务后立即继续处理下一个事务,而不需要等待备份服务器的确认。
  • 这种方式可以提供较高的性能,因为主服务器不会被阻塞等待备份服务器的响应。
  • 由于备份服务器的确认并不是实时的,所以存在一定的数据风险。在主服务器发生故障时,可能会丢失尚未传输到备份服务器的数据。
  • 异步复制适用于那些对性能要求较高,但对数据一致性要求相对较低的场景。

总结:

  • Quorum 同步复制在数据一致性方面提供更高的保证,但可能会对性能产生影响。
  • Async异步复制提供了更好的性能,但在某些情况下可能会导致数据丢失。

另外还需要注意的是,要实现 Quorum 同步复制,在PostGreSQL数据库中通常需要配置复制槽、设置同步级别等才够满足要求。

3.3 复制模式切换

3.3.1 查询复制模式

在openGauss数据库中,复制模式sync_state值是受到synchronous_standby_names参数配置的影响,使用OM方式部署的主备环境,synchronous_standby_names 默认是为ANY,可以通过如下两种方式查询当前数据库环境synchronous_standby_names 的值。

1)方式一

-- 查看 postgresql.conf 配置文件
[omm@opengauss-db2 dn]$ cat /opt/gaussdb/install/data/dn/postgresql.conf|grep -i synchronous_standby_names 
synchronous_standby_names = 'ANY 1(dn_6001)'    # standby servers that provide sync rep

2)方式二

-- 主库数据库查询,备库是查询不到信息  
-- 主库查询
[omm@opengauss-db2 ~]$ gsql -d postgres -p 26000
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# SELECT current_setting('synchronous_standby_names') AS synchronous_standby_names;
 synchronous_standby_names 
---------------------------
 ANY 1(dn_6001)
(1 row)

-- 备库查询
[omm@opengauss-db1 ~]$ gsql -d postgres -p 26000
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# SELECT current_setting('synchronous_standby_names') AS synchronous_standby_names;
 synchronous_standby_names 
---------------------------
 
(1 row)

synchronous_standby_names 值设置为 ‘ANY 1(dn_6001)’ any 意味着是潜在备库, 保证后面有 Any N 个是同步模式, 按照当前部署的一主一备这套主备环境,any 1 且只有一个备机, 表示就是同步备。

openGauss若通过OM安装生成,默认会设置 n / 2 个实例作为同步备。

3.3.2 切换复制模式

可以通过gs_guc命令进行复制模式的切换,gs_guc命令要在主库进行,无需重启主备数据库,若在备库执行,执行不会报错,但不会生效。synchronous_standby_names 设置为空,即将复制模式从Quorum 切换至Async模式。

gs_guc设置的命令为:gs_guc reload -D <datanode_dir> -c “synchronous_standby_names=’’”

实现操作如下:

-- openGauss 主库执行
[omm@opengauss-db2 ~]$ gsql -d postgres -p 26000
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;  
       pid       |   state   | client_addr  | sync_priority | sync_state 
-----------------+-----------+--------------+---------------+------------
 140128500840192 | Streaming | 10.110.3.155 |             1 | Quorum
(1 row)

openGauss=# \q
[omm@opengauss-db2 ~]$ gs_guc reload -D /opt/gaussdb/install/data/dn -c "synchronous_standby_names=''"
The gs_guc run with the following arguments: [gs_guc -D /opt/gaussdb/install/data/dn -c synchronous_standby_names='' reload ].
expected instance path: [/opt/gaussdb/install/data/dn/postgresql.conf]
gs_guc reload: synchronous_standby_names='': [/opt/gaussdb/install/data/dn/postgresql.conf]
server signaled

Total instances: 1. Failed instances: 0.
Success to perform gs_guc!

[omm@opengauss-db2 ~]$ gsql -d postgres -p 26000
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;
       pid       |   state   | client_addr  | sync_priority | sync_state 
-----------------+-----------+--------------+---------------+------------
 140128500840192 | Streaming | 10.110.3.155 |             0 | Async
(1 row)

若希望从Async重新切换至Quorum模式,可通过如下操作执行:

gs_guc reload -D <datanode_dir> -c “synchronous_standby_names=‘ANY X(dn_600XXX)’”

实验操作如下:

-- openGauss 主库执行
[omm@opengauss-db2 ~]$ gsql -d postgres -p 26000
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;
       pid       |   state   | client_addr  | sync_priority | sync_state 
-----------------+-----------+--------------+---------------+------------
 140128500840192 | Streaming | 10.110.3.155 |             0 | Async
(1 row)

openGauss=# \q
[omm@opengauss-db2 ~]$ gs_guc reload -D /opt/gaussdb/install/data/dn -c "synchronous_standby_names='ANY 1(dn_6001)'"
The gs_guc run with the following arguments: [gs_guc -D /opt/gaussdb/install/data/dn -c synchronous_standby_names='ANY 1(dn_6001)' reload ].
expected instance path: [/opt/gaussdb/install/data/dn/postgresql.conf]
gs_guc reload: synchronous_standby_names='ANY 1(dn_6001)': [/opt/gaussdb/install/data/dn/postgresql.conf]
server signaled

Total instances: 1. Failed instances: 0.
Success to perform gs_guc!

[omm@opengauss-db2 ~]$ gsql -d postgres -p 26000
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;
       pid       |   state   | client_addr  | sync_priority | sync_state 
-----------------+-----------+--------------+---------------+------------
 140128500840192 | Streaming | 10.110.3.155 |             1 | Quorum
(1 row)

四、恢复模式

pg_is_in_recovery是postGreSQL的一个内置函数,openGauss继承了postGreSQL,也含有这个函数,pg_is_in_recovery函数用来判断当前数据库实例是否处于恢复模式。

恢复模式是指数据库正在应用 WAL(Write-Ahead Log)日志以将备份的数据与主数据库同步。这通常发生在实施数据库恢复、故障切换或主备切换的过程中。在恢复模式下,数据库实例不能执行写操作,只能执行只读操作。

pg_is_in_recovery()函数返回一个布尔值,如果返回 true,则表示数据库当前处于恢复模式;如果返回 false,则表示数据库处于正常运行模式。

可以通过如下方式查询主备库的恢复模式。

-- 主库
[omm@opengauss-db2 ~]$ gsql -d postgres -p 26000
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# select pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 f
(1 row)
[omm@opengauss-db1 ~]$ gsql -d postgres -p 26000
gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:07:56 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# select pg_is_in_recovery();
 pg_is_in_recovery 
-------------------
 t
(1 row)

标签:架构,standby,数据库,synchronous,sync,state,主备,openGauss
From: https://blog.51cto.com/u_16191492/7039768

相关文章

  • openGauss学习笔记-36 openGauss 高级数据管理-TRUNCATE TABLE语句
    openGauss学习笔记-36openGauss高级数据管理-TRUNCATETABLE语句清理表数据,TRUNCATETABLE用于删除表的数据,但不删除表结构。也可以用DROPTABLE删除表,但是这个命令会连表的结构一起删除,如果想插入数据,需要重新建立这张表。它和在目标表上进行无条件的DELETE有同样的效果,但由于......
  • 分布式系统架构设计思想
    1.计算与存储分离 2.接口幂等,业务幂等,防重提交 3.功能性需求,非功能性需求之间的取舍平衡 4.数据的冷热分离 5.高内聚,低耦合,模块化设计,分层,防腐层,DDD  6.分布式系统,三大件  Redis,MQ,分布式数据库(1.满足事务处理简单,2.能快速......
  • 基于 Webpack4 和 Vue 的可热插拔式微前端架构
    如果项目对你有所帮助,可以给个star Github地址什么是PuzzlePuzzle是基于Vue和Webpack4实现的一种项目结构;业务模块可以像拼图一样与架构模块组合,形成不同的系统,而这一切都是可以在生产环境热插拔的;这意味着你可以随时向你的系统添加新的功能模块,甚至改版整个系统,而不需......
  • 防火墙双机热备之主备和主主相关知识
    参考:https://kb.hillstonenet.com/cn/ha-dual-redundancy-inspection/https://support.huawei.com/hedex/hdx.do?docid=EDOC1100149311&id=ZH-CN_CONCEPT_0178924792https://www.h3c.com/cn/d_201405/922032_30005_0.htmActive-Passive模式Active-Passive(A/P)模式:在HA簇中配置两台设......
  • x64架构运行arm64程序
    如题最开始是想要在x64平台构建arm64的docker镜像,最后发现安装完qemu后,可以直接运行arm64程序。安装qemusudoaptinstallqemu-user-static测试dockerrun-it--namebuntu_arm64arm64v8/ubuntu查看github的releases,发现还有qemu-x86_64-static,估计其他架构安装qemu后......
  • openGauss数据库在CentOS上的安装实践
    本文分享自华为云社区《openGauss数据库在CentOS上的安装实践》,作者:Gauss小松鼠。1.安装前准备安装数据库前先要有已安装centOS7.6的服务器+数据库安装包。首先找小伙伴申请了华为云ECS服务器安装好了OS,这里使用的是x86_64+centos。华为云服务器现在可是很划算呢,安装也很方......
  • 云原生架构实战:构建可弹性扩展的企业级应用
    云原生架构实战:构建可弹性扩展的企业级应用一、微服务架构与SpringCloud概述随着云计算和容器技术的普及,传统的单体应用架构逐渐暴露出扩展性、部署和维护等方面的瓶颈。微服务架构应运而生,将应用拆分成一组小型服务,每个服务都运行在自己的进程中,通过HTTP或消息中间件等通信机制......
  • 企业级架构设计:迈向大型项目开发的高级阶段
     企业级架构设计:迈向大型项目开发的高级阶段摘要:每个程序员、或者说每个工作者都应该有自己的职业规划,如果你不是富二代,不是官二代,也没有职业规划,希望你可以思考一下自己的将来。每个程序员、或者说每个工作者都应该有自己的职业规划,如果你不是富二代,不是官二代,也没有职业规划......
  • openGauss学习笔记-35 openGauss 高级数据管理-ALTER TABLE语句
    openGauss学习笔记-35openGauss高级数据管理-ALTERTABLE语句修改表,包括修改表的定义、重命名表、重命名表中指定的列、重命名表的约束、设置表的所属模式、添加/更新多个列、打开/关闭行访问控制开关。35.1语法格式在一张已经存在的表上添加列。ALTERTABLEtable_name......
  • 浅谈项目架构设计
    整理自b站up主主要一点是最合适的是最好的,不必为了过于追求某项技术而冗余!一.功能性需求1.跟实际的业务需求是对应的!2.所使用的技术框架是不是够先进,文档是否完善,使用过程中容易排查到问题3.技术是否为开源的,够不够活跃,更新频率等4.成本:学习成本,使用成本,迁移成本,维护成本,要......