PostgreSQL实战之物理复制和逻辑复制(八)

发布于:2023-09-14 ⋅ 阅读:(111) ⋅ 点赞:(0)

目录

PostgreSQL实战之物理复制和逻辑复制(八)

8 级联复制

8.1 级联复制物理架构

8.2 级联复制部署


PostgreSQL实战之物理复制和逻辑复制(八)

8 级联复制

实际上PostgreSQL支持备库既可接收主库发送的将WAL,也支持WAL发送给其他备库,这一特性称为级联复制(Cascading Replication),本章介绍级联复制的物理架构和部署。

8.1 级联复制物理架构

介绍级联复制物理架构之前,先看下一主两备流复制物理架构,如图所示。

上图中 Master为主库,两个备库分别为Save1、Slave2,Save1和 Slave2都通过流复制直连Master,三个数据库主机都位于机房A。
级联复制物理架构图如下所示。 

 第二张图的级联复制架构与第一张图中架构的主要区别在于Slave2备库不是直连Master主库,而是连接到Slave1备库,Slave1备库一方面接收来自Master发送的WAL日志,另一方面将WAL日志发送给Slave2备库,将既接收WAL同时又发送WAL的备库称为级联备库( cascading standby),这里Slave1就是级联备库,另外,将直连到主库的备库称为上游节点,连接到上游节点的其他备库称为下游节点。

级联复制主要作用在于:

  1. 小幅降低主库CPU压力。
  2. 减少主库带宽压力。
  3. 异地建立多个备库时,由于只需要一个备库进行跨机房流复制部署,其他备库可连接到这个级联备库,这种部署方案将大幅降低跨机房网络流量。

级联复制一个典型应用场景为一主两备,其中一个备库和主库同机房部署以实现本地高可用,另一备库跨机房部署以实现异地容灾,如下图所示。

 上图中 Slave1和Master为同机房,之间通过流复制实现本地高可用,Slave2为异地机房,通过级联复制实现异地容灾。

8.2 级联复制部署

这一节将演示级联复制的部署

物理部署图详见下图
 

 

 计划部署Slave1为级联复制节点,Slave2为备节点并上联到Slave1o
首先部署Slavel,使用异步流复制方式,Slave1的recovery.conf配置如下所示:

recovery_target_timeline = 'latest'
standby_mode = on
primary_conninfo = 'host=192.168.28.74 port=1921 user=repuser application_name=slavel'

Slave1部署完成后,检查流复制状态,如果一切正常接着部署Slave2,重做Slave2备库,如下所示:

[postgres@pghost3 pg10]$ pg_basebackup -D /database/pg10/pg_root -Fp -Xs -v -p -h
192.168.28.74 -p 1921 -U repuser
pg_basebackup: initiating base backup,waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 4/4E000028 on timeline 7
pg_basebackup: starting background wAL receiver
9424317/9424317 kB (100%), 3/3 tablespaces
pg_basebackup: write-ahead log end point: 4/4E004AA8
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: base backup completed

配置Slave2的recovery.conf配置文件,如下所示:

recovery_target_timeline = 'latest '
standby_mode = on
primary_conninfo = 'host=192.168.28.75 port=1921 user-repuser application_name=slave2'

之后启动Slave2,如下所示:
检查Slave2日志,如果有报错则根据错误信息排错,以上是级联复制部署的所有步骤。在Master查询pg_stat_replication视图,如下所示:

postgres=#SBLECT pid, usename, application_name,client_addr, state,sync_state,sync_priority
FROM pg_stat_replication ;
pid    |  usename  | application_name |  client_addr  |    state   | sync_ state  | 
-------------------+------------------+--—------------+-----------------------------
25041  |  repuser  |       slave1     | 192.168.28.75 |  streaming |    async     |


sync priority
-------------
     0 

(1 row)

以上显示了一条记录,为Master到 Slave1的 WAL发送进程。在Slave1查询pg_stat_replication视图,如下所示:

postgres=# SELECT pid,usename, application_name,client_addr,state,sync_state, sync priority
FROM pg_stat_replication;
pid   |  usename  | application_name | client_addr |   state  | sync_state | sync_priority
------+-----------+------------------+-------------+----------+------------+---------------
5002  |  repuser  | slave2           |192.168.28.76| streaming|   async    |      0

(1 row)

以上显示了Slave1到Slave2的WAL发送进程,可见Slave1上也有了WAL发送进程。接着做个数据测试,在 Master 上创建一张表,并插入数据,如下所示:

[postgrespghost1 ~]$ psql postgres postgres
postgres=# CREATE table t_sr6(id int4);
CREATE TABLE

postgres=# INSERT INTO t_sr6 VALUES (1);
INSERT 0 1

在Slave1上验证数据,如下所示:

[postgres@pghost2 pg_root]$ psql postgres postgres
postgres=# SELECT * FROM t_sr6;
id
----
1
(1 row)

Slave1上有了表t_sr6,在 Slave2上验证数据,如下所示:

[postgres@pghost3 pg_root]$ psql postgres postgres
postgres=# SELECT * FROM t_sr6;
id
-----
1
(1 row)

Slave2上也有了数据。