PolarDB for PostgreSQLPolarDB for PostgreSQL
  • 架构简介
  • 快速部署
  • 进阶部署
  • 共享存储设备的准备

    • 阿里云 ECS + ESSD 云盘存储
  • 文件系统的准备

    • 格式化并挂载 PFS
  • 部署 PolarDB-PG 数据库

    • 基于单机文件系统部署
    • 基于 PFS 文件系统部署
  • 更多部署方式

    • 购买商业版
  • 日常运维

    • 备份恢复
    • 共享存储在线扩容
    • 计算节点扩缩容
    • Replica 节点在线 Promote
  • 问题诊断

    • CPU 使用率高的排查方法
  • 性能测试

    • TPC-C 测试
    • TPC-H 测试
  • 功能分类

    • 高性能
    • 高可用
    • 安全
    • 弹性跨机并行查询(ePQ)
    • 第三方插件
  • PolarDB for PostgreSQL

    • 特性总览
    • HTAP 架构详解
    • 缓冲区管理
    • DDL 同步
    • LogIndex
  • PostgreSQL

    • ANALYZE 源码解读
    • Sequence 使用、原理全面解析
  • 基于 Docker 容器开发
  • 定制开发环境
  • 贡献代码
  • 贡献文档
  • 编码风格
  • 问题报告
  • English
  • 简体中文
GitHub
  • 架构简介
  • 快速部署
  • 进阶部署
  • 共享存储设备的准备

    • 阿里云 ECS + ESSD 云盘存储
  • 文件系统的准备

    • 格式化并挂载 PFS
  • 部署 PolarDB-PG 数据库

    • 基于单机文件系统部署
    • 基于 PFS 文件系统部署
  • 更多部署方式

    • 购买商业版
  • 日常运维

    • 备份恢复
    • 共享存储在线扩容
    • 计算节点扩缩容
    • Replica 节点在线 Promote
  • 问题诊断

    • CPU 使用率高的排查方法
  • 性能测试

    • TPC-C 测试
    • TPC-H 测试
  • 功能分类

    • 高性能
    • 高可用
    • 安全
    • 弹性跨机并行查询(ePQ)
    • 第三方插件
  • PolarDB for PostgreSQL

    • 特性总览
    • HTAP 架构详解
    • 缓冲区管理
    • DDL 同步
    • LogIndex
  • PostgreSQL

    • ANALYZE 源码解读
    • Sequence 使用、原理全面解析
  • 基于 Docker 容器开发
  • 定制开发环境
  • 贡献代码
  • 贡献文档
  • 编码风格
  • 问题报告
  • English
  • 简体中文
GitHub
  • 自研功能
    • 功能分类

      • 高性能
        • 预读 / 预扩展
        • 表大小缓存
        • Shared Server
      • 高可用
        • 只读节点 Online Promote
        • WAL 日志并行回放
        • DataMax 日志节点
        • Resource Manager
        • 闪回表和闪回日志
      • 安全
        • TDE 透明数据加密
        • polar_login_history 会话访问历史
      • 弹性跨机并行查询(ePQ)
        • ePQ 执行计划查看与分析
        • ePQ 计算节点范围选择与并行度控制
        • ePQ 支持分区表查询
        • ePQ 支持创建 B-Tree 索引并行加速
        • 集群拓扑视图
        • 自适应扫描
        • 并行 INSERT
        • ePQ 支持创建/刷新物化视图并行加速和批量写入
      • 第三方插件
        • pgvector
        • smlar

集群拓扑视图

V11 / v1.1.20-

烛远

2022/09/20

20 min

  • 功能介绍
  • 术语
  • 功能使用
  • 设计实现
    • 信息采集
    • 更新频率
    • 采集维度
    • 消息格式
    • 内部使用
    • 结果展示

功能介绍

PolarDB for PostgreSQL 的 ePQ 弹性跨机并行查询功能可以将一个大查询分散到多个节点上执行,从而加快查询速度。该功能会涉及到各个节点之间的通信,包括执行计划的分发、执行的控制、结果的获取等等。因此设计了 集群拓扑视图 功能,用于为 ePQ 组件收集并展示集群的拓扑信息,实现跨节点查询。

术语

  • RW / Primary:读写节点,后统称为 Primary
  • RO / Replica:只读节点,后统称为 Replica
  • Standby:灾备节点
  • Replication Slot:流复制槽,PostgreSQL 中用于持久化流复制关系的机制

功能使用

集群拓扑视图的维护是完全透明的,用户只需要按照部署文档搭建一写多读的集群,集群拓扑视图即可正确维护起来。关键在于需要搭建带有流复制槽的 Replica / Standby 节点。

使用以下接口可以获取集群拓扑视图(执行结果来自于 PolarDB for PostgreSQL 11):

postgres=# SELECT * FROM polar_cluster_info;
 name  |   host    | port | release_date | version | slot_name |  type   | state | cpu | cpu_quota | memory | memory_quota | iops | iops_quota | connection | connection_quota | px_connection | px_connection_quota | px_node
-------+-----------+------+--------------+---------+-----------+---------+-------+-----+-----------+--------+--------------+------+------------+------------+------------------+---------------+---------------------+---------
 node0 | 127.0.0.1 | 5432 | 20220930     | 1.1.27  |           | RW      | Ready |   0 |         0 |      0 |            0 |    0 |          0 |          0 |                0 |             0 |                   0 | f
 node1 | 127.0.0.1 | 5433 | 20220930     | 1.1.27  | replica1  | RO      | Ready |   0 |         0 |      0 |            0 |    0 |          0 |          0 |                0 |             0 |                   0 | t
 node2 | 127.0.0.1 | 5434 | 20220930     | 1.1.27  | replica2  | RO      | Ready |   0 |         0 |      0 |            0 |    0 |          0 |          0 |                0 |             0 |                   0 | t
 node3 | 127.0.0.1 | 5431 | 20220930     | 1.1.27  | standby1  | Standby | Ready |   0 |         0 |      0 |            0 |    0 |          0 |          0 |                0 |             0 |                   0 | f
(4 rows)
  • name 是节点的名称,是自动生成的。
  • host / port 表示了节点的连接信息。在这里,都是本地地址。
  • release_date 和 version 标识了 PolarDB 的版本信息。
  • slot_name 是节点连接所使用的流复制槽,只有使用流复制槽连接上来的节点才会被统计在该视图中(除 Primary 节点外)。
  • type 表示节点的类型,有三类:
    • PolarDB for PostgreSQL 11:RW / RO / Standby
    • PolarDB for PostgreSQL 14:Primary / Replica / Standby
  • state 表示节点的状态。有 Offline / Going Offline / Disabled / Initialized / Pending / Ready / Unknown 这些状态,其中只有 Ready 才有可能参与 PX 计算,其他的都无法参与 PX 计算。
  • px_node 表示是否参与 PX 计算。
  • 后续字段都是性能采集相关的字段,目前都是留空的。

对于 ePQ 查询来说,默认只有 Replica 节点参与。可以通过参数控制使用 Primary 节点或者 Standby 节点参与计算:

-- 使 Primary 节点参与计算
SET polar_px_use_master = ON;

-- 使 Standby 节点参与计算
SET polar_px_use_standby = ON;

提示

从 PolarDB for PostgreSQL 14 起,polar_px_use_master 参数改名为 polar_px_use_primary。

还可以使用 polar_px_nodes 指定哪些节点参与 PX 计算。例如使用上述集群拓扑视图,可以执行如下命令,让 PX 查询只在 replica1 上执行。

SET polar_px_nodes = 'node1';

设计实现

信息采集

集群拓扑视图信息的采集是通过流复制来传递信息的。该功能对流复制协议增加了新的消息类型用于集群拓扑视图的传递。分为以下两个步骤:

  • Replica / Standby 将状态传递给 Primary
  • Primary 汇总集群拓扑视图,返回给 Replica / Standby

更新频率

集群拓扑视图并非定时更新与发送,因为视图并非一直变化。只有当节点刚启动时,或发生关键状态变化时再进行更新发送。

在具体实现上,Primary 节点收集的全局状态带有版本 generation,只有在接收到节点拓扑变化才会递增;当全局状态版本更新后,才会发送到其他节点,其他节点接收到后,设置到自己的节点上。

生成集群拓扑视图

采集维度

状态指标:

  • 节点 name
  • 节点 host / port
  • 节点 slot_name
  • 节点负载(CPU / MEM / 连接 / IOPS)
  • 节点状态
    • Offline
    • Going Offline
    • Disabled
    • Initialized
    • Pending
    • Ready
    • Unknown

消息格式

同 WAL Sender / WAL Reciver 的其他消息的做法,新增 'm' 和 'M' 消息类型,用于收集节点信息和广播集群拓扑视图。

内部使用

提供接口获取 Replica 列表,提供 IP / port 等信息,用于 PX 查询。

预留了较多的负载接口,可以根据负载来实现动态调整并行度。(尚未接入)

同时增加了参数 polar_px_use_master / polar_px_use_standby,将 Primary / Standby 加入到 PX 计算中,默认不打开(可能会有正确性问题,因为快照格式、Vacuum 等原因,快照有可能不可用)。

ePQ 会使用上述信息生成节点的连接信息并缓存下来,并在 ePQ 查询中使用该视图。当 generation 更新或者设置了 polar_px_nodes / polar_px_use_master / polar_px_use_standby 时,该缓存会被重置,并在下次使用时重新生成缓存。

结果展示

通过 polar_monitor 插件提供视图,将上述集群拓扑视图提供出去,在任意节点均可获取。

在 GitHub 上编辑此页
上次更新:
贡献者: mrdrivingduck
Prev
ePQ 支持创建 B-Tree 索引并行加速
Next
自适应扫描