暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB-PG原理解读——LogIndex(二)

PolarDB农夫山泉 2023-08-25
212

PolarDB PostgreSQL版(以下简称 PolarDB-PG)是一款阿里云自主研发的企业级数据库产品,采用计算存储分离架构,兼容 PostgreSQL 与 Oracle。PolarDB-PG 的存储与计算能力均可横向扩展,具有高可靠、高可用、弹性扩展等企业级数据库特性。同时,PolarDB-PG 具有大规模并行计算能力,可以应对 OLTP 与 OLAP 混合负载;还具有时空、向量、搜索、图谱等多模创新特性,可以满足企业对数据处理日新月异的新需求。

WAL Meta

WAL 日志又称为 XLOG Record,如下图,每个 XLOG Record 由两部分组成:

  • 通用的首部部分 general header portion:该部分即为 XLogRecord 结构体,固定长度。主要用于存放该条 XLOG Record 的通用信息,如 XLOG Record 的长度、生成该条 XLOG Record 的事务 ID、该条 XLOG Record 对应的资源管理器类型等;
  • 数据部分 data portion:该部分又可以划分为首部和数据两个部分,其中首部部分 header part 包含 0 ~ N 个 XLogRecordBlockHeader 结构体及 0 ~ 1 个 XLogRecordDataHeader[Short|Long] 结构体。数据部分 data part 则包含 block data 及 main data。每一个 XLogRecordBlockHeader 对应数据部分的一个 Block data,XLogRecordDataHeader[Short|Long] 则与数据部分的 main data 对应。
    image.png
    wal meta.png

共享存储模式下,读写节点 RW 与只读节点 RO 之间无需传输完整的 WAL 日志,仅传输 WAL Meta 数据,WAL Meta 即为上图中的 general header portion + header part + main data,RO 节点可基于 WAL Meta 从共享存储上读取完整的 WAL 日志内容。该机制下,RW 与 RO 之间传输 WAL Meta 的流程如下:
image.png
wal meta传输.png

  1. 当 RW 节点中的事务对其数据进行修改时,会生成对应的 WAL 日志并将其写入 WAL Buffer,同时拷贝对应的 WAL meta 数据至内存中的 WAL Meta queue 中;
  2. 同步流复制模式下,事务提交时会先将 WAL Buffer 中对应的 WAL 日志 flush 到磁盘,此后会唤醒 WalSender 进程;
  3. WalSender 进程发现有新的日志可以发送,则从 WAL Meta queue 中读取对应的 WAL Meta,通过已建立的流复制连接发送到对端的 RO;
  4. RO 的 WalReceiver 进程接收到新的日志数据之后,将其 push 到内存的 WAL Meta queue 中,同时通知 Startup 进程有新的日志到达;
  5. Startup 从 WAL Meta queue 中读取对应的 meta 数据,解析生成对应的 LogIndex memtable 即可。

RW 与 RO 节点的流复制不传输具体的 payload 数据,减少了网络数据传输量;此外,RW 节点的 WalSender 进程从内存中的 WAL Meta queue 中获取 WAL Meta 信息,RO 节点的 WalReceiver 进程接收到 WAL Meta 后也同样将其保存至内存的 WAL Meta queue 中,相较于传统主备模式减少了日志发送及接收的磁盘 I/O 过程,从而提升传输速度,降低 RW 与 RO 之间的延迟。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论