1、架构图

2、说明
该功能可以在同一个集群里实现分组复制、同城异步级联流复制,每组可以包含多个节点、设置不同的同步级别。
如需启用分组复制,必须先配置同步复制参数 synchronous_standby_names 和 synchronous_commit,再按照需要配置 synchronous_standby_namesX 和 synchronous_commitX(X 为 1-4)。synchronous_commitX 设置的同步级别必须低于或者等于 synchronous_commit 设置的同步级别。
分组复制除了主分组,最多还可以设置四个分组,涉及到的主要参数:
配置分组复制的服务器:
• synchronous_standby_names1 • synchronous_standby_names2 • synchronous_standby_names3 • synchronous_standby_names4
配置每个分组的不同同步级别:
• synchronous_commit1 • synchronous_commit2 • synchronous_commit3 • synchronous_commit4
3、示例
准备四台服务器
主库 halo41: 192.168.1.41
从库 halo42: 192.168.1.42 halo43: 192.168.1.43 halo45: 192.168.1.45
集群高可用成员:halo41, halo42, halo43。同城异步灾备:halo45
4、配置步骤
4.1 主库
4.1.1 创建流复制用户
CREATE USER replica PASSWORD '123456' REPLICATION;4.1.2 修改 postgresql.conf
vi /data/halo/postgresql.conf
listen_addresses = 'localhost' 修改为 listen_addresses = '*'
----分组复制的配置:
synchronous_standby_names='1(halo42,halo43)'
synchronous_standby_names1='1(halo45)'
synchronous_commit=remote_apply
synchronous_commit1=on4.1.3 配置 pg_hba.conf
vi /data/halo/pg_hba.conf
host replication replica 0/0 md5----做完 1、2、3 步需要重启数据库
pg_ctl restart4.1.4 主备库配置
vi /etc/hosts
192.168.1.41 halo41 # 主库 IP
192.168.1.42 halo42 # 备库 IP
192.168.1.43 halo43 # 备库 IP
192.168.1.45 halo45 # 同城灾备 IP4.2 从库
4.2.1 备库执行:
# 192.168.1.42:
pg_basebackup -F p -X stream -v -P -h 192.168.1.41 -U replica -D $PGDATA -R -C --slot halo42
pg_ctl start
# 192.168.1.43:
pg_basebackup -F p -X stream -v -P -h 192.168.1.41 -U replica -D $PGDATA -R -C --slot halo43
pg_ctl start
# 192.168.1.45:
pg_basebackup -F p -X stream -v -P -h 192.168.1.41 -U replica -D $PGDATA -R -C --slot halo45
pg_ctl start4.2.2 将所有备库里的 /data/halo/postgresql.auto.conf 文件里的内容注释掉

4.2.3 修改备库里的 /data/halo/postgresql.conf 文件
# 192.168.1.42:
primary_conninfo = 'user=replica password=123456 channel_binding=prefer host=192.168.1.41 port=1921 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=halo target_session_attrs=any application_name=halo42'
-- 重载
pg_ctl reload
# 查询
show primary_conninfo;# 192.168.1.43:
primary_conninfo = 'user=replica password=123456 channel_binding=prefer host=192.168.1.41 port=1921 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=halo target_session_attrs=any application_name=halo43'
-- 重载
pg_ctl reload
# 查询
show primary_conninfo;# 192.168.1.45:注意把 primary_conninfo 配置到 postgresql.base.conf 文件中
primary_conninfo = 'user=replica password=123456 channel_binding=prefer host=192.168.1.41 port=1921 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=halo target_session_attrs=any application_name=halo45'
-- 重载
pg_ctl reload
# 查询
show primary_conninfo;4.3 高可用
4.3.1 启动高可用
systemctl start etcd
systemctl start patroni4.3.2 patroni 配置分组和 patroni 不删除同城流复制槽 halo45
patronictl edit-config4.3.2.1 分组流复制
synchronous_commit: remote_apply
synchronous_commit1: local
synchronous_standby_names: 1(halo42,halo43)
synchronous_standby_names1: 1(halo45)4.3.2.2 patroni 不删除复制槽
slots:
halo41:
type: physical
halo42:
type: physical
halo43:
type: physical
halo45:
type: physical4.3.2.3 级联复制槽
ignore_slots:
halo45:
type: physical
4.4 主库上查询流复制
select * from pg_stat_replication;
show synchronous_standby_names;
show synchronous_standby_names1;
show synchronous_commit;
show synchronous_commit1;4.5 测试场景
4.5.1 场景一
4.5.1.1 Halo41 为主节点
从如下图可以看到,(halo42, halo43) 其中一个节点实时同步,halo45 为不同城异步(async)

4.5.1.2 查看 patronictl list

4.5.2 场景二
4.5.2.1 halo42 为主节点,从 halo41 手动切换到 halo42
patronictl switchover4.5.2.2 halo41 查看流复制

4.5.2.3 halo42 查看流复制

4.5.2.4 查看 patronictl list

总结:Halo42 为主库,实时同步 halo43,halo45 为级联流复制库