赞
踩
目录
1. 同步流复制:在同步流复制中,事务提交时会等待WAL记录被复制到指定数量的同步备机上。这样可以确保在同步从库发生故障时,事务的持久性得到保证。同步流复制可以通过设置synchronous_standby_names,synchronous_commit参数来配置。可以使用优先级或仲裁方式来选择同步备机。同步流复制会增加事务的响应时间和并发争用,因此需要谨慎使用以确保应用程序的性能。
2. 异步流复制:在异步流复制中,事务提交后,不需要等待WAL记录被复制到备机上。这样可以提高小事务的吞吐量,但也增加了数据丢失的风险。异步流复制适用于不需要强一致性保证的场景,如事件日志记录。
同步流复制和异步流复制的选择取决于应用程序对事务持久性和性能的要求。同步流复制提供了强一致性保证,但会增加事务的响应时间和并发争用。异步流复制提供了更高的吞吐量,但可能会导致数据丢失。
影响同步复制的还有一个参数“synchronous_commit”,该参数可以取的值有以下几个
。
·remote_apply:WAL日志被传到备库并被apply,事务commit才返回。
·on:WAL日志被传到备库并被持久化(不必等其被apply),事务commit才返回。
·remote_write:WAL日志被传到备库的内存中(不必等其被持久化),事务commit才
返回。
·local:WAL日志被本地持久化后(不用管远程)事务commit就可以返回。
·off:不必等WAL日志被本地持久化,也不管是否传到远程,事务commit都可以立即
返回。
由上面说明即可联想到同步复制, 的可选值为“on”“remote_apply”
“remote_write”。
生产中为了保证数据安装,现在我需要配置一个集群,当预先的同步从库宕机了,另外的从库能迅速升级为同步从库,而保证数据的正常写入,使其生产运行不受影响。
IP地址 | 数据库级别 | 端口号 | 路径 | 数据库名 |
10.0.0.200 | 主库 | 15432 | /home/postgres/pgdata/data | postgres |
10.0.0.199 | 潜在从库 | 15432 | /home/postgres/standby1 | postgres |
10.0.0.198 | 从库 | 15432 | /home/postgres/standby2 | postgrs |
在主库中打开监听和IP白名单
min_wal_size=800MB
hot_standby = off 默认情况下是“off” 在从库启动后还会再次做介绍
synchronous_standby_names = 'standby1,standby1'
synchronous_commit = on
这里的0.0.0.0/0 允许所有访问数据库
创建具有replication的用户
create user r1 with replication;
修改完以上参数后需要重新启动主库;
分别在两个从库执行备份
10.0.0.198主机
-
- pg_basebackup -h 10.0.0.200 -U r1 -F p -P -X stream -R -D standby2/ -p 15432
10.0.0.199主机
pg_basebackup -h 10.0.0.200 -U r1 -F p -P -X stream -R -D standby1/ -p 15432
- -h:指定要连接的服务器的主机名或IP地址。
- -U:指定连接使用的用户名。
- -Fp:指定备份的格式。在这种情况下,备份以纯文本格式存储。
- -P:指定在备份过程中显示进度信息。
- -X stream:指定备份的流式传输方法。
- -R:指定包括所有必需的WAL文件以进行一致性备份。
- -D:指定备份存储的目录。
分别修改两个从库的参数/home/postgres/standby1/postgresql.auto.conf 增加application_name = standby1
/home/postgres/standby2/postgresql.auto.conf 增加application_name = standby2
分别启动从库
- pg_ctl -D /home/postgres/standby1 start
- pg_ctl -D /home/postgres/standby2 start
此时在主库使用视图pg_stat_replication 可以查看到两个从库的状态
- postgres=# select * from pg_stat_replication;
- -[ RECORD 1 ]----+------------------------------
- pid | 1551
- usesysid | 35849
- usename | r1
- application_name | standby2
- client_addr | 10.0.0.198
- client_hostname |
- client_port | 54230
- backend_start | 2023-07-16 03:36:05.049714+08
- backend_xmin |
- state | streaming
- sent_lsn | 0/2F0001C0
- write_lsn | 0/2F0001C0
- flush_lsn | 0/2F0001C0
- replay_lsn | 0/2F0001C0
- write_lag | 00:00:00.020258
- flush_lag | 00:00:00.020275
- replay_lag | 00:00:00.020298
- sync_priority | 2
- sync_state | potential
- reply_time | 2023-07-15 15:41:08.319377+08
- -[ RECORD 2 ]----+------------------------------
- pid | 1552
- usesysid | 35849
- usename | r1
- application_name | standby1
- client_addr | 10.0.0.199
- client_hostname |
- client_port | 39346
- backend_start | 2023-07-16 03:36:05.066217+08
- backend_xmin |
- state | streaming
- sent_lsn | 0/2F0001C0
- write_lsn | 0/2F0001C0
- flush_lsn | 0/2F0001C0
- replay_lsn | 0/2F0001C0
- write_lag | 00:00:00.0201
- flush_lag | 00:00:00.020134
- replay_lag | 00:00:00.020135
- sync_priority | 1
- sync_state | sync
- reply_time | 2023-07-15 15:41:08.285412+08
此时主库中synchronous_standby_names的设置顺序原因standby2为潜在同步从库。
模拟同步从库standby1宕机
pg_ctl -D /home/postgres/standby1 stop
此时主库上可以看到standby2升级为了同步从库,而不影响生产的正产运行
关于synchronous_standby_names的值设置方法可以指定任意的多个从库为同步从库,其余为潜在,也可以指定所有的从库都为同步,不设定潜在从库。
synchronous_standby_names=‘any1(standby1,standby2,standby)’
synchronous_standby_names=‘first2(standby1,standby2,standby)’
本文中设定的方式为
synchronous_standby_names=‘standby1,standby2’
等同于synchronous_standby_names=‘first1(standby1,standby2)’
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。