PostgreSQL 流复制搭建和原理理解

最近随着学习PostgreSQL 的深刻,愈加的喜欢这个数据库,以前曾经写过关于PostgreSQL 关于模糊查询的文字,在我使用的时候,的确是惊艳到了,ORACLE ,SQL SERVER 这样的收费数据库不能作的,PG轻易的化解,无愧是世界上最好的开源数据库了(其实去掉开源那两个字也不是担当不起)。数据库

和MYSQL 不一样,MYSQL的复制是基于逻辑复制,而PG 具备流复制和逻辑复制两个功能。提到流复制若是让我理解,想到就是ORACLE Dataguard 这样的功能,固然ORALCE 也有流复制和高级复制等功能,这里就再也不说起。安全


这里复制的技术不少,有shared disk failover , write-Ahead log shipping , logincal replication , 等等今天咱们要学习的就是 微信

Write-ahead log shipping ,这个功能。app

那使用这个功能对咱们有什么好处异步

 

1 它是一个内建功能tcp

2 链接的方式是经过 wal ahead log 的方式学习

3 没有特别的硬件需求spa

4 对主机的运行基本没有影响.net

5 能够设置数据的同步和异步 3d

6 Standy 库是能够进行只读的活动


读完上面的点,发现经过流的方式复制其实比逻辑的复制好的地方,就是1 没有事务冲突  2 不会有事务较大,形成延迟的问题  3 数据在切换过程当中,不会有数据丢失的担忧。


以上都是MYSQL 在复制的过程当中,我可能会担忧的问题。

流复制是PostgreSQL 在 9.0 推出的功能,其中主要由三个进程

1  walsender

2  walreceiver

3  startup

这三者是怎么工做的咱们的画一个图来 分析一下。


1  Standby 库经过 walreciever 来尝试链接到 主库

2  Primary 主库会经过wal sender来进行 tcp -IP 方式的链接,握手确认链接

3  从库的standby 会发送目前他最后的一次的LSN 号码给主库,从库的LSN 号必然必须小于主库(若是是反向的,说明主库的数据落后于从库,或是其余问题,这样的复制是没有办法进行的)

4 主库会提供 WAL Segments 并开始进行复制的数据发送的工做


经过

select application_name,state from pg_stat_replication;如下的语句来查看当前库是否在进行sender 的状态。



说到这里,其实每种数据库的复制都会存在一个问题就是若是STANDBY 库从新启动或者STANDBY 没有跟上 PRIMARY 库的发送日志的速度,则结果就是复制失败。而PostgreSQL有两个方法来尽力拯救这样的事情,

1  提升 wal_keep_segments  这让我想起了 MONGODB 提升OPLOG 的存储大小来让MONGODB 复制不会产生相似的问题。

2  使用replication slot 的方式和功能来灵活的进行WAL 数据的发送。


其实大白话就是  要不我在 发送端作点什么,要不我在接收端作点什么。

同时咱们能够经过 sent_lsn, write_lsn,flush_lsn, replay_lsn, 来判断咱们的复制的状态如何。



3  PG 的复制中,能够是多从的结构。


说完这些,须要探讨配置流复制中的参数了


首先要打开 POSTGRESQL 的复制


1   wal_level =  replica

肯定写入WAL 的信息的多少, 若是想调整这个参数,须要在开启服务前就进行设置

若是设置为 minimal level 则相似 create table as  create index , copy 等命令的日志就不会被记录



2  synchronous_commit    相关的选项

   on , remote_apply , remote_write , local

默认的安全值是ON  同时 若是你选择 remote_apply  或者 remote_write  则会等待standby的主机进行相关的回馈,主库才能继续后面操做。


3 max_wal_sender  设置最大的primary standby的 链接数,默认为10


4  wal_keep_segments 这里指定最大能够保持多少  wal 日志的数量,一个WAL 的日志数量是 16MB 。 


5 wal_sender_timeout  默认检测 standby 的没有响应的时间默认是60 秒


6  synchronous_standby_name = 'standby_name one by one'

  在PG的设置中有一个功能是能够设置一个备用机,与PG 的主机进行流复制,当备用机中止工做的时候,主机也中止工做。在上面的参数选项中,须要填写具体的那台standby机器须要,与主库中这样的关系。

同时须要在standby库去设置


须要在从库的recovery.conf 中来设置


7  如下的设置时在 standby下进行的

hot_standby = on   容许在recovery 的状态下,进行查询的语句


 

其余,在配置完相关的参数后,须要使用 pg_basebackup 将主库的数据拉到备库,配置参数后启动备库,则相似 ORACLE dataguard  的PG 流复制就生效了。


今天就这样了,休息,休息, 下次见吧  (找个时间的研究一下复制槽slot 的问题)


本文分享自微信公众号 - AustinDatabases(AustinDatabases)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索