《PolarDB for PostgreSQL源码与应用实战》——PolarDB for PostgreSQL高可用原理(中)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 《PolarDB for PostgreSQL源码与应用实战》——PolarDB for PostgreSQL高可用原理(中)

《PolarDB for PostgreSQL源码与应用实战》——PolarDB for PostgreSQL高可用原理(上) https://developer.aliyun.com/article/1232684?groupCode=polardbforpg


一致性协议复制实现


(一)基本原理


接下来介绍一致性协议复制的具体实现。


image.png


首先我们看一下PolarDB for PG一致性协议复制的基本原理,主要包含两方面,第一方面是通过原生的异步流复制来传输WAL日志,另一方面是哪些日志在多数派上已经同步成功,这是由Leader节点上通过X-Paxos协议来确定的。对X-Paxos来说,日志提交位点是以Consensus Log为载体的,然后推进Consensus Log提交位点,所以我们会针对每一段WAL日志生成一个相应的Consensus Log etnry,然后Consensus Log etnry中记录的是这段WAL日志的一个结束LSN。


如上图的例子,比如在Leader节点上,我们已经有三段日志,有了相应的一个Consensus Log etnry,第一段LSN是从100-200,第二段是从200-300,第三段是从300-450,然后生成的Consensus Log Index分别是1、2和3,我们把ConsensusLog etnry和WAL日志位点首先要结合起来,然后我们又引入了持久化的依赖,就是说每个Log etnry在持久化的时候,必须要确保相应位点的WAL日志已经持久化成功。


LogIndex1要持久化之前,我们必须要确保LSN等于200之前的WAL日志都已经回刷了,这样Consensus Log的回刷位点本身跟WAL日志的回刷位点也结合起来了。


在引入了这两个机制之后,如果Consensus Log提交成功了,那么就是说Consensus Log肯定已经在多数派上持久化成功了。根据刚才的依赖,对应位点的WAL日志肯定也已经在多数派上持久化成功了。


大家可以看看下面的例子,Leader上面有三段WAL日志已经生成对应的Log etnry,然后三个Log etnry对应的WAL日志也都已经持久化了,包括Consensus Log etnry自己也都已经持久化了。那么在Follower1这个节点上,虽然Log index为3的WAL日志已经持久化成功了,但是可能由于并没有接收到Log Index为3的Consensus etnry,所以Log etnry并没有持久化成功。然后Follower2上面Log Index为3的Consensus etnry和WAL日志,因为WAL日志本身都没有持久化成功,所以Consensus Log就根本不可能持久化成功。


在根据这三个节点的现有状态,就是根据X-Paxos协议,当前Leader会发现LogIndex为2的日志在多数派节点上已经都持久化成功了,所以在Consensus Log层面的Commit Index是2,转化成LSN之后,Commit LSN也就是300,这是我们针对LSN多数派同步的基本原理。


(二)进程/线程架构


下面讲一下实现层面的几个关键点


• 独立的consensus进程提供多数派日志同步服务

• WAL日志同步采用原生流复制逻辑



image.png


首先是进程和线程的架构,PG本身是多进程的架构,而X-Paxos是多线程架构,这里面会涉及到的一些问题,就是PG的进程本身无法直接调用X-Paxos的接口,或者它无法直接访问X-Paxos内部的私有内存,所以我们最终选择以X-Paxos为基础,然后新引入了一个Consensus的服务进程。


进程内部会包含多个线程,然后其中包含了X-Paxos的多线程,对外它主要提供多数派日志提交以及相关服务。这个服务是一个常驻的进程,就是说当startup进程启动之后,在这个进程中启动。


首先介绍一下Consensus进程内部的几类线程,第一部分就是X-Paxos内部的一些线程,包括I/O线程和工作线程。I/O线程主要负责节点间的网络通信,工作线程主要负责协议的处理,比如发起选举,比如Follower节点要处理日志的Append请求,可能需要发起选举的请求,主要是跟一致性协议、算法相关的处理逻辑。


除了这些线程外,Consensus进程本身又引入了四类线程,首先是 Append Thread。刚才在原理里提到说,我们会对每一段的WAL日志生成Consensus log,这主要是由 Append Thread 来完成的。它根据当前 WAL 日志的回刷位点来生成Consensus log etnry,然后把log etnry传递给X-Paxos进行同步。


第二类线程是 Advance thread,是推进WAL日志的提交位点,它主要就是从X-Paxos中获取当前 Consensus log 的提交位点,然后把它转化成LSN位点。另外,Advance thread同时会根据Consensus协议层的一些状态变化,来驱动PG层进行状态变更。比如Consensus层发生了切除操作,那么Advance层检测到切除的动作或事件之后,它就会触发驱动Postmaster或startup进程进行一些相应的变动,这个下文会具体阐述。


第三个是Command 线程,它主要是处理一些集群变更的命令。比如Leader切换、增删节点等命令,一般来说在PG内部的处理方式是用户发生的请求一般由Server Process处理,但Server Process本身又无法直接调用X-Paxos内部的一些接口,所以我们的处理方式是Server Process把所有的管理请求放到一个共享队列里,然后由Command threads从共享队列里面拿请求来处理,处理完成之后再把执行结果放到执行队列里面去,然后返回给Server进程。


第四类是统计类的线程,这一类线程主要是处理一些状态和统计信息获取的类型图,也就是获取X-Paxos协议内部的一些状态。整个处理的逻辑跟集群变更的命令差不多,也是通过共享队列进行交互。

接下来讲一下Consensus内部的内存情况,以及它的并发控制机制。


内部内存主要分为两种,一种是X-Paxos本身分配的私有内存,这部分内存只有Consensus内部的一些线程,包括X-Paxos线程,以及刚才提到的Server Threads。Server Threads包括 Command Threads和统计的Statistics线程。


除了这一类内存之外,另外一种内存可以由X-Paxos线程,Consensus线程以及PG进程都可以访问的共享内存。这些内存主要是进行Consensus process以及 PG进程之间的一些状态交互,这类内存的访问接口必须是线程安全的。对于PG侧的一些共享内存,Consensus Process内部可能也是需要访问的,这时候我们必须要确保Consensus Process内部只有一个线程会访问这些内存,可以认为Consensus Process来访问这块内存。


第三个是Consensus Log的管理,这里能确保只有Consensus process内部的一些线程进行读写。

以上是整个进程和线程的架构。


《PolarDB for PostgreSQL源码与应用实战》——PolarDB for PostgreSQL高可用原理(下) https://developer.aliyun.com/article/1232677?groupCode=polardbforpg



相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
存储 Cloud Native 关系型数据库
PolarDB 高可用架构设计与实践
【8月更文第27天】 在现代互联网应用中,数据库作为核心的数据存储层,其稳定性和可靠性尤为重要。阿里云的 PolarDB 作为一款云原生的关系型数据库服务,提供了高可用、高性能和自动化的特性,适用于各种规模的应用。本文将详细介绍 PolarDB 的高可用架构设计,并探讨其实现数据安全性和业务连续性的关键技术。
52 0
|
2月前
|
人工智能 关系型数据库 MySQL
基于阿里云的PolarDB MySQL版实现AI增强数据管理
本文将介绍如何利用阿里云的PolarDB MySQL版结合AI技术,实现数据管理的自动化和智能化。
197 0
|
1月前
|
SQL 关系型数据库 MySQL
linux 上源码编译安装 PolarDB-X
linux 上源码编译安装 PolarDB-X
108 6
linux 上源码编译安装 PolarDB-X
|
2月前
|
缓存 运维 关系型数据库
数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
经过深入的技术剖析与性能对比,PolarDB-X DN凭借其自研的X-Paxos协议和一系列优化设计,在性能、正确性、可用性及资源开销等方面展现出对MySQL MGR的多项优势,但MGR在MySQL生态体系内也占据重要地位,但需要考虑备库宕机抖动、跨机房容灾性能波动、稳定性等各种情况,因此如果想用好MGR,必须配备专业的技术和运维团队的支持。 在面对大规模、高并发、高可用性需求时,PolarDB-X存储引擎以其独特的技术优势和优异的性能表现,相比于MGR在开箱即用的场景下,PolarDB-X基于DN的集中式(标准版)在功能和性能都做到了很好的平衡,成为了极具竞争力的数据库解决方案。
107588 34
|
2月前
|
关系型数据库 MySQL 分布式数据库
云原生数据库PolarDB MySQL版的体验评测
我有幸参与了云原生数据库PolarDB MySQL版的体验评测。在这次评测中,我主要关注了以下几个方面:产品控制台操作体验、产品文档阅读体验、产品API使用体验、控制台产品监控页面以及生态周边。
51 11
云原生数据库PolarDB MySQL版的体验评测
|
1月前
|
关系型数据库 MySQL 分布式数据库
PolarDB 并行查询问题之保证与MySQL的兼容性如何解决
PolarDB 并行查询问题之保证与MySQL的兼容性如何解决
20 1
|
2月前
|
关系型数据库 MySQL 分布式数据库
PolarDB产品使用问题之使用polardb for mysql数据库的外网地址在程序中连接经常超时,如何解决
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
2月前
|
运维 关系型数据库 MySQL
PolarDB产品使用问题之PolarDB MySQL版和PolarDB-X的区别是什么
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
2月前
|
关系型数据库 MySQL 测试技术
【有奖活动】体验PolarDB MySQL 无感切换赢桌面收纳桶
体验PolarDB的无感切换技术,完成就送桌面收纳桶,最高得小米米家照片打印机!
|
2月前
|
关系型数据库 MySQL 分布式数据库
云原生数据库PolarDB MySQL版评测报告
云原生数据库PolarDB MySQL版评测报告
50 4

热门文章

最新文章

相关产品

  • 云原生数据库 PolarDB