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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
DataWorks Java 关系型数据库
DataWorks常见问题之将预警信息发送至邮箱
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
35 1
|
4月前
|
存储 SQL 关系型数据库
PolarDB这个sql行存和列存性能差别好大 ,为什么?
PolarDB这个sql行存和列存性能差别好大 ,为什么?
33 0
|
4月前
|
存储 关系型数据库 数据库
postgresql|数据库|提升查询性能的物化视图解析
postgresql|数据库|提升查询性能的物化视图解析
156 0
|
6月前
|
监控 关系型数据库 数据库
《PostgreSQL性能大提升:实用优化技巧》
《PostgreSQL性能大提升:实用优化技巧》
334 0
|
3月前
|
关系型数据库 MySQL Serverless
阿里云云原生数据库 PolarDB MySQL Serverless:卓越的性能与无与伦比的弹性
阿里云原生数据库 PolarDB MySQL Serverless 拥有卓越性能和无与伦比的弹性。通过实验体验,深入了解其基本管理和配置、智能弹性伸缩特性和全局一致性特性。实验包括主节点和只读节点的弹性压测以及全局一致性测试,旨在亲身体验 PolarDB 的强大性能。通过实验,可以更好地在实际业务场景中应用 PolarDB,并根据需求进行性能优化和调整。
680 2
|
5月前
|
缓存 关系型数据库 数据库
PostgreSQL技术大讲堂 - 第32讲:数据库参数调整
从零开始学PostgreSQL技术大讲堂 - 第32讲:数据库参数调整
449 2
|
4月前
|
SQL 关系型数据库 数据库
postgresql数据库修改参数的方式
在PostgreSQL数据库中,你可以通过多种方式修改数据库参数,以更改其行为。以下是一些常见的修改数据库参数的方式: 1. **通过配置文件修改(postgresql.conf):** PostgreSQL的配置文件是 `postgresql.conf`。你可以直接编辑该文件,找到要修改的参数,修改其值,然后重新启动PostgreSQL服务以使更改生效。 通常,`postgresql.conf` 文件位于 PostgreSQL 数据目录下。修改完毕后,确保重新启动 PostgreSQL 服务。 2. **使用 ALTER SYSTEM 命令:** PostgreSQL
105 1
|
2月前
|
关系型数据库 Java 分布式数据库
PolarDB for PostgreSQL参数问题之参数删除失败如何解决
PolarDB for PostgreSQL是基于PostgreSQL开发的一款云原生关系型数据库服务,它提供了高性能、高可用性和弹性扩展的特性;本合集将围绕PolarDB(pg)的部署、管理和优化提供指导,以及常见问题的排查和解决办法。
|
3月前
|
存储 关系型数据库 分布式数据库
阿里云PolarDB解决乐麦多源数据存储性能问题
乐麦通过使用PolarDB数据库,使整个系统之间的数据查询分析更加高效
390 3
|
3月前
|
关系型数据库 数据挖掘 分布式数据库
报名预约|体验PolarDB澎湃性能与高性价比在线直播
「飞天技术沙龙数据库技术周」直播聚焦PolarDB产品体验