前言
数据库的备份工作在日常生产中极为重要,如果你咨询一个DBA如何才能设计出高可用的数据备份与恢复方案,相信很多人都会从架构上给出很多容灾的意见。但归根到底,如果业务环节中数据库还牵涉到分布式环境,我认为一个好的方案需要达到三大要求:
- 多副本
- 持久化
- 一致性
日常架构设计中,我们不仅要保证数据额的成功备份,还要保证备份的数据可以快速恢复。在众多备份恢复可靠性方案中 主从复制 技术,可以说是最常见的实现,本文主要是介绍postgresql主备数据库的异步流复制的环境搭建与主备切换的操作实践,除了能把一些基础的原理运用在日常的数据库运维中,也可以加深对Postgresql数据库的底层知识了解。
postgres在9.0之后引入了主从的流复制机制,所谓流复制,就是从服务器通过tcp流从主服务器中同步相应的数据。这样当主服务器数据丢失时从服务器中仍有备份。
与基于文件日志传送相比,流复制允许保持从服务器更新。 从服务器连接主服务器,其产生的流WAL记录到从服务器, 而不需要等待主服务器写完WAL文件。
PostgreSQL流复制默认是异步的。在主服务器上提交事务和从服务器上变化可见之间有一个小的延迟,这个延迟远小于基于文件日志传送,通常1秒能完成。如果主服务器突然崩溃,可能会有少量数据丢失。
同步复制必须等主服务器和从服务器都写完WAL后才能提交事务。这样在一定程度上会增加事务的响应时间。
下面的学习与实践主要针对PostgreSQL的异步流复制(本文没有涉及到同步复制、逻辑复制等,如果大家想了解其它的备份方案,可以阅读相关官方文档或其他资料介绍)。
异步流复制的中心思想是:主库上提交事务时不需要等待备库接收WAL日志流并写入到备库WAL日志文件时便返回成功,因此异步流复制的TPS会相对同步流复制要高,延迟更低。
环境准备
操作系统 | 服务器IP | 节点名称 | 角色 |
---|---|---|---|
centos 7.2 | 172.17.0.2 | pghost1 | 主库 |
centos 7.2 | 172.17.0.5 | pghost2 | 备库 |
主要目录规范:
- 数据目录: /data/pg10/pg_root
- 表空间目录: /data/pg10/pg_tbs
- 应用程序目录: /apps/svr/pgsql
要注意的是:编译安装Pg我们使用的是root账户,但是一般情况下,我们对数据库的部署操作等应该使用非root的pg超级管理员账户,所以需要我们预先创建相关用户和目录,并设置相关权限:
$ groupadd postgres $ useradd postgres -g postgres $ passwd postgres $ mkdir -p /data/pg10/pg_root $ mkdir -p /data/pg10/tbs $ chown -R postgres:postgres /data/pg10