PostgreSQL流复制的几种不同参数设置及性能实测对比

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: PostgreSQL的流复制按是否等待slave的反馈分为同步流复制和异步流复制。理所当然,等待slave反馈的就是同步流复制,可以保障在主宕机的情况下安全的切到备机而不发生数据丢失。

PostgreSQL的流复制按是否等待slave的反馈分为同步流复制和异步流复制。理所当然,等待slave反馈的就是同步流复制,可以保障在主宕机的情况下安全的切到备机而不发生数据丢失。根据环境和流复制的同步方式的不同,性能可能会有很大差异。

 

1. 参数设置

如果要配置成同步流复制,synchronous_standby_names 必须设置为非空值。它指的是处于同步复制模式的slave的application_name。可以设置多个,用逗号分隔;也可以干脆设置成‘*’,代表任意slave。除此以外,同步还是异步就受synchronous_commit参数控制了,不同的设置代表了不同的性能和可靠性的权衡。具体如

synchronous_commit值
复制模式
说明
on 同步 先本地WAL记录刷盘并更新clog,等待收到同步slave写入WAL记录并刷盘成功的反馈后,才向会话返回事务成功。
remote_write 同步 先本地WAL记录刷盘并更新clog,等待收到同步slave写入WAL记录到磁盘的反馈后,才向会话返回事务成功。
local 异步 本地WAL记录刷盘并更新clog后,向会话返回事务成功。
off 异步 把WAL记录写到WAL缓存后,就返回事务成功。WAL记录的写盘和刷盘由wal writer进程在后台处理。

注1:执行每个更新语句时会写入WAL记录,并通知wal sender进程发送WAL到slave。(不像MySQL,MySQL在提交阶段才发送binlog,无疑会增加master等待slave反馈的时间,对大事务问题更严重。)

注2:参考src/backend/access/transam/xact.c中的RecordTransactionCommit()函数

 

使用strace进行分析,进一步可以知道:

  1. slave上,”wal receiver process“负责接受,写入WAL记录并刷盘。同步模式下每次事务提交写入WAL和刷盘;异步模式下,可能会合并多个事务,刷一次盘。
  2. master上,synchronous_commit=off时,"wal writer process"负责定期写WAL页(每次8K)和刷盘;其它情况下"postgres"会话进程负责在执行每个事务时写本地wal记录并刷盘。
strace -ewrite,lseek,fdatasync -T -tt -p 

 

2.性能对比

下面晒一下我的4核虚机环境下,不同synchronous_commit设置的性能数据。

测试方法

通过pgbench在scale为10的场景下,跑TPC-B测试。

[postgres@srdsdevapp73 ~]$ pgbench -n -h 10.27.177.246 -c 16 -j 4 -T 5
transaction type: TPC-B (sort of)
scaling factor: 10
query mode: simple
number of clients: 16
number of threads: 4
duration: 5 s
number of transactions actually processed: 18581
latency average: 4.305 ms
tps = 3710.162082 (including connections establishing)
tps = 3720.628664 (excluding connections establishing)

 

测试数据

架构 synchronous_commit值 tps 备注
单机 on 2481  
off 3939  
1主2从 on 1052 有一段时间一度降到307,应该和网络不稳定有关
remote_write 1711 有一段时间一度降到358,应该和网络不稳定有关
local 2447  
off 3774  

 

3.结论

同步复制导致的性能损失还是比较大的,使用remote_write而不是on可以很大程度上减少性能损失,是一个比较实用的选择。另外,网络抖动是个非常讨厌的问题。以上同步异步的性能差异仅供参考,因为不同的布署环境下可能相差很大

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
4月前
|
SQL 关系型数据库 PostgreSQL
CTE vs 子查询:深入拆解PostgreSQL复杂SQL的隐藏性能差异
本文深入探讨了PostgreSQL中CTE(公共表表达式)与子查询的选择对SQL性能的影响。通过分析两者底层机制,揭示CTE的物化特性及子查询的优化融合优势,并结合多场景案例对比执行效率。最终给出决策指南,帮助开发者根据数据量、引用次数和复杂度选择最优方案,同时提供高级优化技巧和版本演进建议,助力SQL性能调优。
333 1
|
缓存 关系型数据库 数据库
PostgreSQL性能
【8月更文挑战第26天】PostgreSQL性能
206 1
|
8月前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
194 2
|
10月前
|
Oracle 安全 关系型数据库
【赵渝强老师】PostgreSQL的参数文件
PostgreSQL数据库的四个主要参数文件包括:`postgresql.conf`(主要配置文件)、`pg_hba.conf`(访问控制文件)、`pg_ident.conf`(用户映射文件)和`postgresql.auto.conf`(自动保存修改后的参数)。视频讲解和详细说明帮助理解各文件的作用。
300 19
|
缓存 关系型数据库 数据库
如何优化 PostgreSQL 数据库性能?
如何优化 PostgreSQL 数据库性能?
551 2
|
缓存 关系型数据库 数据库
PostgreSQL的性能
PostgreSQL的性能
514 2
|
12月前
|
存储 关系型数据库 MySQL
四种数据库对比MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
四种数据库对比 MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
|
缓存 关系型数据库 数据库
PostgreSQL 查询性能
【8月更文挑战第5天】PostgreSQL 查询性能
232 8
|
关系型数据库 Java 数据库
PostgreSQL性能
【8月更文挑战第5天】PostgreSQL性能
324 7
|
监控 关系型数据库 数据库
如何优化PostgreSQL的性能?
【8月更文挑战第4天】如何优化PostgreSQL的性能?
631 7

推荐镜像

更多