PostgreSQL 之 异步流复制的实现
发布日期:2021-05-08 12:25:01 浏览次数:21 分类:原创文章

本文共 2572 字,大约阅读时间需要 8 分钟。

作者:瀚高PG实验室 (Highgo PG Lab)-波罗·


Postgresql测试版本 V9.5.7


VMware® Workstation 12 Pro


OS版本:redhat 7.4


主库:db1(192.168.80.220)


备库:db2(192.168.80.221)


 


PostgreSQL异步流复制的具体实现:


主库db1(192.168.80.220)配置


vi $PGDATA/postgresql.conf


================


listen_address = ‘*’


wal_level = hot_standby


max_wal_senders=2


wal_keep_segments=16


================


注解:


wal_level表示启动搭建hot Standby


max_wal_senders 设置为一个大于0的数,表示主库最多可以有多少个并发的standby


wal_keep_segments 设置为一个尽量大的值,以防止主库生成WAL日志太快,日志还没有来得及传送到standby就被覆盖,但是需要考虑磁盘空间允许,一个WAL日志文件的大小是16M。


 


主库创建一个超级用户来专门负责让standby连接去拖WAL日志


------


create user repl superuser password '111111';


 


vi  $PGDATA/pg_hba.conf,添加以下内容:


------


host    replication     repl            192.168.137.0/24         md5


 


允许用户repl从192.168.137.0/24网络上发起到主库的流复制,简言之即允许从库服务器连接主库去拖WAL日志数据。


主库配置很简单,到此就算结束了。


启动主库并继续配置从库。


 


备库db2配置


从此处开始配置备库(192.168.80.221),首先通过pg_basebackup命令行工具在从库上生成基础备份,命令如下:


rm -fr  $PGDATA/*     #做基础备份之前从库的数据目录需要手动清空


pg_basebackup -h 192.168.137.220 -U repl -F p -x -P -R -D /pgdata/data -l replbackup20180112   #生成基础备份


 


vi $PGDATA/postgresql.conf文件


hot_standby=on  #将hot_standby改为启用状态,如果不打开,从库不允许访问


 


到此为止就算配置结束了,我们现在可以启动从库,如果启动成功就说明配置成功,在从库运行


pg_ctl start -l  ./log/pg_server.log


 


启动后看一下日志,如果有报错可以进一步分析解决。 


 


备库recovery.conf 文件配置


recovery.conf 是一个配置文件,用于主库,备库切换时的参数配置


可以从 $PGHOME/share 目录下复制一份 recovery.conf.sample 到备库 $PGDATA 目录,


也可以通过pg_basebackup制定-R参数生成。


 


cat $PGDATA/recovery.conf


recovery_target_timeline='latest'


standby_mode = 'on'


primary_conninfo = 'user=repl password=111111 host=192.168.137.220 port=1921 sslmode=disable sslcompression=1'


 


里面有众多参数,关键参数注释:   


standby_mode = ''       --标记PG为STANDBY SERVER


primary_conninfo = ''   --标识主库信息


trigger_file = ''       --标识触发器文件 


 


主库创建表并插入数据验证异步流复制


主库下建一张表并添加几条数据: 


create table repl_t(id int);


insert into repl_t select generate_series(1,10);


 


查看从库同步效果:


select * from  repl_t;


 


验证从库是否能pg_controldata 执行删除、更新操作:


delete  from repl_t ;


update repl_t set id=2 where id=1;


 


流复制状态查看命令参考(一)


 可以分别看到主备库的发送接收日志的进程


ps -ef|grep -i postgres    #可以区分主备库进程


 


命令行工具:  


pg_controldata|grep -i state    #控制文件相关信息,也可以区分主备库


 


 查看主备库状态:  


select pg_is_in_recovery();   --主库为f,备库为t


 


流复制状态查看命令参考(二)


 主库查询流复制类型及备节点信息:  


select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;


 


将主库上WAL位置转换为WAL文件名和偏移量:  


select write_location from pg_stat_replication;     #获取当前在线日志


select * from pg_xlogfile_name_offset('0/F0255D0');    #标红是上条语句获取的值


 


 查看备库落后主库多少字节的WAL日志:  


select pg_xlog_location_diff(pg_current_xlog_location(),replay_location) from pg_stat_replication;   


 


查看备库接收WAL日志和应用WAL日志的状态:  


select * from pg_last_xlog_receive_location();


select * from pg_last_xlog_replay_location();  


select * from pg_last_xact_replay_timestamp();


 


 

上一篇:《卸甲笔记》-PostgreSQL和Oracle的数据类型的对比系列五:其它类型
下一篇:PostgreSQL 之 流复制概述

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年04月15日 11时55分31秒