标题 | 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. |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。