各位新朋友~记得先点蓝字关注我哦~
在PostgreSQL数据库中,有这样一种强大的高可用技术,叫做streaming replication,译作流复制,又称流式复制,类似于oracle的dataguard,也是通过传输“redo”日志来确保主备库的一致性,那么在PostgreSQL中的重做日志叫做预写日志(Write-ahead logging),简称WAL日志。
postgresql流复制发展技术时间线
在PostgreSQL9.0之前,是基于文件(base-file)的传输方式,其传输WAL日志的方法是主库写完一个完整的WAL日志之后,再把WAL日志文件拷贝到备库,然后备库再应用该WAL文件,当然了,备库也只能作为备份的存在,因为它不支持读写。且由于不是实时同步,势必导致高延迟的主备延迟。
在9.0版本之后引入了流复制方法,通过流复制,备库不断的从主库同步相应的数据,并在备库应用每个WAL record,每次传输单位是WAL日志的record。同时PostgreSQL9.0之后提供了Hot Standby,能够实现和oracle 11g出现的active dataguard一样的功能,备库在接收并应用WAL日志的同时也能够为用户提供只读服务,实现读写分离,提升了用户体验。

流复制的发展在每个版本都有不同程度的迭代和更新,逐步成长为一个功能丰富、使用方便的高可用架构。从9.0版本开始到现在,流复制的应运而生,伴随着时间发展延续,其灵活性和稳定性从一定程度上打响了PostgreSQL在数据库浪潮中占得一席之地的重要一枪。
流复制的原理
接下来我就带你们简单研究一下流复制模式的工作原理,通过前面的阐述,我们已经了解到了流复制就是通过将主库产生的WAL日志,不断地传输到备库,然后备库应用WAL来实现对原数据的更改确保一致性的过程,那么主备库中各进程具体是怎么协同操作的呢?

从图示中我们可以很清楚的看到,PostgreSQL服务器的后台进程在事务commit之后,一边准备将脏数据刷入磁盘上的数据文件中,一边通过walbuffer将操作记录写入wal日志,然后主库通过walsender进程将wal日志传输给备库,备库walreceiver进程接收,使用walwrite进程写入自己本地的wal日志中,最后通过startup进程应用到数据文件上,实现备库与主库数据的一致性。
本期《PostgreSQL强大的高可用技术》上就介绍到这里了,下一期就让我们具体来动手操作如何搭建一个PostgreSQL流复制环境,敬请关注!
美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。
