PostgreSQL逻辑复制之pglogical篇
1|0一、pglogical介绍
pglogical 是 PostgreSQL 的拓展模块, 为 PostgreSQL 数据库提供了逻辑流复制发布和订阅的功能。 pglogical 重用了 BDR 项目中的一部分相关技术。pglogical 是一个完全作为PostgreSQL 扩展实现的逻辑复制系统。完全集成,它不需要触发器或外部程序。这种物理复制的替代方法是使用发布/订阅模型复制数据以进行选择性复制的一种高效方法。支持 PG10、9.6、9.5、9.4 ,提供比 Slony、Bucardo 或 Londiste 更快的复制速度,以及跨版本升级。
我们使用的下列术语来描述节点和数据流之间的关系,重用了一些早期的 Slony 技术中的术语:
- 节点 - PostgreSQL 数据库实例
- 发布者和订阅者 - 节点的角色名称
- 复制集 - 关系表的集合
pglogical 是新技术组件,使用了最新的 PostgreSQL 数据库中的一些核心功能,所以存在一些数据库版本限制:
- 数据源发布和订阅节点需要运行 PostgreSQL 9.4 +
- 复制源过滤和冲突检测需要 PostgreSQL 9.5 +
支持的使用场景:
- 主版本数据库之间的升级(存在上述的版本限制)
- 完整的数据库复制
- 利用复制集,选择性的筛选的关系表
- 可从多个上游服务器,做数据的聚集和合并
2|0二、安装操作
本节介绍了pglogical 扩展模块复制的基本用法。
下载地址,安装步骤
首先 PostgreSQL服务器必须正确配置才能够支持逻辑解码︰
如果你想要处理解决与上一次/第一次更新之间的冲突 wins(参阅冲突章节), 你的数据库版本需要为PostgreSQL 9.5+ (在9.4中无效) 您可以向 PostgreSQL.conf 添加此额外的选项:
pg_hba.conf 需要配置成允许从本地主机复制,用户拥有有复制权限,连接权限;并重启数据库服务
在所有节点上所对应数据库安装pglogical拓展模块:
3|0三、pglogical复制配置
现有实验环境
数据库版本 | IP | 角色 |
---|---|---|
psql (PostgreSQL) 9.6.0 | 192.168.1.221 | provider |
psql (PostgreSQL) 10.5 | 192.168.1.235 | subscriber |
3|13.1、时间同步
服务器时间同步(主备库都需操作)
3|23.2、提供者节点配置
1、创建节点
在一个数据库里创建提供者节点
2、创建复制集
将public架构中的所有表添加到default复制集中
复制集default的表都必需要primary key
3|33.3、订阅者节点配置
1、创建节点
在另一个数据库创建订阅者节点
2、创建订阅
订阅提供者节点,该订阅将在后台启动同步和复制过程
3|43.4、验证复制
前面我们已经完成安装/配置 pglogical 操作。
1、创建测试表
由于需要验证insert/update/delete/truncate操作是否同步;所以创建的表要有主键。当然只对发布者必须要主键约束。
2、添加测试数据
3、将表添加对应的复制集
对新建的表;并没有为其分配对应的复制集;需要手动添加。当然可以利用触发器自动添加;后续补充。
- 方法1:
前面讲解创建复制集中;3.2.2中“将public架构中的所有表添加到default复制集中”
- 方法二:
将表添加到对应的复制集中;详细介绍可以查看前面文档。
两种方法都可以;我们采用第二种方法。
我们查看复制集
同时,数据也同步到 subscriber 节点。因为在第二种方法有 同步 的操作。若使用第一种方法;还需要在subscriber 节点同步表的操作。
4、查看subscriber 节点
查看表 tbl_lottu01 信息
在复制集default中: update/delete/truncate 操作也是同步复制。不作演示
复制集 | INSERT | UPDATE | DELETE | TRUNCATE |
---|---|---|---|---|
default | √ | √ | √ | √ |
default_insert_only | √ | × | × | × |
4|0四、复制特性扩展
4|14.1、延迟复制
参数:
- subscription_name - 订阅的名称,必须是唯一的
- provider_dsn - 提供者的连接字符串
- replication_sets - 要订阅的复制集数组,这些必须已存在,默认为“{default,default_insert_only,ddl_sql}”
- synchronize_structure - 指定是否将提供者与订阅者之间的结构同步,默认为false
- synchronize_data - 指定是否将数据从提供者同步到订阅者,默认为true
- forward_origins - 要转发的原始名称数组,当前只支持的值是空数组,意味着不转发任何不是源自提供者节点的更改,或“{all}”这意味着复制所有更改,无论它们的来源是什么,默认是全部}”
- apply_delay - 延迟复制多少,默认为0秒
示例:数据表结构同步;且延迟复制1分钟
4|24.2、对源端进行 行/列 过滤
过滤机制需要 PostgreSQL 9.5 +
参数:
- set_name - 现有复制集的名称
- relation - 要添加到集合中的表的名称或OID
- synchronize_data - 如果为true,则表数据将在订阅给定复制集的所有订户上同步,默认为false
- columns - 要复制的列的列表。通常,当应复制所有列时,这将设置为NULL,这是默认值
- row_filter - 行过滤表达式,默认为NULL(无过滤),有关详细信息,请参阅(行过滤)。警告:在使用有效行筛选器同步数据时要小心。使用synchronize_data=true有效row_filter就像对表的一次性操作。使用修改后再次执行它将row_filter不会将数据同步到订户。订阅者可能需要pglogical.alter_subscription_resynchronize_table()来修复它。
**
4|34.3、为新表自动分配复制集
事件触发器工具可用于描述为新创建的表定义复制集的规则。
4|44.4、冲突检测
冲突检测需要 PostgreSQL 9.5 +
如果节点订阅多个提供程序,或当本地写入在订阅服务器上发生,可能会发生冲突,尤其是对传入的变化。这些都自动检测,并可以就此采取行动取决于配置。
解决冲突的办法是通过配置 pglogical.conflict_resolution 参数。
pglogical.conflict_resolution 支持的配置参数选项为︰
- error - 复制将停止上错误如果检测到冲突和手动操作需要解决
- apply_remote - 总是应用与本地数据有冲突的更改,这是默认值
- keep_local - 保留数据的本地版本,并忽略来自远程节点相互冲突的更改
- last_update_wins - 时间戳为提交最新的版本(newest commit timestamp)的数据将会被保存(这可以是本地或远程版本)
- first_update_wins - 时间戳为最旧的版本(oldest timestamp)的数据将会被保存(这可以是本地或远程版本)
当参数track_commit_timestamp被禁用时,唯一允许的配置值是 apply_remote。 PostgreSQL 9.4 不支持 track_commit_timestamp 配置参数只能配置参数apply_remote(该参数是默认值)。
后记: 在订阅者的表需要主键约束;不然检测不到冲突;是否需要主键约束当然这个也是根据需求而定。
5|0五、场景介绍
5|15.1、可从多个上游服务器,做数据的聚集和合并
发布者跟订阅者的关系;一个发布者可以被多个订阅者订阅。多个发布者可以被同一个订阅者订阅。
数据库版本 | IP | 数据库 | 角色 |
---|---|---|---|
psql (PostgreSQL) 9.6.0 | 192.168.1.221 | lottu | provider1 |
psql (PostgreSQL) 9.6.0 | 192.168.1.221 | lottu02 | provider2 |
psql (PostgreSQL) 10.5 | 192.168.1.235 | lottu | subscriber |
为了加以区分;我们定制SQL提示符;例如
5.1.1、创建测试表
5.1.2、搭建模拟场景
更多介绍查看第三节;或者查考《PostgreSQL 逻辑复制文档 (pglogical 文档 )》
5.1.3、插入数据验证
5|25.2、数据库版本升级
pglogical 对 PostgreSQL 版本升级是一个很实用的工具。能实现以几乎为零的停机时间迁移和升级PostgreSQL。局限性在于pglogical支持的 PostgreSQL 版本。
本例简单模拟下pglogical 对 PostgreSQL 版本升级;忽略插件、存储空间、表空间、以及业务SQL和自定义函数创建。
数据库版本 | IP | 数据库 | 角色 |
---|---|---|---|
psql (PostgreSQL) 9.6.0 | 192.168.1.221 | lottu | provider |
psql (PostgreSQL) 10.5 | 192.168.1.235 | lottu | subscriber |
5.2.1、新建升级数据库
以一个全新的数据库进行操作
5.2.2、pglogical 插件安装
本环境已经安装pglogical;只要到对应数据库创建pglogical插件即可
5.2.3、配置pglogical
- 发布者节点
这个要根据真实环境来设置;考虑到真实环境数据库中表不一定都有主键约束,可将表放到复制集 "default_insert_only"。
该函数可实现主键和非主键分别放到'default'和'default_insert_only'复制集
- 订阅者节点
5.2.4、迁移DDL
pglogical 可以同步表/序列结构;在创建订阅者 'pglogical.create_subscription' ; 里面参数synchronize_structure - 指定是否将提供者与订阅者之间的结构同步,默认为false。可以同步表/序列/索引。
5.2.5、业务代码改写优化
上一步我们没同步数据。所以参数synchronize_data我们选择false。虽然把表/序列/索引结构同步过来;但是业务代码(函数/插件)没同步过来;还要考虑这些业务代码是否需要改写优化。因为新的版本往往有新特性。
5.2.6、全量复制
pglogical有将所有未同步表都在单个操作中同步
语法:
参数:
- subscription_name - 现有订阅的名称
- truncate - 如果为true,表将在复制前被截断,默认为false
5.2.7、比对数据一致
经过上一步,两个数据库数据达到一致。
- 查看表同步状态
- 比对两个数据库表的数据
5.2.8、业务切换
比对数据一致;可以将业务切换到升级后的数据库。
5.2.9、删除pglogical配置
这步是可选的;保证升级后的数据库正常支持业务。不存在数据丢失的情况下。可以删除pglogical配置。
删除步骤:
- 删除订阅信息
- 删除两个数据库pglogical节点
__EOF__

本文链接:https://www.cnblogs.com/lottu/p/10972773.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架