PostgreSQL发布/订阅

2020-06-17 00:00:00 数据 数据库 多个 复制 发布

背景

PostgreSQL 从2010年发布的9.0开始支持流式物理复制,从此备库可以作为只读库打开(使用的同时不堵塞实时流式恢复(自带冲突检测和处理机制)),提供给用户只读使用。

从2014年发布的9.4开始,PostgreSQL具备了流式逻辑复制的能力,有很多第三方的插件可以选择,2017年,不再需要这些插件了,因为PG已经把逻辑复制的功能加入了10的内核。

物理复制的好处

1. 物理层面完全一致,这是许多商业数据库的惯用手段。例如Oracle的DG。

2. 延迟低,事务执行过程中产生REDO record,实时的在备库apply,事务结束时,备库立马能见到数据。不论事务多大,都一样。

3. 物理复制的一致性、可靠性达到了金融级的需求,不必担心数据逻辑层面不一致。

但是物理复制要求主备块级完全一致,所以有一些无法覆盖的应用场景,例如备库不仅要只读,还要可写。又比如备库不需要完全和主库一致,只需要复制部分数据,或者备库要从多个数据源复制数据,等等。

物理复制无法覆盖的场景

1. 数据库实例的部分,例如单个数据库或者某些表的复制需求。

例如某个游戏业务,账号体系是一套数据库,如果各地有多个接入点,全部都连到中心数据库进行认证可能不太科学。那么就希望将登陆需要用到的一些数据表同步到多个数据中心,而不是整个数据库实例。

2. 数据到达subcriber后,针对不同数据,设置触发器。

3. 将多个数据库实例的数据,同步到一个目标数据库。

例如多个数据库同步到一个大的数据仓库。

4. 在不同的数据库版本之间,复制数据。

5. 将一个数据库实例的不同数据,复制到不同的目标库。

例如省级数据库的数据,按地区划分,分别复制到不同的地区。

6. 在多个数据库实例之间,共享部分数据。

例如某个业务按用户ID哈希,拆分成了8个数据库,但是有些小的维度表,需要在多个数据库之间共享。

以上场景是物理复制无法覆盖的。

逻辑复制应运而生,实际上,从2014年发布的9.4版本开始,PostgreSQL就支持逻辑复制了,只是一直没有将其引入内核。

postgresql 10.0,将会在内核层面支持基于REDO流的逻辑复制。

另一个好消息是,你可以针对同一个数据库实例,同时使用逻辑复制和物理复制,因为他们都是基于REDO的。


以上基本是抄的~~~


下面进入正题,看看具体怎么玩这个逻辑复制

发布:就是提供数据的服务器

1.建一张测试表

CREATE TABLE master.test001 (
  id       integer NOT NULL,
  "name"   text,
  addtime  timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
  /* Keys */
  CONSTRAINT test001_pkey
    PRIMARY KEY (id)
) WITH (
    OIDS = FALSE
  );

相关文章