pg 流复制集群部署和介绍

一、流复制集群介绍
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

posted @ 2024-11-05 11:12  有形无形  阅读(29)  评论(0编辑  收藏  举报