postgresql , ecs , 云盘 , 快照 , 一致性备份 , 时间点恢复 , zfs , lvm , raid , 并行计算
随着阿里云云盘的发展,云盘的性能已经越来越好了。iops可以做到十万以上,读写吞吐也超过1gb/s了。相信随着网络的发展,ssd云盘iops突破40万,读写吞吐突破4gb/s也不远了。
不过这里的iops和吞吐是指并发的io能力,单次io的延迟与本地还是不能比(将来rdma网络也许能解决这个问题)。
某些业务对数据库的(要求响应时间很快的写小事务)对单次io延迟比较敏感,不过postgresql有方法可以解决这个小缺陷。
1、后台io,(write syscall)
postgresql 的大多数io为后台io(bgwriter, backend writer),所以刷shared buffer对io延迟不敏感。
2、异步提交
事务提交时,写wal异步提交。不会造成数据不一致,但是当数据库crash,可能丢失在wal buffer中未提交的事务(最多10毫秒)。
这种方法是最有效的。
3、组提交
组提交,解决wal写瓶颈,将多个同时提交的事务的wal fsync动作合并为单次,从而减少fsync次数,提高高并发时的写小事务的tps。
由于我们看到的云盘iops和读写吞吐指标是并发指标,数据库如何利用好这么好的指标呢?对高并发小事务不是问题,肯定是能将它用起来的,但是对于低并发,长事务(分析型业务),如何利用云盘的iops能力和读写吞吐能力呢?
postgresql的并行计算特性可以充分利用云盘的并发iops和读写带宽。
单块云盘的iops能力有上限,容量有上限,读写带宽也有上限。好在ecs支持多块云盘,目前已支持一台ecs挂载16块云盘。
通过多块云盘,组卷条带后,提高读写带宽。以linux rhel/centos 7.x为例,组卷和条带方法:
1、逻辑卷
2、软raid
3、zfs
<a href="http://zfsonlinux.org/">http://zfsonlinux.org/</a>
假设环境中有16块ssd云盘
1、创建pv
2、创建vg
3、创建lv,设置条带
16块盘,每个条带单位为8kb。
4、创建文件系统,设置条带
5、mount文件系统
6、fio测试
1、安装软件
<a href="https://github.com/digoal/blog/blob/master/201611/20161121_01.md">《postgresql on linux 最佳部署手册》</a>
2、初始化数据库
3、配置postgresql.conf
4、配置归档,归档目录不能放在数据盘的云盘里面,你可以放到其他云盘,或者放到oss。
这里为了演示方便,放在本地云盘。(保证与数据云盘不是同一云盘)
5、压测
5.1、写入大吞吐压测
初始化
大吞吐写入测试,写入速度直逼200万行/s
实际为写wal的瓶颈,采用unlogged table,写入速度直逼1000万行/s。
5.2、10亿数据量,oltp压测
5.3、并行读压测
1、开始备份
2、打云盘快照
调用api或在阿里云ecs控制台执行。
3、压测
打快照的过程中,产生一些数据库变更。
使用前面的例子,大吞吐写入测试(使用logged table)、oltp测试、夹杂建表、删表。
4、云盘快照结束
5、停止压测
6、结束备份
7、切换日志
8、检查归档已正常
确保打快照过程中产生的wal全部归档成功。
9、生成每个测试表的checksum
实际上postgresql本身已支持增量备份、块级增量备份的功能,但是既然有云盘快照,可以只备归档和云盘镜像,数据少走一次网络开销。
基于pg本身的备份也简单介绍一下,见本文参考部分。
1、创建新ecs(可以根据镜像创建)
2、如果根据数据库ecs镜像创建,则不需要这一步。
部署postgresql软件,注意需要与主库软件、插件等一致。
3、根据云盘快照创建云盘
4、复原逻辑卷
5、检查文件系统
6、加载文件系统
7、清理wal文件,(因为是多盘快照,快照不可能在同一时间点,因此wal文件可能出现partial write。wal文件是恢复数据文件的关键,因此必须完整。所以我们从归档来获取wal。)。
注意,如果是单盘,可以只删除最后一个wal。
8、配置恢复
9、启动数据库
10、等待恢复完成,恢复完成即恢复到最后一个已归档的wal文件。
11、激活数据库
12、检查checksum
13、检查所有数据块是否正常。
1、postgresql 具备wal和full page write,可以实现数据文件的不一致恢复,也就是说备份时的数据文件partial write可以被检查点后的wal full page write page修复。最终实现一致性。
2、多块云盘并行备份,提高了数据备份的速度。
3、多块云盘,提升了整体的读写iops和读写带宽。
4、postgresql 通过组提交、异步提交、数据文件异步写,解决了云盘单次io延迟较本地延迟更高一点的性能问题。也就是说对io延迟不敏感。
5、postgresql 利用多核并行,可以在单条sql中,充分利用多块云盘带来的高iops和高读写带宽的能力。
6、通过逻辑卷、软radi、zfs等手段,可以充分利用多云盘的能力。
2、zfs
<a href="https://github.com/digoal/blog/blob/master/201608/20160823_09.md">《postgresql 最佳实践 - 块级增量备份(zfs篇)验证 - recovery test script for zfs snapshot clone + postgresql stream replication + archive》</a>
<a href="https://github.com/digoal/blog/blob/master/201608/20160823_08.md">《postgresql 最佳实践 - 块级增量备份(zfs篇)双机ha与块级备份部署》</a>
<a href="https://github.com/digoal/blog/blob/master/201608/20160823_07.md">《postgresql 最佳实践 - 块级增量备份(zfs篇)单个数据库采用多个zfs卷(如表空间)时如何一致性备份》</a>
<a href="https://github.com/digoal/blog/blob/master/201608/20160823_06.md">《postgresql 最佳实践 - 块级增量备份(zfs篇)备份集自动校验》</a>
<a href="https://github.com/digoal/blog/blob/master/201608/20160823_05.md">《postgresql 最佳实践 - 块级增量备份(zfs篇)方案与实战》</a>
3、man lvm
4、man mdadm
5、备份原理
<a href="https://github.com/digoal/blog/blob/master/201608/20160826_01.md">《postgresql 最佳实践 - 块级别增量备份(pg_rman baseon lsn)源码浅析与使用》</a>
6、时间点恢复原理与最佳实践
<a href="https://github.com/digoal/blog/blob/master/201608/20160823_04.md">《postgresql 最佳实践 - 任意时间点恢复源码分析》</a>
<a href="https://github.com/digoal/blog/blob/master/201608/20160823_03.md">《postgresql 最佳实践 - 在线增量备份与任意时间点恢复》</a>