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 = '*'