前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostgreSQL 流复制搭建和原理理解

PostgreSQL 流复制搭建和原理理解

作者头像
AustinDatabases
发布2019-06-21 16:45:19
2.6K0
发布2019-06-21 16:45:19
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

最近随着学习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 ,这个功能。

那使用这个功能对我们有什么好处

1 它是一个内建功能

2 连接的方式是通过 wal ahead log 的方式

3 没有特别的硬件需求

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

5 可以设置数据的同步和异步

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 的问题)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档