天天看点

PostgreSQL on ECS多云盘的部署、快照备份和恢复

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>