作者:乔宾·奥古斯丁
Jobin Augustine是PostgreSQL专家和开放源代码倡导者,在PostgreSQL,Oracle和其他数据库技术方面担任顾问、架构师、管理员、作家和培训师,有超过18年的工作经验。
他一直是开源社区的积极参与者,他的主要关注领域是数据库性能和优化。他是各种开放源代码项目的贡献者,并且是活跃的博客作者,并且喜欢用C ++和Python编写代码。
Jobin拥有计算机应用硕士学位,并于2018年以高级支持工程师的身份加入Percona。
随着硬件和软件的发展,数据库系统的瓶颈也在发生变化。许多旧问题可能会消失,但同时会引发新的问题。
通常,CPU和内存是一个限制。十多年前,具有4个核心的服务器属于“高端”服务器,作为DBA,最大的担心是如何管理可用资源。对于像我这样的老DBA,Oracle尝试使用RAC从多个主机为单个数据库池化CPU和内存,这是解决该问题的伟大尝试。然后是存储速度限制的日子。它是由多核和多线程处理器的普及以及内存大小和总线速度的提高触发的。企业试图使用复杂的SAN驱动器,带有缓存的专业存储来解决。直到现在,企业开始越来越多地转向NVMe驱动器。最近,我们开始注意一个新的瓶颈,这已成为许多数据库用户的难题。随着单主机服务器功能的增强,它开始处理大量事务。有一些系统在几分钟之内就可以生成数千个WAL文件,而且有一些案例表明,将WAL归档到更便宜,速度更慢的磁盘系统上无法赶上WAL的产生量。
为了增加更多的复杂性,许多组织更喜欢在低带宽网络上存储WAL存档。(Postgres归档中存在一个固有的问题,即如果滞后,则滞后的趋势会更大,因为存档过程需要在.ready文件中进行搜索。在此不再讨论。)
在此博客文章中,请您注意:如果还没有压缩WAL,可以很容易地实现压缩WAL,以及查询监视归档差距的查询。
归档之前压缩WAL的需求日益增加。幸运的是,大多数PostgreSQL备份工具(例如pgbackrest wal-g等)已经解决了这一问题。在archive_command 调用这些工具,默默地为用户归档日志。
例如,在pg_backrest中,我们可以指定archive_command,该命令在幕后使用gzip。
PgSQL
ALTERSYSTEMSETarchive_command='pgbackrest --stanza=mystanza
archive-push %p';
或者在WAL-G中,我们可以指定:
PgSQL
ALTERSYSTEMSETarchive_command='WALG_FILE_PREFIX=/path/to/archive
/usr/local/bin/wal-g wal-push %p';
这将对WAL文件进行lz4压缩。
但是,如果我们不使用任何特定的备份工具进行WAL压缩以进行归档,该怎么办?
我们仍然可以使用Linux工具(如gzip或bzip等)压缩WAL。默认情况下,大多数Linux安装中都提供Gzip,因此配置它很容易。
alter system set archive_command = '/usr/bin/gzip -c %p >
/home/postgres/archived/%f.gz';
但是,在WAL的所有压缩选项中,7za是最有趣的,它尽可能快地提供了最高的压缩率,这是产生高WAL的系统中的主要标准。您可能必须显式安装7za,它是额外存储库7zip软件包的一部分。
在CentOS7上是:
sudo yum install epel-release
sudo yum install p7zip
在Ubuntu上是:
sudo apt install p7zip-full
现在,我们能够像这样指定archive_command:
Shell
postgres=# alter system set archive_command = '7za a -bd -mx2 -bsp0 -bso0
/home/postgres/archived/%f.7z %p';
ALTER SYSTEM
在我的测试系统中,可以看到小于200kb的已归档WAL文件。大小可以根据WAL的内容而变化,这取决于数据库上事务的类型。
Shell
-rw-------.1postgres postgres <strong>197Kstrong> Feb 612:13
0000000100000000000000AA.7z
-rw-------.1postgres postgres <strong>197Kstrong> Feb 612:13
0000000100000000000000AB.7z
-rw-------.1postgres postgres <strong>198Kstrong> Feb 612:13
0000000100000000000000AC.7z
-rw-------.1postgres postgres <strong>196Kstrong> Feb 612:13
0000000100000000000000AD.7z
-rw-------.1postgres postgres <strong>197Kstrong> Feb 612:13
0000000100000000000000AE.7z
将16MB的文件压缩到千字节的速度肯定会节省网络带宽和存储,同时解决归档落后的问题。
存档并获得最高的压缩率只是其中一部分,我们也应该能够在需要时恢复它们。备份工具提供了自己的还原命令选项。例如,pgbackrest可以使用archive-get:
Shell
restore_command = 'pgbackrest --stanza=demo archive-get %f "%p"'
如果您选择使用gzip进行手动压缩,我们可以在restore_command中使用gunzip实用程序,如下所示:
Shell
gunzip -c /home/postgres/archived/%f.gz > %p
如果您已经开始使用PostgreSQL 12,则可以使用ALTER SYSTEM设置此参数:
Shell
postgres=# alter system set restore_command = 'gunzip -c
/home/postgres/archived/%f.gz > %p';
ALTER SYSTEM
或者,对于上述的7za,您可以使用以下方法:
Shell
postgres=# alter system set restore_command = '7za x -so
/home/postgres/archived/%f.7z > %p';
ALTER SYSTEM
但是,与archive_command更改不同,restore_command更改要求您重新启动备用数据库。
当前的WAL归档文件可以从pg_stat_archiver状态获得,但是使用WAL文件名来找出差距有些麻烦。我用来查找WAL存档滞后的示例查询是:
PgSQL
select
pg_walfile_name(pg_current_wal_lsn()),last_archived_wal,last_failed_wal,
('x'||substring(pg_walfile_name(pg_current_wal_lsn()),9,8))::bit(32)::int*
256+
('x'||substring(pg_walfile_name(pg_current_wal_lsn()),17))::bit(32)::int
-
('x'||substring(last_archived_wal,9,8))::bit(32)::int*256-
('x'||substring(last_archived_wal,17))::bit(32)::int
asdifffrompg_stat_archiver;
需要注意的是,当前的WAL和要归档的WAL都在同一时间轴上,从而使查询正常工作。我们很少会遇到与生产环境不同的情况。因此,在监视PostgreSQL服务器的WAL归档时,此查询可能会很有帮助。
中国开源软件推进联盟PostgreSQL分会(简称:PG分会)于2017年成立,由国内多家PG生态企业所共同发起,业务上接受工信部产业发展研究院指导。PG分会致力于构建PG产业生态,推动PG产学研用发展,是国内一家PG行业协会组织。
做你的舞台,show出自己的才华 。
投稿邮箱:partner@postgresqlchina.com
——愿能安放你不羁的灵魂
搞懂PostgreSQL数据库透明数据加密之加密算法介绍
PostgreSQL源码学习之:RegularLock
2019,年度数据库舍 PostgreSQL 其谁?
PostgreSQL使用分片(sharding)实现水平可扩展性
PostgreSQL原理解析之:PostgreSQL备机是否做checkpoint
见证精彩|PostgresConf.CN2019大会盛大开幕
PostgresConf.CN2019大会DAY2|三大分论坛,精彩不断
PostgresConf.CN2019培训日|爆满!Training Day现场速递!
「PCC-Training Day」培训日Day2圆满结束,PCC2019完美收官
创建PG全球生态!PostgresConf.CN2019大会盛大召开
首站起航!2019“让PG‘象’前行”上海站成功举行
走进蓉城丨2019“让PG‘象’前行”成都站成功举行
中国PG象牙塔计划发布,首批合作高校授牌仪式在天津举行
PostgreSQL实训基地落户沈阳航空航天大学和渤海大学,高校数据库课改正当时
相聚巴厘岛| PG Conf.Asia 2019 DAY0、DAY1简报
相知巴厘岛| PG Conf.Asia 2019 DAY2简报
相惜巴厘岛| PG Conf.Asia 2019 DAY3简报
关于中国PostgreSQL培训认证,你想知道的都在这里!
首批中国PGCA培训圆满结束,首批认证考试将于10月18日和20日举行!
中国首批PGCA认证考试圆满结束,203位考生成功获得认证!
中国第二批PGCA认证考试圆满结束,115位考生喜获认证!
重要通知:三方共建,中国PostgreSQL认证权威升级!
一场考试迎新年 | 12月28日,首次PGCE中级认证考试开考!
近500人参与!首次PGCE中级、第三批次PGCA初级认证考试落幕!