一、流复制集群介绍
postgresql 在9.x以前是基于wal 日志传送的方式进行复制的,当一个wal写完进行切换之后才会把该wal日志文件传送到备库进行应用,这样延迟比较大。 9.x 以后支持流复制,所谓流复制就是主服务器在 WAL 记录产生时即将它们以流式传送给备服务器而不必等到 WAL 文件被填充,这种模式下传送的单位是 record。该复制方式属于物理层面的复制,可以从实例级复制出一个与主库一模一样的实例级的从库。二、部署流复制集群
ip | 角色 | 操作系统 |
---|---|---|
192.168.167.11 | 主库 | redhat7.4 |
192.168.167.12 | 备库1 | redhat7.4 |
192.168.167.13 | 备库2 | redhat7.4 |
数据库版本用的是pg-12.6
2.1、安装pg
安装步骤见我另一篇博客:https://www.cnblogs.com/sunjiwei/p/18451350先按照安装文档部署三个实例
2.2、流复制集群部署
1、在主库创建复制账号repuser
create user repuser replication login connection limit 10 encrypted password '111111';
2、修改主库pg_hba配置文件,让复制用户能够连接
vim /opt/pgdata/data/pg_hba.conf
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
host replication repuser 192.168.167.0/24 md5
# 最下面一行是新加的,192.168.167.0是备库的网段,24是子网掩码,可以在备库上执行ip a 命令查看网段和掩码
# 使配置生效
pg_ctl -D /opt/pgdata/data reload
3、在两个从库上备份主库数据,这里使用pg_basebackup进行物理备份
# 先把备库停了,然后把备库数据目录删除或者备份
mv /opt/pgdata/data /opt/pgdata/data.bak
# 备份主库数据
[postgres@xl002 pgdata]$ pg_basebackup -D /opt/pgdata/data -Fp -Pv -Xs -Urepuser -R -h192.168.167.11 -p5432 -W
Password:
pg_basebackup: initiating base backup, waiting for checkpoint to complete
WARNING: skipping special file "./.s.PGSQL.5432"
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/4000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created temporary replication slot "pg_basebackup_31645"
WARNING: skipping special file "./.s.PGSQL.5432"data/base.tar )
24570/24570 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/4000100
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: base backup completed
注意:备份第一步主库会做个checkpoint,有时这步会比较慢,可以在主库手动执行checkpoint;命令,也可以备份时添加--checkpoint=fast参数
参数解释:
-D 备份到哪个目录
-Ft 打tar包
-F, --format=p|t #output format (plain (default), tar)
-Pv
-P, --progress #show progress information
-v, --verbose #output verbose messages
-Xs
-X, --wal-method=none|fetch|stream #include required WAL files with specified method
-R, --write-recovery-conf # 会自动在配置文件中添加连接主库的参数primary_conninfo
4、修改配置文件中关于replication的参数
注意:pg关于复制的参数,有些只在主库配置,有些只在从库配置,有些主从都配置
# 只在主库配置的参数
synchronous_standby_names = ''
解释:
pg的流复制有两种方式,一种是同步流复制,一种是异步流复制,如果主库的这个参数为空,则所有的备库都是异步流复制,如果主库的该参数不为空,则被指定的备库就是同步流复制备库,没被指定的则为异步流备库,该参数值配置有三种方式:
一是直接写死,比如synchronous_standby_names = 's1',这样就只有s1这台备库是同步流复制,其他备库都是异步流复制,但是一般那不建议这样配置,因为主库开启同步流复制后,如果同步流备库down了,则主库无法写入,会hang住,所以这样写死的风险较大。
二是synchronous_standby_names = 'FIRST 2 (s1, s2, s3)'这种写法,
方法FIRST指定一种基于优先级的同步复制并且让主库事务提交等待,直到它们的WAL记录被复制到基于优先级选中的所要求数量的同步流备库上为止。数字2表示主库会有2个同步流备库,(s1, s2, s3) 这个是你自己给备库起的名字,要和备库配置文件primary_conninfo参数中的配置项application_name保持一致,下文会介绍primary_conninfo参数。在列表中靠前的备库被给予较高的优先级,并且将被考虑为同步后备。其他在这个列表中位置靠后的备服务器表示潜在的(potential)同步流备库。如果任何当前的同步后备由于任何原因断开连接,它将立刻被下一个最高优先级的后备所替代。
在上面这个例子中,有三个后备服务器s1、s2、s3在运行,两个后备服务器s1和s2将被选中为同步流备库,因为它们出现在后备服务器名称列表的前部。s3是一个潜在的同步流备库,当s1或s2中的任何一个失效, 它就会取而代之。如果主库还有其他备库,比如s4,但是因为s4的名字不在列表中,所以s4无论什么情况都只能是异步流备库。
第三种写法是synchronous_standby_names = 'ANY 2 (s1, s2, s3)',
在这个例子中,方法ANY指定一种基于规定数量的同步复制,数字2表示主库会有两个同步流复制备库。这里意思是会任意选择两台作为同步流备服务器。另一台则作为潜在同步流备服务器。如果主库还有其他备库,比如s4,但是因为s4的名字不在列表中,所以s4无论什么情况都只能是异步流备库。
# 只在备库上配置的参数,如果备份时添加了-R参数,则会在postgresql.auto.conf中自动配置好该参数,不用手动配置
primary_conninfo = ''
例如:
primary_conninfo = 'host=192.168.167.11 port=5432 user=repuser password=111111 application_name=xl001'
这个参数表示备库要去连哪个主库,application_name是给备库起个名字,一般使用主机名即可,如果不配置,默认是配置文件中 cluster_name的值。
注意:在pg12版本以前,这个参数是单独放在recovery.conf文件中的,所以从库的postgresql.conf文件中就不需要配置了。pg12以后,把该参数放到了postgresql.conf中了,不再有recovery.conf文件。添加-R 参数备份的文件中有个standby.signal文件,主备切换需要通过standby.signal文件来触发备用模式,所以这个文件必不可少,如果备份时没有添加-R参数,则需要手动在数据目录中创建改文件:
touch /opt/pgdata/data/standby.signal
# 主备库都要配置的参数。
# wal_level=replica (枚举类型)
pg10版本中,待选的值为minimal、replica、logical。
minimal --不能通过基础备份和wal日志恢复数据库。
replica = 9.6版本以前的archive和hot_standby --该级别支持wal归档和复制。
logical --在replica级别的基础上添加了支持逻辑解码所需的信息。
# hot_standby=on #开启备库才能作为只读库,不开启备库不能进行读
#max_wal_senders = 10 # max number of walsender processes
# (change requires restart)
#wal_keep_segments = 0 # in logfile segments; 0 disables
#wal_sender_timeout = 60s # in milliseconds; 0 disables
#max_replication_slots = 10 # max number of replication slots
# (change requires restart)
#track_commit_timestamp = off # collect timestamp of transaction commit
# (change requires restart)
复制参数的总结:
除了主库的synchronous_standby_names参数外,建议其他所有参数主备库保持一致,这样方便主备库切换后不需改动太多参数,然后备份时添加-R参数,使备库的配置文件中自动配置上primary_conninfo参数即可。
4、启动备库
pg_ctl -D /opt/pgdata/data start
5、查看集群状态,在主库查询
select * from pg_stat_replicaiton;
至此,流复制集群搭建完成
参考文档:
官网:postgresql.org