暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PG流复制搭建与主从切换

原创 手机用户7549 2023-11-20
751

主服务器配置

1.创建一个专门用于复制的用户

create role pgrepuser replication login password 'replica';

2.在postgresql.conf文件配置一下参数

listen_addresses = '*'

wal_level = replica

archive_mode = on

max_wal_senders = 5

wal_keep_segments = 10  

#用于指定pg_wal目录中保存的过去的wal文件(wal 段)的最小数量,以防备用服务器在进行流复制时需要

3.设置归档格式,postgresql.conf中设置archive_command

举例


4. 在pg_hba.conf 文件中设置一条权限规则

以允许从属服务器作为复制体系中的客户 端连到主服务器。例如,以下这条规则所代表的含义是:允许你的私有网络中某台服务器上一个名为 pgrepuser 的 PostgreSQL 账号连接到主服务器,其IP地址为10.23.103.101,验证方式为基于 MD5 的加密密码。 

host replication pgrepuser 10.23.103.101/24 md5

5.重启主端postgresql服务让上述设置生效

6.创建全量备份

登录到备端 对主端进行备份操作

pg_basebackup

-h 指定host

-U 指定username 连接到数据库的用户 即pgrepuser

-D $PGDATA的目录  备端接收备份的目录 目标文件夹

-X wal_method none/fetch/stream  fetch需要在备份完成后获取日志,stream会单独开启一个walsender

 -P 显示进程信息

 -R  会自动添加 primary_conninfo的信息  write configuration for replication

pg_basebackup -h 10.23.103.103 -U pgrepuser -D /data/13/data/ -X stream -P -R

该命令会直接物理备份相应目录,如果备端相同目录下有文件,请提前备份

7.观察备库的postgresql.auto.conf文件内容

是否有primary_conninfo信息


primary_conninfo = 'user=pgrepuser password=replica channel_binding=disable host=10.23.103.103 port=5432 sslmode=disable sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any'

同时$PGDATA目录下会有一个standby.signal文件作为备库标志

8.启动备库服务

pg_ctl start

select pg_is_in_recovery();

t=true表示在恢复中 说明为备库

f=false为主库


select pid,usename,application_name,client_addr,state,sync_state from pg_stat_replication;


9.主备测试数据

主库创建测试表,插入数据


create table replica_test(id numeric);

insert into replica_test values(1);

select * from replica_test;

备库也可查询到对应数据



主从切换

1.关闭主库

pg_ctl stop

2.注释备库primary_conninfo信息


3.将从库升级为主库

pg_ctl promote -D $PGDATA

执行promote命令后,相当于备库升级为primay,因为standby.signal标志会自动被移除


4.原主库变成备库

手动创建standby.signal文件

配置postgresql.auto.conf文件

primary_conninfo = 'user=pgrepuser password=replica channel_binding=disable host=10.23.103.101 port=5432 sslmode=disable sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any'

然后启动数据库


确认同步状态

select pid,usename,application_name,client_addr,state,sync_state from pg_stat_replication;


数据测试

主端新插入的数据 在备端未自动同步 查看pg_log


提示有WAL日志未从主端同步过来

从主端的$PGDATA/pg_wal/中将文件中提示的wal文件拷贝到备端$PGDATA/pg_wal/中

警告消除,数据同步成功

select pg_rotate_logfile();  --手动切换日志

数据测试

新主库创建测试表,插入数据


备库也可查询到对应数据


查看主从进程状态



当链接成功建立时,除了有对应进程外,streaming算是同步正在进行的标志

如果只有主从,日志未同步的外,streaming处往往是idle状态


第一次测试pg_rewind失败

使用pg_rewind同步主备时间线 

pg_rewind --target-pgdata /data/13/data --source-server='host=10.23.103.101 port=5432 user=postgres dbname=postgres password=postgres'

需要修改postgresql.auto.conf文件

standby.signal文件会被pg_rewind移除 所以需要之后创建

本次失败原因可能是wal_keep_segments导致较早的wal文件在主端被删除 因此导致备端执行pg_rewind后失败

使用普通方式重建了流复制


第二次尝试


然而因为前期为修改wal_log_hints_on导致数据库以主角色启动过,所以时间线无法修复,只能重建

full_page_writes 默认on

wal_log_hints 默认off   使用pg_rewind需要on

总结:pg_rewind类似于oracle中broker机制下的flashback,可以将已经断联很久的库闪回到指定的时间线。实际操作,对于体量不那么大的库,用pg_basebackup更方便,也更好理解。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论