Halo Tech

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

Image
Image

1架构图

Image

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文件里的内容注释掉

Image

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.2patroni配置分组和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

Image

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

Image

4.5.1.2查看patronictl list

Image

4.5.1场景二

4.5.1.1 halo42为主节点,从halo41手动切换到halo42 patronictl switchover

4.5.1..2 halo41查看流复制

Image

4.5.1.3 halo42查看流复制

Image

4.5.1.4查看patronictl list

Image

4.5.1.5总结

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

end

Image

微信号|Halo Tech