PostgreSQL复制原理及高可用集群 ——朱贤文

本文涉及的产品
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云数据库 RDS SQL Server,基础系列 2核4GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: PostgreSQL复制原理及高可用集群——朱贤文

内容简要:

一、PostgreSQL高可用

二、PostgreSQL流复制

三、PostgreSQL逻辑复制

四、PostgreSQL高可用集群

 

 

一、PostgreSQL高可用

(一)PostgreSQL高可用的种类

l  常用的高可用架构及基本原理包括:

1)共享存储;

2)流复制;

3)逻辑复制;

 

1.  共享存储

共享存储是所用的存储空间相同,但实例运行放在不同的节点上。

示意图如下:

image.png

当在正常工作状态,主节点在计算机上启动,但是计算机里文件系统是接在SAN存储上,SAN存储同时也可以连接到备用节点,正常情况下主节点对共享存储进行读写,对外提供业务和服务。

image.png

如上图所示,当主节点故障时,会由备用节点接管数据库,重新启动实例做回滚。这种架构底层用到专门的存储叫SAN,它的好处是数据放在共享存储上,当主节点坏掉,从节点启动后会沿着主节点坏掉的时间点进行回滚,回滚到最后一次切换,经过CommitRollback,最后把数据库打开对外提供服务,不会丢数据。

这对数据可靠性要求较高的行业,是比较好的方案。

 

2.流复制

Oracle里面,可以用对等的DataGate概念对应PostgreSQL的流复制。根据数据流,每一个数据流Commit的时候会复制下去。

流复制分为:同步流复制和异步流复制。

根据用户不同的配置情况,在流复制里面可以搭建很多节。主节点上面,对外正常提供读写服务,然后通过流复制,可以挂一个或者多个从节点。在从节点上面,可以根据业务场景的需要,对高可用的需要或者负载均衡的需要,搭建一个或者多个二级从节点,根据业务需求,第二级从节点上再往后可以搭建第三、第四、第五等多级从节点。

image.png

流复制特点总结:

主节点可以有多个从节点;

从节点上还可以挂载从节点;

从节点个数没有明确限制,层级无限制;

主从间可以同步复制、可以一步复制,也可以同步一步混合复制。

 

3.逻辑复制

逻辑复制是数据库内部数据块的具体操作,比如InsertDelete操作解析出来,经过发布节点Sender进程向外发布之后,然后订阅节点对订阅 Publisher定义的指定名字进行搜索表的操作。

image.png

逻辑复制特点总结:

所有节点都是对等关系,都可读写;

所有节点可以是发布节点,订阅节点,也可以同时是发布节点和订阅节点。

 

逻辑复制和流复制之间的差别是:

流复制里只有一个主节点,可以挂很多从节点。逻辑复制里所有的节点都是对等的主节点,都可以提供对外读写操作。

逻辑复制实际是从逻辑上把 SQL解析出来,到其他订阅节点进行重放,相当于SQL的重新回放。流复制发布的数据是更改的数据块。

 

 

二、PostgreSQL流复制

image.png

PostgreSQL数据库流复制基本原理

如上图所示,从写程序流程来看基本原理,首先启动Postmaster进程,系统正常运行,如果客户端(WalReciver)进行流复制,启动之后客户端会连到MasterMaster收到流复制信号会Fork一个指定层,指定层启动WalSender,后面是相应的流程,根据系统ID或用户网段在相应时间内完成。

计算要从什么时间点取什么数据呢?

系统在有SendTimeLineHistory的情况下会选择优先使用,否则会去做一些其他操作。通过CreateReplicationSlot开始找复制的时间点拷贝数据,SendPhysicak收到私人信息后会进行写操作,整个流程形成一个大循环。

image.png

数据库的Commit操作之后,Execute执行器将要改的脏数据写到WAL,通过Sender发送到从数据库,从数据库这端对应的Receiver写到WAL日志里面,WAL再到数据库文件Date File Heaps,写到数据库之后,外面的查询执行器就可以进行取数据,以上就是流复制的大致流程。

image.png

上方为流复制环境搭建实现过程,用 pg_basebackup命令搭建,用 help关键的参数,这里“-d”是拷贝过来的数据库要放在哪个目录,“-f”是用什么样子的格式拷过来,“p|tt是纯文本,p是裸数据,-r”是以什么样子的速率来拷,可以限制它的速度等等。

下面举一个简单的例子:


image.png

首先定义到“data/appdb”目录,用basebackup命令,从主节点“192.168.56.3”通过Replicator用户,把“d”指定到这里,“-R -Fp -Xs –P”,“-R”命令会创建一个从节点,同时自动创建Replicator文件。

如果是设置同步复制,通过synchronous_standby_names控制同步复制。例如部署一套系统在两个数据中心里面,这两个数据中心通过FIRST 2 (application1,application2,application3)的方式Commit成功了,认为整个系统成功。

 

l  Synchronous_satandby_names=FIRST 2(application1, application2, application3)

image.png

Application1Application2在同一个数据中心,因此主节点Commit的时候要保证Application1Application2两个节点同时成功。

FIRST 2是定义三个Application,定义前面两个成功则认为提交成功。用特性限制服务器可以限制整个架构,例如同城用一个Commit或者异地用一个Commit,可根据实际情况进行定义。

 

l  Synchronous_satandby_names=ANY 2(application1, application2, application3)

image.png

一个数据库三个 Slave,只需要Application1/2/3其中任意两个Commit成功即可。

 

l  Synchronous_commit=off

同步复制有几个点来控制具体行为,这些行为会决定Commit本身的性能与可靠性等。如下图所示:

image.png

首先在主节点上面CommitExecuter直接写内存,相当于从WAL buffer里去写WAL文件,这个过程只确WAL buffer里面的东西是否写到文件系统中,这个时候相当于关闭本地写WAL文件的过程,具有一定风险,但是Commit返回会非常快。

 

l  Synchronous_commit=local


image.png

synchronous_commit=local表示Commit的时候将数据写到本地的WAL文件里,数据库是写到本地提交。虽然是同步,但Local的可靠性比 Off要高一点,能保证主节点上面数据写入到日志。

 

l  Synchronous_commit=on(default)

image.png

还有一个选项synchronous_commit=on(default)On表示Commit完成。Commit之后写到WAL文件中,然后通过 WAL Sender发送出去,从端接收数据,同时将数据写到从端的WAL filed,这个是默认的级别,相当于本地的WAL与从端的WAL里都有这个数据,数据就是安全的。

 

l  Synchronous_commit=remote_write

image.png

Sender发送数据,Reserve收到后向文件系统中写数据,把数据提交给文件系统的缓存,不会把数据从缓存中刷到磁盘内。相当于对端那个服务器,这个返回非常快,因为当数据FlashWAL文件时它已经返回,但只能保证本地这一份数据的可靠性,无法保证远端那一份数据的可靠性,有可能会导致数据丢失。

如果遇到一些极端情况,例如Commit恰好在中间某处,Reserve往下写但还没有写到WAL文件之前,如果这个时候阻断断电,从端没有把数据切换,将数据库切换成组,就可能会存在一定的问题。

 

l  synchronous_commit = remote_apply

数据写到WAL文件中,从端数据库把数据Apply到远端的数据库了,此时两端数据库里面的内容完全一致。如下图所示:

image.png

Remote_play是复制性能最低的一种,一旦数据Remote_play到远端的数据库之后,主端有什么数据,从端就一定能看见什么样的数据。

但是在Synchronous_commit=on(default)默认的情况下,数据则不一定相同。因为主端写的压力很大,只会将从端写到WAL中。由于是先改的脏数据再去改数据,因此主端可以查,但在从端因为做 Replay的时候速度是串行的,Replay的性能不一定能跟上,因此这个时候到从端去查数据不一定能够查到,但这并不意味着数据丢失,而是因为数据仍在WAL中,还没恢复到数据库里。

 

 

三、PostgreSQL逻辑复制

1.逻辑复制的工作原理

image.png


逻辑复制有个概念是发布者和订阅者,主端如果要通过逻辑复制,首先要进行定义,配置文件里面有一个日志级别,要把它设置为Logical之后的话就可以去定义Publisher,传输通道是用Sender or Reserve机制。

 

2.逻辑复制搭建

image.png

首先在发布端确保Level(此处指Logical),确保逻辑复制可以正常进行。通过PG_hba设置用户所需要的权限,设置完成之后可以到数据库中去定义Publication。例如定Publication的名字为“insert _only”,然后FOR TABLE叫“mydata”,table给它定义一个权限WITH (publish = 'insert');,此时,这张表只会去做发布InsertUpdateDelete这样的操作,不会往外发送,用户可以通过Publish关键字里面定义多个行为。

当命令执行完之后,Population也完成,接着设置订阅端,通过CREATE SUBSCRIPTION mysub,同样要跟连接串定义,例如是主机、端口、用户、数据库等,有了连接串之后,Publication用定义对应的名字,这样在主端做什么事情,从端马上可以得到反馈。

 

四、PostgreSQL ECOX高可用集群

ECOX是一个专门为PostgreSQL流复制设计的高可用集群。

image.png

如上图所示,ECOX有一个仲裁集群,它避免单点故障导致误判。一个仲裁集群可以管NPG集群,在PG集群内部的主从是自动切换的。

image.png

上图为ECOX的基本原理例子,有012三个节点,可以看到节点的IP与端口是否在线,MasterCommasterLast Master的详情。

这个系统目前支持PostgreSQLHunghu DB以及KingBase新版本。

image.png

我们也将ECOX做到自己的数据云平台“鸿鹄彩云”中,支持PostgreSQLGreenplum,给业务带来了很大的帮助。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
49 3
|
1月前
|
消息中间件 分布式计算 关系型数据库
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
44 0
|
23天前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
MySQL主从复制原理和使用
|
1月前
|
缓存 算法 关系型数据库
Mysql(3)—数据库相关概念及工作原理
数据库是一个以某种有组织的方式存储的数据集合。它通常包括一个或多个不同的主题领域或用途的数据表。
50 5
Mysql(3)—数据库相关概念及工作原理
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1630 14
|
23天前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
1月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
1月前
|
存储 SQL 关系型数据库
mysql中主键索引和联合索引的原理与区别
本文详细介绍了MySQL中的主键索引和联合索引原理及其区别。主键索引按主键值排序,叶节点仅存储数据区,而索引页则存储索引和指向数据域的指针。联合索引由多个字段组成,遵循最左前缀原则,可提高查询效率。文章还探讨了索引扫描原理、索引失效情况及设计原则,并对比了InnoDB与MyISAM存储引擎中聚簇索引和非聚簇索引的特点。对于优化MySQL性能具有参考价值。
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
84 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
37 0

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版