发布订阅
可获得性
本特性自openGauss 3.0.0版本开始引入。
特性简介
发布订阅基于逻辑复制实现,其中有一个或者更多订阅者订阅一个发布者节点上的一个或者更多发布。订阅者从它们所订阅的发布拉取数据。实现集群间的数据实时同步。
客户价值
发布订阅的典型使用场景是:
在一个数据库或者一个数据库的子集中发生更改时,把增量的改变发送给订阅者。
在更改到达订阅者时引发触发器。
把多个数据库联合到单一数据库中(例如用于分析目的)。
特性描述
发布者上的更改会被实时发送给订阅者。订阅者以与发布者相同的顺序应用那些数据,这样在一个订阅中能够保证发布的事务一致性。这种数据复制的方法有时候也被称为事务性复制。
订阅者数据库的行为与任何其他openGauss实例相同,并且可以被用作其他数据库的发布者,只需要定义它自己的发布。当订阅者被应用当作只读时,单一的订阅中不会有冲突。在另一方面,如果应用或者对相同表集合的订阅者执行了其他的写动作,冲突可能会发生。
特性增强
3.1.0版本对该特性做了以下增强。
支持gs_probackup备份发布端的逻辑复制槽,使得发布端使用gs_probackup备份恢复后复制槽不丢失,保证发布订阅的连接正常。
支持发布订阅同步基础数据。当在创建发布订阅关系之前,发布端的表中已存在数据,这部分基础数据在创建订阅之后会同步到订阅端。
支持以二进制格式发送数据。发布端和订阅端之间传输数据可以使用二进制的格式进行传输,而不是只能使用文本格式进行传输。
支持发布端主备切换不断开。发布端发生主备切换后,订阅端能够自动连接到新的发布端主机,而无需手动修改订阅端的连接信息。
特性约束
发布订阅基于逻辑复制实现,继承所有逻辑复制的限制,同时发布订阅还有下列额外的限制或者缺失的功能。
数据库模式和DDL命令不会被复制。初始模式可以手工使用gs_dump --schema-only进行拷贝。后续的模式改变需要手工保持同步。
序列数据不被复制。后台由序列支撑的serial或者标识列中的数据当然将被作为表的一部分复制,但是序列本身在订阅者上仍将显示开始值。如果订阅者被用作一个只读数据库,那么这通常不会是什么问题。不过,如果订阅者数据库预期有某种转换或者容错,那么序列需要被更新到最后的值,要么通过从发布者拷贝当前数据的防范(也许使用gs_dump),要么从表本身决定一个足够高的值。
只有表支持复制,包括分区表。试图复制其他类型的关系,例如视图、物化视图或外部表,将会导致错误。
同一数据库内的多个订阅不应当订阅内容重复的发布(指发布相同的表),否则会产生数据重复或者主键冲突。
如果被发布的表中包含不支持btree/hash索引的数据类型(如地理类型等),那么该表需要有主键,才能成功的复制UPDATE/DELETE操作到订阅端。否则复制会失败,同时订阅端会出现“FATAL: could not identify an equality operator for type xx”的日志。
依赖关系
发布订阅依赖逻辑复制功能。