逻辑复制parallel并发参数测试
一、测试结果、测试环境描述
1.1、测试结果
-
cpu
表中有1000万条数据,大小为1652MB
,当更新的数据量多于10万条的时候有明显变化,多余30万条的时候相差2倍。 -
更新的数据量较多时,逻辑复制使用并发参数相比于使用默认参数性能更高。
-
更新的数据量较少时,逻辑复制使用并发参数相比于使用默认参数性能相差不大。
更新记录条数 | streaming | 影响到订阅端耗时 | 执行SQL语句耗时 |
---|---|---|---|
1000 | parallel | 71ms | 12.077 ms |
1000 | - | 45 ms | 15.496 ms |
50000 | parallel | 1199 ms | 357.201 ms |
50000 | - | 1396 ms | 586.545 ms |
100000 | parallel | 4637 ms | 3227.055 ms |
100000 | - | 6153 ms | 4591.671 ms |
300000 | parallel | 6815 ms | 5567.591 ms |
300000 | - | 11850 ms | 6337.377 ms |
1000000 | parallel | 24214 ms | 12734.563 ms |
1000000 | - | 46474 ms | 15579.122 ms |
表中streaming列说明
-
-- streaming列为 “-” SELECT substream FROM pg_subscription WHERE subname = 'sub_cpu'; substream ----------- f (1 row)
-
-- streaming列为parallel SELECT substream FROM pg_subscription WHERE subname = 'sub_cpu'; substream ----------- p (1 row)
1.2、测试环境
数据库版本 | PostgreSQL-16.6 |
---|---|
内核数 | 4 core (x86-64) |
内存大小 | 4 GB |
OS 系统版本 | rhel7 |
架构 | x86-64 |
二、逻辑复制环境搭建
2.1、发布端环境部署
-- 创建一个表
CREATE TABLE cpu (
id SERIAL PRIMARY KEY,
time TIMESTAMPTZ NOT NULL, -- 时间戳,带时区
tags_id INTEGER, -- 标签ID,整数类型
hostname TEXT, -- 主机名,文本类型
usage_user DOUBLE PRECISION, -- 用户CPU使用率,双精度浮点数
usage_system DOUBLE PRECISION, -- 系统CPU使用率,双精度浮点数
usage_idle DOUBLE PRECISION, -- 空闲CPU使用率,双精度浮点数
usage_nice DOUBLE PRECISION, -- Nice CPU使用率,双精度浮点数
usage_iowait DOUBLE PRECISION, -- I/O等待CPU使用率,双精度浮点数
usage_irq DOUBLE PRECISION, -- 硬中断CPU使用率,双精度浮点数
usage_softirq DOUBLE PRECISION, -- 软件中断CPU使用率,双精度浮点数
usage_steal DOUBLE PRECISION, -- 偷取CPU使用率,双精度浮点数
usage_guest DOUBLE PRECISION, -- Guest CPU使用率,双精度浮点数
usage_guest_nice DOUBLE PRECISION -- Guest Nice CPU使用率,双精度浮点数
);
-- 给表添加逻辑复制标识
ALTER TABLE cpu REPLICA IDENTITY DEFAULT;
-- 创建发布
CREATE PUBLICATION pub_cpu FOR TABLE cpu;
-- 创建逻辑复制槽
SELECT pg_create_logical_replication_slot('fd_logical', 'pgoutput');
-- 查看逻辑复制槽、发布
SELECT * FROM pg_publication WHERE pubname = 'pub_cpu';
SELECT * FROM pg_replication_slots WHERE slot_name = 'fd_logical';
2.2、订阅端环境部署
-- 订阅端创建表
CREATE TABLE cpu (
id SERIAL PRIMARY KEY,
time TIMESTAMPTZ NOT NULL, -- 时间戳,带时区
tags_id INTEGER, -- 标签ID,整数类型
hostname TEXT, -- 主机名,文本类型
usage_user DOUBLE PRECISION, -- 用户CPU使用率,双精度浮点数
usage_system DOUBLE PRECISION, -- 系统CPU使用率,双精度浮点数
usage_idle DOUBLE PRECISION, -- 空闲CPU使用率,双精度浮点数
usage_nice DOUBLE PRECISION, -- Nice CPU使用率,双精度浮点数
usage_iowait DOUBLE PRECISION, -- I/O等待CPU使用率,双精度浮点数
usage_irq DOUBLE PRECISION, -- 硬中断CPU使用率,双精度浮点数
usage_softirq DOUBLE PRECISION, -- 软件中断CPU使用率,双精度浮点数
usage_steal DOUBLE PRECISION, -- 偷取CPU使用率,双精度浮点数
usage_guest DOUBLE PRECISION, -- Guest CPU使用率,双精度浮点数
usage_guest_nice DOUBLE PRECISION -- Guest Nice CPU使用率,双精度浮点数
);
-- 创建订阅
CREATE SUBSCRIPTION sub_cpu
CONNECTION 'host=192.168.6.108 port=9432 dbname=test user=fbase password=fbase'
PUBLICATION pub_cpu
WITH (
slot_name = 'fd_logical',
create_slot = false,
streaming = 'parallel'
);
-- 查看订阅端信息
SELECT * FROM pg_subscription WHERE subname = 'sub_cpu';
-- 查看订阅状态
SELECT * FROM pg_stat_subscription WHERE subid IN (SELECT oid FROM pg_subscription WHERE subname = 'sub_cpu');
给已有的发布端添加表
-- 查看复制状态、逻辑复制槽状态
select * from pg_replication_slots;
select * from pg_stat_replication;
-- 发布端、订阅端创建表
CREATE TABLE memory (
id SERIAL PRIMARY KEY,
time TIMESTAMPTZ NOT NULL,
tags_id INTEGER,
hostname TEXT,
total_memory BIGINT