同步流复制过程

参考链接:

POSTGRES 15 流复制搭建主备

PostgreSQL 14.5复制流(同步复制)

postresql同步流复制-多备库

(同步)可以一主一备,但是如果备库损坏,会导致主库部分数据丢失(异步流复制则不会)

此过程同时也包含了“异步”流复制的设置过程

第一步:主库(primary端)

  1. 设置归档相关参数(如果已经开启了同步流复制和归档模式archive_mode = on,但是没有对归档相关参数进行设置,主库会一直发出警告:WARNING: archive_mode enabled, yet archiving is not configured,也是因为没有设置配置文件的archive_commandarchive_timeout导致的)
# 在主库数据目录$PGDATA下创建目录arch_log
[postgres@localhost data]$ mkdir arch_log

# 归档命令(写成bash文件或者直接把这一长串写到下一步的postgresql.conf文件的archive_command都可以)(这里演示的是bash文件)
[postgres@localhost data]$ vim archive.sh
# 文件内容如下,如果环境变量没有配置$PGDATA,就写自己主库数据目录的绝对地址
cp --preserve=timestamps $1 $PGDATA/arch_log/$2 ; find $PGDATA/arch_log -type f -mtime +30 | xargs rm -fr;
#(假设$PGDATA表示/pgdata/15.4/poc/data/)则文件内容为:
# cp --preserve=timestamps $1 /pgdata/15.4/poc/data/arch_log/$2 ; find /pgdata/15.4/poc/data/arch_log -type f -mtime +30 | xargs rm -fr;
  1. 修改配置文件postgresql.confpg_hba.conf
[postgres@localhost ~]$ cd /pgdata/15.4/poc/data/

[postgres@localhost data]$ vim pg_hba.conf 
#最后一行加上:
host    replication     all             0.0.0.0/0               md5

[postgres@localhost data]$ vim postgresql.conf
listen_addresses = '*'	# 监听(备库们的)地址,这个很重要
max_wal_senders = 10	# 必须设置为非零值,且比备库数量多
wal_level = replica		# 参数设置为“replica”或“logical”。
min_wal_size = 2GB		# 默认值太小,备库容易失效,增大该值,这里相应的max_wal_size记得改成比min大的值
full_page_writes = on	# 必须打开
archive_mode = on
archive_command = '/bin/bash archive.sh %p %f' # 这里刚刚新建了bash文件就写文件,没有的话把文件里的命令直接写上去是一样的
archive_timeout = 1800

# restart重启,使以上配置生效
[postgres@localhost data]$ pg_ctl -D /pgdata/15.4/poc/data/ restart
  1. 创建”流复制“用户
[postgres@localhost data]$ psql -p 5432 -d postgres
psql (15.4)
Type "help" for help.

postgres=# create user replicator1 replication login connection limit 5 password 'cc';
CREATE ROLE
  1. sudo关闭防火墙响应端口的限制(因为备库通过 端口要访问主库的内容)
[postgres@localhost ~]$ su - root
密码:
上一次登录:三 13 15:12:51 CST 2024pts/0 上
# 注意这个是临时关闭,主库所在主机重启后,防火墙又会自动打开
[root@localhost ~]# systemctl stop firewalld.service
# 永久性措施:到root下,设置防火墙放行端口,这里注意如果主备库在同一台主机,要修改其中一个端口号为非5432,不然会冲突;设置完后重新加载防火墙
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-port=5432/tcp
success
[root@localhost ~]# firewall-cmd --reload
success
  1. 记住primary的ip地址、刚刚创建的”流复制“用户的名字和密码,到备库去继续操作

第二步:备库(standby端)

  1. 新建备库路径、并pg_basebackup备份主库数据
[postgres@localhost ~]$ mkdir /pgdata/15.4/poc/data_standby/

# 递归修改路径所有者
[postgres@localhost ~]$ chown -R postgres /pgdata/15.4/poc/data_standby

# 备份主库数据:pg_basebackup -h 主库的ip地址 -U 主库上的”流复制“用户的名字
# 然后输入主库上的”流复制“用户的密码
[postgres@localhost ~]$ pg_basebackup -h 192.168.44.129 -U replicator1 -F p -P -X stream -R -D /pgdata/15.4/poc/data_standby/ -l backup20240103
Password: 
31799/31799 kB (100%), 1/1 tablespace
# 同一台虚拟机同时做主备份的备份命令:pg_basebackup -R -X stream -F p -U usera -D /pgdata/15.3/poc/data_standby/ -h 127.0.0.1 -p 5432 -P -v
# pg_basebackup选项的相关含义见第一个参考链接

# 必须要chmod递归修改备库下所有文件权限均为0700或者0750,不然启动pg_ctl启动备库时会报如下错:
# 2024-01-03 15:39:41.440 CST [7704] FATAL:  data directory "/pgdata/15.4/poc/data_standby" has invalid permissions
# 2024-01-03 15:39:41.440 CST [7704] DETAIL:  Permissions should be u=rwx (0700) or u=rwx,g=rx (0750).
# stopped waiting
# pg_ctl: could not start server
[postgres@localhost ~]$ chmod -R 0700 /pgdata/15.4/poc/data_standby
  1. 修改配置文件postgresql.conf
[postgres@localhost ~]$ vim /pgdata/15.4/poc/data_standby/postgresql.conf
# 仅仅修改hot_standby = on之后,:wq保存退出vim,执行启动备库pg_ctl -D /pgdata/15.4/poc/data_standby start,回到主库psql执行select * from pg_stat_replication;就可以看到已经搭建好的异步流复制
hot_standby = on

# 修改完记得restart重启使其生效
[postgres@localhost data_standby]$ pg_ctl -D /pgdata/15.4/poc/data_standby restart

== 异步流复制到这里就完成了 ==

  1. 修改配置文件postgresql.auto.conf
[postgres@localhost data_standby]$ vim postgresql.auto.conf 
# 修改主库连接的信息,注意:application_name这个名字不要和其他备库重复了
# user和password分别填主库创建的”流复制“用户的名字和密码
# sslcompression是0或者1都行
primary_conninfo = 'application_name=postgresql2 user=replicator1 password=cc host=10.10.100.54 port=5432 sslmode=disable sslcompression=1'

# 修改完记得restart重启使其生效

第三步:主库(primary端)

  1. 修改配置文件postgresql.conf
[postgres@localhost ~]$ vim /pgdata/15.4/poc/data/postgresql.conf

# ANY 1表示有任意一台备库进行同步之后即可返回,可根据需要修改,目前只有一个备库所以这么写
# 括号里写备库刚刚在postgresql.auto.conf配置的 application_name
synchronous_standby_names = 'ANY 1 (postgresql2)'
# 如果有多个备库,备库的application_name分别叫 postgresql1,postgresql2 …,可以写成FIRST格式:
# synchronous_standby_names = 'postgresql1,postgresql2'
# FIRST语法下,放在第一个的备库是同步主库,其他为同步备库,同步的节点值为sync,异步的节点值为asyn;被匹配为同步的节点,但是被个数限制的值为 potential
# ANY语法下,值为quorum,表现上没有同步和异步一说,一个写事务主节点收到指定数量的standy节点的反馈,接着就会给客户端返回事务执行成功。
wal_level = hot_standby
synchronous_commit = on
hot_standby_feedback = true	
# hot_standby = on # 保持默认on就行


# 修改完记得restart重启使其生效
[postgres@localhost ~]$ pg_ctl -D /pgdata/15.4/poc/data/ restart
  1. 回去重启一下备库,主库这边应该就会提示
2024-01-03 16:15:31.677 CST [11550] LOG:  standby "postgresql2" is now a candidate for quorum synchronous standby
  1. 验证“同步”流复制是否开启成功(备库开启成功时才会有相应的记录,关闭备库查询不到)
[postgres@localhost ~]$ psql
psql (15.4)
Type "help" for help.

postgres=# \x
Expanded display is on.
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid              | 11550
usesysid         | 78253
usename          | replicator1
application_name | postgresql2
client_addr      | 192.168.44.128
client_hostname  | 
client_port      | 50736
backend_start    | 2024-01-03 16:15:31.655289+08
backend_xmin     | 
state            | streaming
sent_lsn         | 0/240004B8
write_lsn        | 0/240004B8
flush_lsn        | 0/240004B8
replay_lsn       | 0/240004B8
write_lag        | 00:00:00.000643
flush_lag        | 00:00:00.001356
replay_lag       | 00:00:00.002426
sync_priority    | 1
sync_state       | quorum
reply_time       | 2024-01-03 16:15:31.69824+08

# 关于sync_state,这里的呈现与主库配置文件postgresql.conf中的synchronous_standby_names

其他

1.主库IP变更

  • 修改备库的配置文件postgresql.conf,把配置项primary_conninfo中的host地址修改为主库最新IP地址即可,记得restart重新加载conf文件。

2.主库上做回归测试时会卡住并出现以下提示

2024-01-05 11:21:45.754 CST [3969] WARNING:  canceling wait for synchronous replication due to user request
2024-01-05 11:21:45.754 CST [3969] DETAIL:  The transaction has already committed locally, but might not have been replicated to the standby.
  • 开启任一备库即可
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值