pitr 原理_PostgreSQL热备原理研究及流复制运用

付莎

摘要:高可用性(HA-High Availability)是所有商用数据库系统必须具备的一项基本功能。该文阐述了PostgreSQL数据库的高可用性的实现原理及方法,并对PostgreSQL数据库的原生流复制功能实现高可用性热备功能进行了应用描述。

关键词:PostgreSQL;高可用性;热备;流复制

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)12-0001-03

Abstract: HA-High Availability is a basic function that all commercial database systems must have. This paper describes the realization principles and methods of HA-high availability PostgreSQL database, and describes the application of PostgreSQL database's native streaming replication function to achieve high availability hot standby function.

Key words: PostgreSQL; HA-High Availability; hot standby; streaming replication

PostgreSQL是一套企业级的、跨平台、高度可定制的、功能强大的开源数据库系统。其可靠性、稳定性、数据一致性等获得了业界内极高的声誉。是唯一能实现数据零丢失的开源数据库系统。随着PostgreSQL的商用逐渐推动,在数据库市场上成为对标Oracle,MSSQL等传统大型商业数据库的有力竞争者[1]。

数据库系统中,数据是所有一切的基础。数据的安全性和一致性是数据库系统中的重中之重。数据可能由于不可预见的各种原因丢失或损坏,因此数据的备份成为保证数据安全性的一个重要的后备手段。在此方面,企业级的PostgreSQL提供了多种功能特性保障数据的安全和可用性。

1 PostgreSQL数据备份

PostgreSQL可实现三种不同级别的数据备份方法:

SQL转储:利用pg_dump工具将数据转储为标准SQL语句组成的文件。需要时执行SQL语句即可恢复数据。此种方式通用性最好,实现简便,可在不同版本及不同操作系统间迁移和恢复数据。缺点为只能实现数据库的定期及全量备份。

文件系统级别备份:利用文件系统直接复制PostgreSQL数据文件进行备份操作,获取一个数据文件的“快照”。需要恢复或迁移时,再将“快照”文件拷贝至目标路径。此种方式实现简便,但限制条件也比较苛刻。(1)备份和恢复时,目标数据库必须停机操作。在一些特定系统中,停机是无法接受的。(2)只能备份和恢复整台服务器,不能有针对性的操作某一特定的数据库,数据容量巨大。(3)操作系统和PostgreSQL版本必须一致。

连续归档和时间点恢复(PITR):利用PostgreSQL提供的WAL(预写式日志)文件的连续归档特性,“备份”WAL文件。在“基础备份”的基础上,当需要恢复和迁移数据时,目标数据库上“重放”WAL,使目标数据库与原始数据库数据保持一致。基于“重放”WAL,可实现“增量”备份、“任意时间点”恢复、“温备”和“热备”等多种备份方式。此种方式技术实现相比较最为复杂,但可靠性和灵活性上却最高。在保障系统高可用性情况下,应是首选备份技术[2][4]。

以上三种数据备份方式各有优缺点,但相比较下,只有使用WAL连续归档技术实现数据备份、故障迁移,保障高可用性最为有效和便捷。

2 备份原理

2.1 WAL文件

WAL(Write Ahead Log)预写式日志文件是PostgreSQL中一个重要机制。作用与Oracle中redo log文件作用类似。用于保障数据的一致性以及事务的完整性。避免系统在崩溃时数据还在某级缓冲中,没来得及写入持久化文件中的脏数据产生的数据不一致性。具体来说,WAL的核心概念是数据文件的修改必须在这些动作被日志记录之后才被写入。WAL记录了完整的操作数据以及动作,先于数据被写入数据文件前顺序写入文件系统。WAL中的每一条记录使用CRC-32校验码保护,首先就保证了WAL的完整性。当系统需要重建数据时,由于WAL先于数据写入,则可顺序“回放”WAL文件中的先前数据和操作,直至某一设定时间点或WAL文件末尾停止,从而达到和先前一致的数据库状态。

WAL被PostgreSQL默认划分成16MB的段文件,按一定规则顺序命名文件并保存于系统pg_xlog目录下。默认情况下WAL被设置为minimal级别,该级别下某些批量操作的WAL可以被安全的跳过,这样这些操作能更快地完成。但该级别不包含有足够的信息来从基础备份和WAL来重建数据。因此构架高可用性系统时必须设置高于minimal的级别使用,例如archive或更高级别,以保证WAL包含有足够的重建数据信息[2]。

2.2 啟用WAL归档、传输实现备份

当系统启用archive或更高级别的WAL级别时,我们可通过归档WAL文件实现数据的备份。Postgresql并没有限定我们怎么样归档数据,而是提供了一个参数来自定义归档动作。当WAL文件产生后,我们可以简单的设置参数为拷贝WAL文件至另一磁盘驱动器目录,或执行复杂脚本将WAL传输至网络上另一台服务器。

利用上述WAL技术特性,我们可以简单的描述实现“双机热备”的过程。(1)设置主机归档模式wal_level为archive;(2)主机使用PostgreSQL提供的pg_basebackup等工具制作一次基础备份并将备份文件拷贝至备机,完成一次主被机间的基础备份;(3)主机产生WAL文件后通过archive_command参数调度命令传输至备机;(4)备机接收到WAL文件后,持续恢复主机的WAL文件,最大限度跟上主机数据产生速度[1][7]。

当主机发生故障时,此时由于主备机间传输WAL文件可能具有一定的延时原因或主机WAL文件并没有填充完一块(默认16MB),还没有开始传输,主备机间数据可能并不一致,备机落后于主机。此时如果使用故障迁移并使用备机提供数据服可能存在一定的数据丢失,但在某种程度上已经最大限度地保证了系统的可用性[2]。

2.3 PostgreSQL热备

通过上述WAL文件在主备服务器间的归档、传输以及重放,我们已经了解了PostgreSQL的“温备”原理。如需进一步提升备份级别,实现真正意义上的热备,我们必须通过其他技术手段减小主备服务器间的数据同步延时,实现主备服务器间的快速同步。

3流复制

3.1 流复制原理

PostgreSQL流复制是PostgreSQL9.0版本后才提供的功能,它的基本原理与上述主服务器WAL日志归档后传输至备服务器并重放以保证主备服务器数据一致情形类似。但流复制从PostgreSQL系统层面对这一过程进行了简化。首先主备服务器间使用PostgreSQL提供的TCP协议建立网络连接,不再使用archive_command参数命令进行第三方WAL文件传输。主服务器在数据变动并产生WAL记录后(并不需要完整一块16MB文件,仅为一次操作记录)立即将记录以TCP数据流的方式传送给备服务器,而不必等到 WAL文件被填充后成才进行传输[2]。此种机制极大的缩减了主备服务器间的数据同步延迟,拥有更高效的可用度。同时PostgreSQL9.0版本后提供了Hot Standby功能,支持备机在流复制基础上同步主服务器数据的同时还能提供备机数据的只读访问。此特性极大地提升了用户体验,也使数据库的读写分离、负载均衡等功能从PostgreSQL系统层面提供了技术实现(之前版本只能通过第三方插件形式实现)。PostgreSQL9.2版本后提供了级联复制功能,在实现主备服务器流复制数据同步的同时,备服务器还可将WAL转发给其他下位备机,实现更大规模的集群。流复制技术为数据库的热备、高可用性、负载均衡等提供了原生技术支持[5][6]。

当启用PostgreSQL主备服务器流复制功能后,将有walsender、walreceiver和startup三个进程启动参与整个流复制功能。简单来说walsender進程从主服务器启动,主要负责将主服务器产生的WAL日志记录发送给下位机;walreceiver进程则从备服务器启动,对应walsender进程与之通讯,主要负责接收上位机发送的WAL日志记录;startup进程则从备服务器启动,主要负责将walreceiver进程接收到WAL日志记录在备服务器上“回放”,以便达到主备服务器间的数据同步。在级联模式下,一台备服务器可能同时启动三个进程,即既负责接收上位机的WAL日志记录并回放,同时也将WAL日志记录继续发往下位机[3][5]。

3.2 异步流复制

PostgreSQL默认情况下启用的为异步流复制模式。此模式下主服务器不等待备机确认,主服务器上数据成功提交即视为操作完成。并将完成结果反馈给前台提交此操作的客户端。

假设上述操作完成后主服务器崩溃,某些已被提交的WAL日志还没来得及复制到备服务器(例如网络延时等),如此时进行了故障迁移,由于备服务器上则没有这笔操作数据,但此时前台客户端却得到了操作成功指令,这时将导致数据丢失。

再如主服务器上数据已成功提交,但还没来得及复制到备服务器(例如网络延时),并且运行着负载均衡架构,备服务器提供只读查询服务,那么此时使用备服务器查询到的结果将和主服务器数据不同,产生了数据不一致。

异步流复制虽然有可能产生上述问题,但异步流复制只需主服务确认即可的特性大大提升了系统的负载。在部分非关键的系统应用中也是一种可选方案[2]。

3.3 同步流复制

PostgreSQL开启配置参数synchronous_commit=on即可开启同步流复制。同步流复制能够保证一个事务的所有修改都能被传送到一台同步备服务器。在请求同步流复制时,一个写事务的每次提交将一直等待,直到收到一个确认表明该提交在主服务器和备服务器上都已经被写入到磁盘上的事务日志中。即保证主备服务器WAL日志双双落盘才返回成功[2][6]。此时虽然增加了主备服务期间来回通讯确认的等待时间,延长了前台客户端请求事务的响应时间。但等待确认提高了用户对于修改不会丢失的信心。此外如果有多台备服务器连接主服务器进行数据同步,通过配置参数synchronous_standby_names,还可设置等待全部或其中某几台完成WAL落盘确定即返回成功。在多台数据同步的集群中,可在高可用性和系统性能上找到一个平衡点[2][7]。

4 流复制应用

上述已就PostgreSQL的备份和流复制构建热备进行了原理和理论阐述。本节将就PostgreSQL双机同步流复制实现热备和故障迁移应用给出实现方案。目标:实现双机异地PostgreSQL数据库容灾热备。

预设主备机IP地址:主机192.10.1.100 备机192.10.1.101。下述配置文件*.conf都默认位于PostgreSQL安装路径data目录下。PostgreSQL9.3以上版本。

4.1 主机postgresql.conf文件配置

设置listen_addresses = '*';主服务器开启监听所有客户地址访问许可,默认值为只能监听本机访问,网络上其他服务器不允许连接。

设置wal_level = hot_standby;主服务WAL日志级别使用hot_standby级别,此级别下日志记录的信息和上文提到的archive相同,但外加了从WAL重建运行事务状态所需的其他信息,流复制必须设置此级别。

设置max_wal_senders=2;设置向备服务器进行发送walsender进程的最大连接数。本例中由于是使用双机热备,连接数2即可。

设置wal_keep_segments = 128;设置WAL文件被重用的最大值,确保旧的WAL段不会被太早重用(文件系统会对WAL进行循环覆盖使用以便节约磁盘空间)。避免由于主机数据量巨大,而备机还尚未处理,而主机已经覆盖了待未传输至备机处理的WAL文件。可根据系统负载情况调整[2]。

设置synchronous_commit=on;设置事务为同步模式。保证备机将提交记录写入到持久化存储中,主机事务才能成功返回[1][7]。

4.2 主机pg_hba.conf文件配置

增加配置项:host replication postgres 192.10.1.101/32 md5;增加IP192.10.1.101备机使用用户postgres 使用流复制功能访问许可。

上述配置完毕后重启PostgreSQL数据库,以便新设置项生效。

4.3 主机进行基础备份

a.开启pgsql程序,执行命令:select pg_start_backup('basebackup');此命令将使系统进入备份模式,执行基础备份。

b.待执行完毕后拷贝出data数据目录备用。

c.拷贝完毕后执行select pg_stop_backup();此命令系统终止备份模式并让在备份期间写入的最后一个WAL段文件能准备好被归档[1][2]。

4.4 备机拷贝文件

删除备机data目录下所有文件,并将上一步主机拷贝出的data目录下所有文件拷贝至备机data目录下。

4.5 备机postgresql.conf文件配置

设置hot_standby=on;开启备机在归档恢复期间或备机模式下开启只读查询模式。

4.6 备机recover.conf文件配置

备机创建recover.conf文件,并放置于data目录下。

设置standby_mode = 'on';指定为备机模式启动;

设置recovery_target_timeline = 'latest';使备机恢复到归档中能找到的最新的时间线,保持和主机的数据同步。

设置primary_conninfo='host=192.10.1.100 user=postgres password=主机登陆口令';设置备机连接主机进行流复制的连接字符串。

4.7 备机启动

上述配置完成后启动备机即可完成PostgreSQL双机同步热备服务器配置。

4.8 故障迁移

假设最坏的情况发生了,主机崩溃无法继续提供服务,此时可使用故障迁移将备机提升为主机,从只读模式提升为提供读写服务。保障系统的高可用性。故障迁移必须手动操作,有两种方式:

备机recover.conf配置文件中设置trigger_file项,值为某一系统中文件路径。在服务器作为备机使用时,此路径上的文件必须不存在。如需将备机提升为提供读写服务器,则建立此路径文件即可。当备机检测到文件存在后,立即退出备机恢复模式,提升为独立主机模式,提供完整读写服务。

在备机上执行pg_ctl premote -D ‘备机数据目录路径。效果及原理与a相同,即命令备机停止备机恢复模式,提升为独立主机模式[1]。

在某些特定应用场景下本方案仍具有一定的可优化。例如使用PostgreSQL9.4版本后提供的复制槽(Replication Slots)技术提供的自动WAL检测技术,替换wal_keep_segments参数功能。避免未同步的WAL段被主机替换删除。或设置tcp_keepalive参数,避免长时间的网络延时导致前台客户端事务提交的等待时间过长[7]。例如PostgreSQL10版本提供的逻辑复制技术,只同步应用需要的特定表,完成更复杂的集群应用等等[8]。

至此使用PostgreSQL流复制功能实现双机热备服务器搭建完成。

参考文献:

[1] 唐成.PostgreSQL修炼之道[M].机械工业出版社,2015.

[2] The PostgreSQL Global Development Group. Documentation[EB/OL].(2016-09-29). https://www.postgresql.org/docs/.

[3] 周正中.PostgreSQL同步流復制原理和代码浅析[EB/OL].(2016-06-16).https://yq.aliyun.com/articles/55676.

[4] [美] 杰亚德万·梅马拉(Jayadevan Maymala).数据架构师的PostgreSQL修炼:高效设计、开发与维护数据库应用[M].机械工业出版社,2016.

[5] [美]Regina Obe,Leo Hsu.PostgreSQL即学即用[M].人民邮电出版社,2016.

[6] [英]Simon Riggs,Gianni Ciolli,Gabriele Bartolini.PostgreSQL Administration Cookbook[M]. Packt Publishing,2017.

[7] [英]Gregory Smith,Ibrar Ahmed.PostgreSQL 9.6 High Performance[M].Packt Publishing,2017.

[8] 周正中.PostgreSQL 10.0 逻辑复制原理与最佳实践[EB/OL].(2017-02-28).https://yq.aliyun.com/ articles/71128.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管道在c语言中的作用,在C中实现管道

我想在C中实现管道,例如 - $ ls | wc | wc我写了以下代码 -#include#include#include void run_cmd(char *cmd, int* fd_in, int* fd_out){int c fork();if (c0){if (fd_in ! NULL){close(fd_in[1]);dup2(fd_in[0], 0);}if (fd_out ! NULL){close(fd_out[0]);dup2(fd_out[1],1…

称之为例外?

尽管这是一个与测试和Wiremock有关的Java示例,但它涉及一个更普遍的问题。 我们正在尝试重试Wiremock的verify方法,该方法可能会在我们要检查的端点被命中之前由测试调用。 在这种情况下,我们想在几秒钟后重试一次直到超时。 有趣的是&#…

vue 移动到图片浮动_基于Vue实现图片在指定区域内移动

当图片比要显示的区域大时,需要将多余的部分隐藏掉,我们可以通过绝对定位来实现,并通过动态修改图片的left值和top值从而实现图片的移动。具体实现效果如下图,如果我们移动的是div 实现思路相仿。此处需要注意的是我们在移动图片时…

star-cd linux安装,linux 使用PXE方式,kickstar网络安装系统

软件需求:(可使用yum方式安装)0.DHCP服务1.xinet2.kickstar包3.tftp4.vsftpd5.启动文件、系统内核文件、系统镜像[roottest ~]# cd /var/lib/tftpboot/ #拷贝相关文件到tftp目录[roottest tftpboot]# ll总用量 34168-r--r--r-- 1 root root 84 10月 25 14:40 boot.m…

Hibernate字节码增强

介绍 既然您已经了解了Hibernate脏检查的基础知识 ,我们就可以深入研究增强的脏检查机制。 虽然默认的图遍历算法对于大多数用例可能已经足够,但有时您需要优化的脏检查算法,并且检测方法比构建自己的自定义策略更方便。 使用AntHibernate工…

js 转化为实体符_js转html实体的方法

方法一:用的浏览器内部转换器实现转换,方法是动态创建一个容器标签元素,如DIV,将要转换的字符串设置为这个元素的innerText,然后返回这个元素的innerHTML,即得到经过HTML编码转换的字符串。function HTMLEn…

c语言字符大于等于怎么打,c语言大于等于怎么打?

c语言大于等于怎么打&#xff1f;C语言‘大于等于符号是“>”&#xff1b;“>”是关系运算符用于比较运算。包括大于(>)、小于()、小于等于(<)和不等于(!)六种。注意要在英文的输入状态下写c代码。知识拓展&#xff1a;C语言运算符号指的是运算符号。C语言中的符号…

Mockito匹配器优先

这篇文章是意见。 让我们看一下Mockito中用于在Java中进行测试的verify方法。 示例&#xff1a; verify(myMock).someFunction(123) –期望在模拟ONCE上使用输入123调用someFunction 。 BDDMockito &#xff0c;我更喜欢完整的BDDMockito替代方案&#xff0c;因此请编写then…

用c语言编写的源文件经过编译,若没有产生编译错误,则系统将,用 C 语言编写的源文件经过编译,若没有产生编译错误,则系统将(??)...

用C语言有产译错拖拉动工:旋是用一种耕机耕作机(件的机具智慧职教作部)驱。编写编译标准是消商品衡量和品价格价值质的直接费者。文件误则单反卡为相机用的最常存储。能给您提网球的(大力拍上量)是供最在击球时&#xff0c;的手的一使你舒服又能域感最个区。的是下列说法正确&a…

hbase hyperbase 区别_大数据之HBase的几个常规性问题

本文主要针对对HBase不了解的人。主要想基于个人的理解回答以下几个问题&#xff1a;什么是HBase&#xff1f;何时用HBase&#xff1f;与Hive、Pig的区别&#xff1f;HBase的结构为何HBase速度很快&#xff1f;HBase常用的操作有哪些&#xff1f;HBase的一些配置和监控解答(个人…

junit:junit_简而言之,JUnit:Hello World

junit:junit对于Java世界中的开发人员而言&#xff0c; JUnit似乎是最受欢迎的测试工具 。 因此&#xff0c;难怪就此主题已经写了一些好书 。 但是&#xff0c;通过以顾问为生&#xff0c;我仍然经常遇到程序员&#xff0c;他们至多对工具及其正确用法都不了解。 因此&#x…

姓名和学号 c语言,急啊!!!求救了 C语言编一个链表,输出姓名和学号就好

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#include#includetypedef struct Node{int data;struct Node *next;}AN;int data;AN *CreList(AN *head);AN *InsList(AN *head,int data);AN *DelList(AN *head,int data);void find(int value,AN *head);void De…

centos8调整分辨率_Hyper-V 设置 CentOS 8 文本模式下分辨率

CentOS 8 文本模式下分辨率的修改&#xff0c;可以参考我的另一篇文章《CentOS 7 文本模式下修改分辨率》。不过&#xff0c;在 Hyper-V 下发现似乎没有效果&#xff0c;还需要添加如下一行&#xff1a;videohyperv_fb:分辨率具体操作如下(例如&#xff0c;将分辨率设为 800x60…

android 多个复选框,Android UI控件之CheckBox(复选框、多选框)

上一篇文章中学习了RadioButton。知道了RadionButton的基本用法&#xff0c;实现起来也是听简单的和RadioButton一样CheckBox也是一个使用的非常多的控件&#xff0c;Android中它的的用法也挺简单的。以一个例子程序为例&#xff1a;同样先看一个常规的实现&#xff1a;布局文件…

查看Java记录

JEP 359 &#xff08;可在JDK 14中用作预览功能&#xff09;将记录引入Java。 记录是对普通数据聚合建模的简单方法。 一个简单的范围记录如下所示&#xff1a; record Range( int from, int to) {} 记录定义实际上与具有以下内容的最终类相同&#xff1a; 不变的领域 公共…

android调用虚拟摄像头方法,Android:如何在模拟器中使用网络摄像头?

我通过在AVD Manager中将前置摄像头设置为“ webcam0”将摄像头连接到仿真器。 启动模拟器的相机应用程序时&#xff0c;出现错误CameraService::connect X (pid 702) rejected (invalid cameraId 0).这是Android源代码的相关部分&#xff1a;sp CameraService::connect(const …

java:退出功能_Java 8:功能VS传统

java:退出功能业务逻辑是相同的&#xff1a; 给定一个由访问次数/时间组成的String表达式&#xff0c;例如&#xff1a;“ 1 / 24h&#xff0c;1..3 / 3h&#xff0c;5 / *” 然后&#xff0c;结果应为以下字符串列表&#xff1a; “ 1 / 24h”&#xff0c; “ 1 / 3h”&am…

安装新版的winetricks_winetricks中文修改版(wine模拟器)

winetricks中文修改版(wine模拟器)这是一个 winetricks 的修改版&#xff0c;添加了一些国内常用的 windows 应用支持&#xff0c;以弥补官方版 winetricks 对国内应用支持不足的情况。但最终目的仍然是希望上游能将这些应用添加进去。目的为所有发行版提供无差异化的 windows …

android 字符串 转公式,java – 在android中将字符串转换为bigdecimal

嗨我怎么能在android中将字符串转换为bigdecimal.这是我的第一项活动&#xff1a;public class ViewCartActivity extends Activity {String mGrandTotal;Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(save…

前端页面预览word_jquery.media.js实现前端页面预览

预览doc预览docx预览pdf预览pdffunction toView(filePath){var url [[{/converter/preview}]]?filePathfilePath;$(".modal-body").empty();$(".modal-body").load(url);$("#previewModal").modal();}function toPdfView(filePath){var url […