【一文搞懂PGSQL】5. 流复制

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: PostgreSQL流复制架构支持多种常见配置,包括基本的主从复制、结合PGPool-II的读写分离以及使用repmgr实现高可用性。基础环境中,主节点与备用节点分别位于不同IP。配置涵盖创建复制用户、调整核心参数以支持流复制,并确保归档与日志功能正常工作。从节点需通过备份恢复并配置为待机模式,以实现数据同步。此外,还介绍了如何验证复制状态及手动切换主从节点的方法,以及同步复制参数的配置细节。

PostgreSQL 流复制

常见架构

流复制架构 类主从

流复制+PGPool-ll读写分离架构

流复制+repmgr高可用架构

greenplum 高可用分布式读写

流复制架构

基础环境

角色 IP 端口
Master 10.10.8.176 5432
Standby 10.10.8.177 5432

安装postgresql 。。。略

配置

Master 配置

-- 创建复制用户
create role replica with replication login password 'dyh666';
alter user replica with password 'dyh666';

# 修改防火墙规则
vim /pgdata/12/data/pg_hba.conf
host    replication     replica         0.0.0.0/0               md5

# 修改postgresql.conf配置文件
vim /pgdata/12/data/postgresql.conf

# 监听地址
listen_addresses = '0.0.0.0'
# 最大连接数
max_connections = 1000
# 缓冲区大小
shared_buffers = 128MB
# 动态共享内存类型
dynamic_shared_memory_type = posix
# 日志详细程度
wal_level = replica
# 检查点之后第一次页面更改(即使是对提示位进行非关键性的修改)写 FPI 到 WAL 中
wal_log_hints = on
# 重做日志最大物理大小
max_wal_size = 1GB
# 重做日志最小物理大小
min_wal_size = 80MB
# 开启归档
archive_mode = on
# 检查归档
archive_command = 'test ! -f /archive/%f && cp %p /archive/%f'
# 最大从库数 多设置点没事
max_wal_senders = 10
# 重做日志保存数量
wal_keep_segments = 128
# 流复制主机发送数据的超时时间
wal_sender_timeout = 60s
# 开启说明如果作为从库可以读
hot_standby = on
# 流复制的最大延迟时间
max_standby_streaming_delay = 30s
# 向主库报告从库当前状态的最大时间
wal_receiver_status_interval = 10s
# 如果有错误的数据复制,是否向主库反馈
hot_standby_feedback = on
# 日志时区(prc  中华人民共和国)
log_timezone = 'PRC'
# 时间格式
datestyle = 'iso, mdy'
# 数据库时区
timezone = 'PRC'
# 系统错误消息的区域设置
lc_messages = 'C'
# 货币格式的区域设置
lc_monetary = 'C'
# 数字格式设置的区域设置
lc_numeric = 'C'
# 时间格式的区域设置
lc_time = 'C'
# 默认文本搜索配置
default_text_search_config = 'pg_catalog.english'
# 日志输出
log_destination = 'stderr'
# 开启日志采集
logging_collector = on 
# 日志路径
log_directory = '/pgdata/12/log'
# 日志格式
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
# 日志权限
log_file_mode = 0600

从库配置

# 停库
 pg_ctl  stop

# 删除数据及归档日志
rm -rf /pgdata/12/data/* 
rm -rf /archive/*

# 备份主库数据 // 远程备份
pg_basebackup -D /pgdata/pg_backup/ -F t -Pv -U postgres -h 10.10.8.176 -p 5432 -R  -Z 3

# 恢复到从库
cd /pgdata/pg_backup/
tar xf base.tar.gz  -C /pgdata/12/data/
tar xf  pg_wal.tar.gz   -C /archive/

# 配置为待机模式
vim /pgdata/12/data/standby.signal
# 开启待机模式
standby_mode = 'on'

# 修改postgresql.conf文件
vim /pgdata/12/data/postgresql.conf

# 恢复到目标的时间线
recovery_target_timeline = latest
# 打开日志
logging_collector = on
# 日志路径
log_directory = pg_log
# 日志名
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
# 监听地址
listen_addresses = '0.0.0.0'
# 最大连接数
max_connections = 1000
# 缓冲区大小
shared_buffers = 128MB
# 动态共享内存类型
dynamic_shared_memory_type = posix
# 日志详细程度
wal_level = replica
# 检查点之后第一次页面更改(即使是对提示位进行非关键性的修改)写 FPI 到 WAL 中
wal_log_hints = on
# 重做日志最大物理大小
max_wal_size = 1GB
# 重做日志最小物理大小
min_wal_size = 80MB
# 开启归档
archive_mode = on
# 检查归档
archive_command = 'test ! -f /archive/%f && cp %p /archive/%f'
# 最大从库数 多设置点没事
max_wal_senders = 10
# 重做日志保存数量
wal_keep_segments = 128
# 流复制主机发送数据的超时时间
wal_sender_timeout = 60s
# 开启说明如果作为从库可以读
hot_standby = on
# 流复制的最大延迟时间
max_standby_streaming_delay = 30s
# 向主库报告从库当前状态的最大时间
wal_receiver_status_interval = 10s
# 如果有错误的数据复制,是否向主库反馈
hot_standby_feedback = off
# 日志时区(prc  中华人民共和国)
log_timezone = 'PRC'
# 时间格式
datestyle = 'iso, mdy'
# 数据库时区
timezone = 'PRC'
# 系统错误消息的区域设置
lc_messages = 'C'
# 货币格式的区域设置
lc_monetary = 'C'
# 数字格式设置的区域设置
lc_numeric = 'C'
# 时间格式的区域设置
lc_time = 'C'
# 默认文本搜索配置
default_text_search_config = 'pg_catalog.english'
# 日志输出
log_destination = 'stderr'
# 开启日志采集
logging_collector = on 
# 日志路径
log_directory = '/pgdata/12/log'
# 日志格式
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
# 日志权限
log_file_mode = 0600    


# 修改 postgresql.auto.conf 配置文件
vim /pgdata/12/data/postgresql.auto.conf
# 恢复命令 将 归档目录的内容拷贝到 重做目录下
restore_command = 'cp /archive/%f %p'
# 指定主库信息 // 注意这里的user 生产环境需要改成 replica 复制用户密码信息
primary_conninfo = 'user=replica password=dyh666 host=10.10.8.176 port=5432 sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any'

验证

# 启动从库
pg_ctl -D /pgdata/12/data -l logfile start # 常用



# 主库
psql  -c "select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;"

# 从库
psql  -c "\x" -c "select * from pg_stat_wal_receiver;"

-- 主库操作
psql  -c "create database testtest;"

-- 从库操作 // 会显示刚才创建的库
psql  -c "\l"   

## 完成!

主从切换

解除主从关系或者切换主库(手动操作)

# 旧主库 postgresql-01 设置系统级别的只读模式,数据库不需要重启也永久生效。
alter system set default_transaction_read_only=on; 

# 查看是否开启成功
show default_transaction_read_only ;

# 设置主从检测时间为60 让postgresql-02 超时从而解除主从关系成为主库
psql -c "select pg_promote(true,60);"

# 问题
切换后postgresql-03还是指定的postgresql-01 所以需要重构主从关系

同步复制参数配置 //所有库配置

vim /pgdata/12/data/postgresql.conf
# 设置重做日志发送到哪里主库进行提交 有 off, local , remote_write,remote_apply,on 一般设置为on即可
synchronous_commit = on 

# 指定流日志同步到哪台机器主库才可以提交,一般设置 *(随便哪一台) 即可
synchronous_standby_names = '*'
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
4月前
|
关系型数据库 MySQL Java
|
3月前
|
关系型数据库 数据库 PostgreSQL
[postgres]配置主从异步流复制
[postgres]配置主从异步流复制
|
SQL 缓存 关系型数据库
MySQL的延迟复制和异步复制的区别是什么?底层原理是什么?
MySQL的延迟复制和异步复制的区别是什么?底层原理是什么?
116 0
|
存储 关系型数据库 MySQL
MySQL的异步复制是什么意思?底层原理是什么?
MySQL的异步复制是什么意思?底层原理是什么?
|
SQL 缓存 关系型数据库
MySQL的延迟复制是什么意思?底层原理是什么?
MySQL的延迟复制是什么意思?底层原理是什么?
152 0
|
关系型数据库 MySQL 数据库
MySQL的延迟复制、半同步复制,主主复制,异步复制有什么区别?底层原理是什么?
MySQL的延迟复制、半同步复制,主主复制,异步复制有什么区别?底层原理是什么?
319 0
|
关系型数据库 MySQL
MySQL的主主复制是什么意思?底层原理是什么?
MySQL的主主复制是什么意思?底层原理是什么?
125 0
|
SQL 存储 JSON
pg流复制详解
pg流复制详解
440 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 同步流复制原理和代码浅析
数据库ACID中的持久化如何实现 数据库ACID里面的D,持久化。 指的是对于用户来说提交的事务,数据是可靠的,即使数据库crash了,在硬件完好的情况下,也能恢复回来。PostgreSQL是怎么做到的呢,看一幅图,画得比较丑,凑合看吧。假设一个事务,对数据库做了一些操作,并且产生了一些脏数据,
13377 0