Chapter 31. 逻辑复制
逻辑复制是一种基于数据对象的复制标识(通常是主键)复制数据对象及其更改的方法。我们使用术语“逻辑”来与物理复制加以区分,后者使用准确的块地址以及逐字节的复制方式。PostgreSQL两种机制都支持,请见Chapter 26。逻辑复制允许在数据复制和安全性上更细粒度的控制。
逻辑复制使用一种发布和订阅模型,其中有一个或者更多订阅者订阅一个发布者节点上的一个或者更多publication 。订阅者从它们所订阅的publication拉取数据并且可能后续重新发布这些数据以允许级联复制或者更复杂的配置。
一个表的逻辑复制通常开始于对发布者服务器上的数据取得一个快照并且将快照拷贝给订阅者。一旦这项工作完成,发布者上的更改会被实时发送给订阅者。订阅者以与发布者相同的顺序应用那些数据,这样在一个订阅中能够保证publication的事务一致性。这种数据复制的方法有时候也被称为事务性复制。逻辑复制的典型用法是:
- 在一个数据库或者一个数据库的子集中发生更改时,把增量的改变发送给订阅者。
- 在更改到达订阅者时引发触发器。
- 把多个数据库联合到单一数据库中(例如用于分析目的)。
- 在PostgreSQL的不同主版本之间进行复制。
- 在不同平台上(例如Linux到Windows)的PostgreSQL实例之间进行复制。
- 将复制数据的访问给予不同的用户组。
- 在多个数据库间共享数据库的一个子集。
订阅者数据库的行为与任何其他PostgreSQL实例相同,并且可以被用作其他数据库的发布者,只需要定义它自己的publication。当订阅者被应用当作只读时,单一的订阅中不会有冲突。在另一方面,如果应用或者对相同表集合的订阅者执行了其他的写动作,冲突可能会发生。
31.1. Publication(发布)
Publication可以被定义在任何物理复制的主服务器上。定义有publication的节点被称为发布者。publication是从一个表或者一组表生成的改变的集合,也可以被描述为更改集合或者复制集合。每个publication都只存在于一个数据库中。
Publication不同于方案并且不影响表如何被访问。如果需要,每个表都可以被加入到多个publication。当前,publication只能包含表。对象必须被明确地加入到publication,除非publication是用ALL TABLES创建的。
Publication可以选择把它们产生的更改限制为INSERT、UPDATE、DELETE以及TRUNCATE的任意组合,类似于触发器如何被特定事件类型触发的方式。默认情况下,所有操作类型都会被复制。
为了能够复制UPDATE和DELETE操作,被发布的表必须配置有一个“复制标识”,这样在订阅者那一端才能标识对于更新或删除合适的行。默认情况下,复制标识就是主键(如果有主键)。也可以在复制标识上设置另一个唯一索引(有特定的额外要求)。如果表没有合适的键,那么可以设置成复制标识“full”,它表示整个行都成为那个键。不过,这样做效率很低,只有在没有其他方案的情况下才应该使用。如果在发布者端设置了“full”之外的复制标识,在订阅者端也必须设置一个复制标识,它应该由相同的或者少一些的列组成。如何设置复制标识的细节请参考REPLICA IDENTITY。如果在复制UPDATE或DELETE操作的publiction中加入了没有复制标的表,那么订阅者上后续的UPDATE或DELETE操作将导致错误。不管有没有复制标识,INSERT操作都能继续下去。
每一个publication都可以由多个订阅者。
Publication通过使用CREATE PUBLICATION命令创建并且可以在之后使用相应的命令进行修改或者删除。
表可以使用ALTER PUBLICATION动态地增加或者移除。ADD TABLE以及DROP TABLE操作都是事务性的,因此一旦该事务提交,该表将以正确的快照开始或者停止复制。