首页 > 数据库 >PostgreSQL 16逻辑复制改进 (译)

PostgreSQL 16逻辑复制改进 (译)

时间:2024-10-27 11:33:15浏览次数:1  
标签:订阅 wal PostgreSQL 16 复制 节点 size

原文地址:https://www.pgedge.com/blog/postgresql-16-logical-replication-improvements-in-action

 

我之前简要介绍了PostgreSQL中的复制方法,并概述了PostgreSQL 16中逻辑复制的一些关键特性。在这篇博客中,我将深入探讨逻辑复制的几个性能特性,展示这些特性在实际操作中的步骤,并分享性能测试的结果。

博客将重点关注PostgreSQL 16中的并行应用和二进制复制特性。并行应用特性允许订阅节点使用并行后台工作进程来处理大型进行中的事务的变更。用于从发布者应用变更的并行工作进程的数量由max_parallel_apply_workers_per_subscription参数控制。第二个性能特性是二进制复制。此特性允许逻辑复制以二进制格式进行初始数据复制,这在复制包含二进制列的表时提供了良好的性能提升。

 

Parallel Apply

并行apply是一种性能特性,它为复制大型、正在进行的事务提供了性能上的优势。为了实现这一点,我们首先开始将更改流式传输到订阅者节点,然后在订阅者节点上利用并行后台工作程序来应用这些更改,而与此同时,这些更改还在从发布者节点流式传输过来。您可以使用max_parallel_apply_workers_per_subscription配置参数来设置订阅者节点上用于应用更改的并行工作程序的数量。

 

下面的示例展示了如何使用这一令人兴奋的逻辑复制功能。我们还提供了在不同区域的几个AWS实例上运行测试时所得到的示例性能数据。

在本示例中,发布者运行在AWS的us-east-1区域,而订阅者节点则运行在AWS的us-west-2区域。

Publisher

要配置发布者节点,请连接到该节点并执行以下操作:

1. 使用initdb创建一个新的PostgreSQL集群(实例),并设置以下配置参数。请根据您的服务器规格指定合适的值:

shared_buffers=2GB
wal_level = logical
client_min_messages = warning
checkpoint_timeout = 30min
max_wal_size = 20GB
min_wal_size = 10GB
autovacuum = off
logical_decoding_work_mem = 64MB
2. 创建一个用于发布的表;我们使用了以下命令:
CREATE TABLE large_test (id int primary key, num1 bigint, num2 double precision, num3 double precision );

3. 以FOR ALL TABLES方式创建发布 ; 你可以选择只为上一步中创建的large_test表创建一个发布:

CREATE PUBLICATION pub FOR ALL TABLES 

Subscriber

要配置订阅者节点,请连接到该节点并执行以下操作:

1. 使用initdb创建一个新的集群(实例),并设置以下配置参数。这些参数需要根据您的服务器规格进行设置:

shared_buffers=2GB
wal_level = logical
client_min_messages = warning
checkpoint_timeout = 30min
max_wal_size = 20GB
min_wal_size = 10GB
autovacuum = off
logical_decoding_work_mem = 64MB
max_parallel_apply_workers_per_subscription = 4
对于我们的测试服务器,我将max_parallel_apply_workers_per_subscription设置为4,以生成4个并行worker,用于将更改应用到订阅者节点。 2. 创建用于发布的表,以接收来自发布者的复制流:
CREATE TABLE large_test (id int primary key, num1 bigint, num2 double precision, num3 double precision );
3. 创建具有到发布者的连接属性的订阅:
CREATE SUBSCRIPTION sub CONNECTION 'host=ec2-44-209-69-249.compute-1.amazonaws.com user=admin password=password dbname=demo' PUBLICATION pub WITH (copy_data = off, streaming=parallel, synchronous_commit=remote_apply);
请注意,为了这个测试的目的,我们将copy_data参数设置为off,这样我们就可以流式传输表更改,而不是进行初始数据复制。我们还将流类型设置为并行;这将启用并行应用特性,并将更改应用到具有指定数量的工作者的订阅者节点。 译者注:copy_data为off时,订阅端不会初始化原始数据。    

Publisher

为了设置我们的测试场景,我们连接到发布者节点并执行以下操作:

1. 将synchronous_standby_names设置为订阅者的名称;要使用并行应用功能,你其实无需执行此操作;这一步仅出于本次测试的目的。设置此参数可以确保后端等待订阅者节点上的应用,这样我们就可以测量时间:

cat << EOF >> /opt/pgedge/data/pg16/postgresql.conf
synchronous_standby_names = 'sub'
EOF
2、重启PostgreSQL服务。 3,psql运行以下命令。该命令在发布者节点上启动并计时一个大事务:
\timing
EXPLAIN (ANALYZE, BUFFERS) INSERT INTO large_test (id, num1, num2, num3)
        SELECT i, round(random()*10), random(), random()*142
        FROM generate_series(1, 5000000) s(i);

Results

如果将流设置为并行,则需要58887.540 ms(00:58.888)来完成事务并在订阅者节点上应用更改。 将流设置为关闭时,   则需要106909.268 ms(01:46.909)来完成事务并在订阅者节点上应用更改。 这为使用并行应用的大型正在进行的事务提供了高达50-60%的性能增益。    

Binary Copy

二进制复制是PostgreSQL 16中新增的逻辑复制的性能特性之一。二进制复制功能使得能够以二进制格式进行表数据的初始复制。
虽然之前的版本已经添加了二进制格式的流式数据功能,但在PostgreSQL 16之前并不支持以二进制模式进行表的初始复制。
我使用了两台AWS实例进行了测试,以展示这一特性所带来的性能提升。以下示例展示了如何启用此功能,并提供了使用二进制格式与非二进制格式进行初始数据加载测试的性能数据。

 

为了设置我们的二进制复制测试场景,请连接到发布者节点并执行以下操作:

1,设置以下配置参数,以最大化您的系统性能:

shared_buffers=2GB
wal_level = logical
client_min_messages = warning
checkpoint_timeout = 30min
max_wal_size = 20GB
min_wal_size = 10GB
autovacuum = off
logical_decoding_work_mem = 64MB

2. 创建一张包含 bytea 字段的表:

CREATE TABLE large_test (id int primary key, num1 bytea, num2 bytea, num3 double precision );

3. 创建一个发布,并指定FOR ALL TABLES 选项:

CREATE PUBLICATION pub FOR ALL TABLES

4. 往表中写入数据:

\timing
EXPLAIN (ANALYZE, BUFFERS) INSERT INTO large_test (id, num1, num2, num3)
        SELECT i, md5(round(random()*10)::text)::bytea, md5(random()::text)::bytea, random()*142
        FROM generate_series(1, 50000000) s(i);

5. 初始化数据之后检查表的大小

SELECT pg_size_pretty (pg_relation_size('large_test'));
 pg_size_pretty 
----------------
 5208 MB
(1 row)
 

Subscriber

连接到订阅服务器执行以下操作

1. 请根据您的系统设置以下配置参数:

shared_buffers=2GB
wal_level = logical
client_min_messages = warning
checkpoint_timeout = 30min
max_wal_size = 20GB
min_wal_size = 10GB
autovacuum = off
logical_decoding_work_mem = 64MB

2. 创建与发布节点一样结构的表:

CREATE TABLE large_test (id int primary key, num1 bytea, num2 bytea, num3 double precision );

3.创建订阅;设置binary 参数为true 并且 copy_data 参数为 on 用于初始数据传输。

CREATE SUBSCRIPTION sub CONNECTION 'host=ec2-44-209-69-249.compute-1.amazonaws.com user=admin password=password dbname=demo' PUBLICATION pub WITH (copy_data=on, binary=true);

4. 创建以下函数,对从发布者到订阅者的初始数据拷贝进行计时:

CREATE OR REPLACE PROCEDURE wait_for_rep() LANGUAGE plpgsql AS $$ BEGIN WHILE (SELECT count(*) != 0 FROM pg_subscription_rel WHERE srsubstate <> 'r') LOOP COMMIT; END LOOP; END; $$;

5. 调用函数来计算传输时间:

\timing
call wait_for_rep();

Results

  • 如果没有binary load (binary set to false), 需要383884.913 ms(06:23.885)才能完成事务并在订阅者节点上应用更改。
  • 如果使用 binary load (binary set to true),需要267149.655 ms(04:27.150)才能完成事务并在订阅者节点上应用更改。

当以binary load格式执行初始表复制时,这将提升32%的性能

 

Conclusion

分布式PostgreSQL数据库的使用正在迅速增长,而复制功能是任何分布式系统的关键核心部分。随着每个主要版本的发布,PostgreSQL中的复制功能正逐渐变得更加成熟且功能丰富。逻辑复制的基础工作在PostgreSQL 10之前就已奠定,但逻辑复制功能本身在PostgreSQL 10中才发展成为一个可用的形式。自那以后,复制支持得到了极大的增强,每个版本中添加的主要功能都值得单独写一篇博客来介绍,我将在适当的时候进行覆盖。本博客将介绍PostgreSQL 16中添加的新逻辑复制性能功能;请持续关注我们的博客,我们将继续讨论PostgreSQL 16中剩余的逻辑复制功能。  

标签:订阅,wal,PostgreSQL,16,复制,节点,size
From: https://www.cnblogs.com/wy123/p/18508099

相关文章

  • 【matlab代码】3个模型的IMM例程(匀速、左转、右转),附源代码(可复制粘贴)
    文章目录3个模型的IMM源代码运行结果代码介绍总结3个模型的IMM代码实现了基于IMMIMMIMM(InteractingMultipleModel)算法的目标跟踪。它使用三种不同的运动模型(匀速直线运动、左转弯和右转弯)来预测目标的位置,并通过卡尔曼滤波进行状......
  • redis高级篇之skiplist跳表 第164节答疑
    跳表查询的空间复杂度分析比起单纯的单链表,跳表需要存储多级索引,肯定要消耗更多的存储空间。那到底需要消耗多少额外的存储空间呢?我们来分析一下跳表的空间复杂度。第一步:首先原始链表长度为n,第二步:两两取首,每层索引的结点数:n/2,n/4,n/8..,8,4,2每上升一级就减少一半,......
  • Docker部署MySQL主从复制
    1.主从复制概念及优势1.1概念MySQL主从复制是一种数据库复制技术,它允许将一个数据库服务器(主服务器)上的数据更改复制到一个或多个数据库服务器(从服务器)。这种技术在数据库管理和维护中扮演着重要的角色,尤其是在需要数据冗余、负载均衡和高可用性的场景中。主从复制的概念......
  • 【C++ 图论 DFS】1443. 收集树上所有苹果的最少时间|1682
    本文涉及知识点C++图论C++DFSLeetCode1443.收集树上所有苹果的最少时间给你一棵有n个节点的无向树,节点编号为0到n-1,它们中有一些节点有苹果。通过树上的一条边,需要花费1秒钟。你从节点0出发,请你返回最少需要多少秒,可以收集到所有苹果,并回到节点0。无向......
  • vue3+java+springboot在线考试系统(08169)
    目录功能介绍具体实现截图技术介绍开发核心技术介绍:技术创新点vue3和vue2的区别:核心代码部分展示非功能需求分析系统开发流程软件测试源码获取功能介绍随着社会的发展,系统的管理形势越来越严峻。越来越多的用户利用互联网获得信息,但各种信息鱼龙混杂,信息真假难以辨......
  • 【MySQL数据库】MySQL主从复制
    文章目录MySQL主从复制MySQL主从复制的分类MySQL主从复制原理MySQL主从复制的配置步骤MySQL主从复制的同步模式MySQL主从复制实验环境准备关闭防火墙和SELinux时间同步主服务器设置从服务器设置MySQL主从复制配置主服务器配置从服务器配置(以Slave1为例,Slave2配置......
  • CCF认证-201609-3 | 炉石传说
    问题描述《炉石传说:魔兽英雄传》(Hearthstone:HeroesofWarcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示)。游戏在一个战斗棋盘上进行,由两名玩家轮流进行操作,本题所使用的炉石传说游戏的简化规则如下:*玩家会控制一些角色,每个角色有自己的生命......
  • 16课单词
     ジョギングjyoginngu慢跑シャワーsyawa浴びます(浴びる)abiシャワーを浴びます明るい(あかるい) どうやってdouyatteーばん(ー番)bann乗ります(乗る)の電車に乗りますでんしゃ大学前(だいがくまえ)降ります(降りる)お電車を降ります......
  • 深度解读:PostgreSQL执行计划的高效优化指南
    全文目录:开篇语前言:为何要解读PostgreSQL执行计划?......
  • 【2024潇湘夜雨】WIN 11_IoT_Ent_LTSC_2024_24H2.26100.2161软件选装纯净特别版10.26
    【系统简介】=============================================================1.本次更新母盘来自WIN11_IoT_Ent_LTSC_2024_24H2.26100.2161.进桌面后稍等片刻,等待后续部分优化完成。2.全程离线精简、无人值守调用优化处理制作。部分优化适配系统可能要重启几次,即使显示适配失败也......