高可用的分组复制同城异步

1、架构图

3.png

2、说明

该功能可以在同一个集群里实现分组复制,同城异步级联流复制,每个每组可以包含多个节点、设置不同的同步级别。

如需启用分组复制,必须先配置同步复制参数synchronous_standby_name和synchronous_commit,再按照需要配置synchronous_standby_nameX和synchronous_commitX(X为1-4)。synchronous_commitX设置的同步级别必须低于或者等于synchronous_commit设置的同步级别。

分组复制除了主分组,最多还可以设置分个四组,涉及到的主要参数

配置分组复制的服务器:
synchronous_standby_name1
synchronous_standby_name2
synchronous_standby_name3
synchronous_standby_name4
配置每个分组的不同同步级别:
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 修改postgersql.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=on
4.1.3 配置pg_hba.conf      
vi /data/halo/pg_hba.conf
host replication     replica         0/0      md5    
----做完1,2,3步需要重启数据库
pg_ctl restart
4.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   备库ip --同城灾备

4.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 start
4.2.2 将所有备库里的/data/halo/postgresql.auto.conf文件里的内容注释掉

4.png

4.2.3 修改备库里的/data/halo/postgresql.conf文件
vi /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配置到postgres.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 patroni
4.3.2 patroni配置分组和patroni不删除同城流复制槽halo45

Patronictl edit-config

4.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: physical
4.3.2.3级联复制槽
ignore_slots:
halo45: type:physical

5.png

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.1Halo41为主节点

从如下图,可以看到,(halo42,halo43)其中一个节点实时同步,halo43不同城异步async

6.png

4.5.1.2 查看patronictl list

7.png

4.5.2 场景二
4.5.2.1 halo42为主节点,从halo41手动切换到halo42 patronictl switchover
4.5.2.2 halo41查看流复制
8.png4.5.2.3 halo42查看流复制
09.png4.5.2.4查看patronictl list

10.png

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