PG原生集群复制配置与高可用
复制模式简介
流复制
基于文件系统的字节流形式的复制,特点为:主节点可以有多个从节点、主节点可以挂载从节点、主节点个数不限层级不限、主从可以同步/异步复制也可以混合存在。
无额外依赖。
逻辑复制
逻辑复制会在流复制的基础上将数据变动抽象为insert、delete等操作,经过发布节点sender进程向外发布,订阅节点拿到后进行操作重放,特点为:所有节点对等都可以读写、所有节点可以同时为发布或者订阅或者混合存在。
依赖wal2json插件
异步流复制
- 主库配置pg_hba.conf允许备库的复制链接
host replication all 192.168.240.14/32 trust
- 主库配置postgresql.conf
listen_address='*'
max_wal_senders=5 # 大于备库数量
wal_level=hot_standby
- 初始化备库
pg_basebackup -h mdw -U postgres -F p -P -R -D /data/oscg/pgpool/data1 -p 11002 -l backuplog
- 备库的postgresql.conf添加主库链接信息
primary_conninfo='application_name=mdw1 user=postgres host=mdw port=11002 sslmode=disable sslcompression=1 target_session_attrs=any'
- 生产备库标志文件
touch /data/oscg/pgpool/data1/standby.signal
- 启动备库
pg_ctl start -D data1
- 主节点查看状态
select * from pg_stat_replication;
逻辑复制
- 主库配置pg_hba.conf允许备库的复制链接
host replication all 192.168.240.14/32 trust
- 主库配置postgresql.conf
listen_address='*'
wal_level=logical
# 更改solts最大数量(默认值为10),flink-cdc默认一张表占用一个slots 下面开始是可选
max_replication_slots = 5 # max number of replication slots
# 更改wal发送最大进程数(默认值为10),这个值和上面的solts设置一样
max_wal_senders = 5 # max number of walsender processes
# 中断那些停止活动超过指定毫秒数的复制连接,可以适当设置大一点(默认60s)
wal_sender_timeout = 180s # in milliseconds; 0 disable
- 主库创建复制槽
select pg_create_logical_replication_slot('slotname','wal2json')
--创建相应用户
CREATE USER user WITH PASSWORD 'pwd';
-- 给用户复制流权限
ALTER ROLE user replication;
-- 给用户登录数据库权限
grant CONNECT ON DATABASE test to user;
-- 把当前库public下所有表查询权限赋给用户
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
-- 设置发布为true
update pg_publication set puballtables=true where pubname is not null;
-- 把所有表进行发布
CREATE PUBLICATION dbz_publication FOR ALL TABLES;
-- 查询哪些表已经发布
select * from pg_publication_tables;
-- 更改复制标识包含更新和删除之前值
ALTER TABLE test0425 REPLICA IDENTITY FULL;
-- 查看复制标识(为f标识说明设置成功)
select relreplident from pg_class where relname='test0425';
- 初始化备库
pg_basebackup -h mdw -U postgres -F p -P -R -D /data/oscg/pgpool/data1 -p 11002 -l backuplog
- 备库的postgresql.conf添加主库链接信息
primary_conninfo='application_name=mdw1 user=postgres host=mdw port=11002 sslmode=disable sslcompression=1 target_session_attrs=any'
- 生产备库标志文件
touch /data/oscg/pgpool/data1/standby.signal
- 启动备库
pg_ctl start -D data1
- 主节点查看状态
select * from pg_stat_replication;
主备切换
- 关闭主节点(模拟故障)
pg_ctl stop -D data0
- 提升备节点为主节点
#方式1
pg_ctl promote -D data1
#方式2 sql
select pg_promote(true,60)
- 查看数据库状态
pg_controldata -D /data/oscg/pgpool/data0|grep 'state'
#返回结果恢复模式
Database cluster state: in archive recovery
#返回结果生产模式
Database cluster state: in production
原主节点作为备节点添加进集群
- 原备节点pg_hba.conf添加原主节点的链接许可
host replication all 192.168.240.14/32 trust
- 原主节点添加现主节点(原备节点)的链接方式 postgresql.conf
primary_conninfo='application_name=mdw user=postgres host=mdw port=11002'
- 创建备库标志
touch /data/oscg/pgpool/data0/standby.signal
使用pg_rewind替代pg_basebackup
pg_rewind优势:支持增量复制,如果备节点挂掉较长时间,主节点保留的日志已经不够进行同步了,这种情况就可以使用pg_rewind进行增量同步一次数据再尝试拉起。
- 使用前提,需要在主节点postgresql.conf设置
#必须设置
wal_log_hints: on
#此项默认存在
full_page_writes: on