同步流复制过程
- 第一步:主库(primary端)
- 第二步:备库(standby端)
- 第三步:主库(primary端)
- 其他
- 1.主库IP变更
- 2.主库上做回归测试时会卡住并出现以下提示
参考链接:
POSTGRES 15 流复制搭建主备
PostgreSQL 14.5复制流(同步复制)
postresql同步流复制-多备库
(同步)可以一主一备,但是如果备库损坏,会导致主库部分数据丢失(异步流复制则不会)
此过程同时也包含了“异步”流复制的设置过程
第一步:主库(primary端)
- 设置归档相关参数(如果已经开启了同步流复制和归档模式
archive_mode = on
,但是没有对归档相关参数进行设置,主库会一直发出警告:WARNING: archive_mode enabled, yet archiving is not configured
,也是因为没有设置配置文件的archive_command
和archive_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;
- 修改配置文件
postgresql.conf
和pg_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
- 创建”流复制“用户
[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
- sudo关闭防火墙响应端口的限制(因为备库通过 端口要访问主库的内容)
[postgres@localhost ~]$ su - root
密码:
上一次登录:三 1月 3 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
- 记住primary的ip地址、刚刚创建的”流复制“用户的名字和密码,到备库去继续操作
第二步:备库(standby端)
- 新建备库路径、并
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
- 修改配置文件
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
== 异步流复制到这里就完成了 ==
- 修改配置文件
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端)
- 修改配置文件
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
- 回去重启一下备库,主库这边应该就会提示
2024-01-03 16:15:31.677 CST [11550] LOG: standby "postgresql2" is now a candidate for quorum synchronous standby
- 验证“同步”流复制是否开启成功(备库开启成功时才会有相应的记录,关闭备库查询不到)
[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.
- 开启任一备库即可