PostgreSQL教程(4)PostgreSQL主从流复制

TangLu PostgreSQL 2020-08-28 6282 0

一、PostgreSQL主从复制常用方案

PGSQL的主从复制和MySQL类似,让从库可以提供只读查询,实现一定程度的读写分离。在PGSQL中这样的从库也叫Hot Standby。常用的主从复制方案如下:

· PostgreSQL流复制+Keepalived:成本低、使用简单,但有数据一致性风险,发生切换后可能要重搭备库

· PostgreSQL流复制+repmgr(推荐):安装简单,功能强大,通过repmgr可以实现类似MHA的自动切换

· PostgreSQL流复制+pgpool:功能齐全,可以实现读写分离、failover等,但配置较为复杂


二、PostgreSQL流复制

1、物理流复制特点

是PostgreSQL主要的复制方式,属于物理复制,有着高可靠性,类似Oracle的DG。它可以复制出一个与主库一模一样的从实例,延迟低,事务执行过程中如果主库产生REDO record,在从库会实时的apply,一旦主库事务完成,从库能立即看到数据。流复制的同步方式又分同步与异步两种,异步方式下和MySQL一样,不会确保备库数据完全同步,所以在宕机的时候备库可能会有数据不同步的情况。而同步方式下主库会确保有一个备库已经应用完了WAL日志才会返回结果,如果所有备库故障,主库也会挂起,所以同步复制下建议至少一主俩从。


2、物理流复制原理(WAL日志与归档模式)

由WALsender、WALreceiver、startup三部分组成,主库通过WALsender进程传输WAL日志,为了避免WAL日志被滚动覆盖,还需要配置归档模式存放以前的日志。当从库WALreceiver进程接收WAL日志后,通过startup进程应用WAL日志。除了pg_wal日志外,还有一个pg_clog也需要了解,它记录的是事务提交日志,告诉我们哪些事务完成了、哪些事务没有完成。WAL日志默认存在$pgdata/pg_wal/,单个大小16M,不具有可读性、强制开启并无法关闭的。要触发WAL日志归档有三种方式:

· 通过select pg_switch_xlog() 函数触发

· WAL日志写满后自动触发归档

· 达到archive_timeout超时时间


三、PostgreSQL流复制的部署

实验环境:两节点部署为1主1从

1、主库进行归档日志等配置,由于流复制是采用了物理备份的方式,所以归档日志必须开启

vi postgresql.conf

listen_addresses = '192.168.0.103' 
port = 5432 端口
max_connections = 1000  并发数
logging_collector = on  #打开日志
log_directory = 'logs'  #日志存放相对路径,在postgresql/data目录下
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'  #日志命名格式
log_truncate_on_rotation = on  #日志循环使用
shared_buffers = 512MB  #PGSQL占用的内存空间
max_wal_size = 1GB
min_wal_size = 80MB

#归档与主从配置
archive_mode = on  #开启归档模式,通过archive_command配置项进行WAL日志归档脚本设置
archive_command = 'test ! -f /data/postgresql/archive/%f && cp %p /data/postgresql/archive/%f'
# %p = path of file to archive
# %f = file name only
wal_level = replica  #WAL日志所记录信息的级别,推荐replica物理复制,内容更全
max_wal_senders = 10
wal_keep_segments = 256
wal_sender_timeout = 60s
wal_keep_segments = 256  #主库需要保留WAL日志的个数(每个WAL日志是16M),避免从库还没有同步的数据被覆盖而导致主从失败

#同步复制相关配置,如果开启同步复制建议至少2个从库,避免单从故障后主库hang住
#synchronous_commit = on  #on代表同步复制;off则是异步,也是默认模式;除此中间还有几个模式也跟刷盘策略有关
# synchronous_standby_names = 'pgsql1,pgsql2'  #同步模式下必须配置,指定允许同步复制的从节点名字,这个名字是在primary_conninfo中通过application_name自定义
# synchronous_standby_names = '*'  #*代表all



2、主库重启服务,登录PGSQL后检查设置生效

show wal_level;
show archive_mode;
show archive_command;

ps aux | grep archiver  查看是否有归档进程
ls  /data/postgresql/archive/  #查看归档目录是否有日志


3、主库创建流复制角色,然后增加权限

create role repuser login encrypted password '123456' replication;

vi pg_hba.conf
host replication repuser 0.0.0.0/0 md5


4、从库使用pg_basebackup命令拉取主库的数据,命令执行完成后在从库对应目录下可以看到数据已经拉取过来。pg_basebackup其实是一个物理备份工具,可以把指定实例中所有数据(全量备份+WAL日志)都拷贝出来,然后还可以持续将主库WAL日志传输给指定节点实现热备,这个热备机就可以作为从库使用

pg_basebackup -D /data/postgresql/data/ -F p -P -R -h 192.168.0.103 -p 5432 -U repuser -l backup20200828

#-D指定了复制数据存放的目录,需要为空
#-h指定的是主库地址
#-U指定的是主库所创建的有复制权限的用户
#-F指定数据格式,p代表和主库一致
#-P是显示数据传输进度
#-R会在data目录下创建standby.signal标识文件,并且在postgresql.auto.conf创建了一行primary_conninfo信息


pgsqlrepl.jpg


5、启动从库并查看walreceiver进程是否启动

 /usr/local/postgresql/bin/pg_ctl -D /data/postgresql/data/ start
ps aux | grep walreceiver


6、在主库插入数据,然后在从库查看是否同步。另外从库会自动变成只读模式,无法插入数据。在主库通过pg_stat_replication视图可以查询主从同步状态,包含同步(sync)、异步(async)、potential(潜在同步,当同步库故障时升级它升级为sync)、从库地址、WAL日志位置等

\x  #类似于MySQL的G,让显示更友好
select * from pg_stat_replication;   #这里可以看出主从同步还是异步


pgsqlrepl2.jpg


评论