一、流复制简介
在数据库业务中,为了防止单点故障的发生、提高数据库服务器的服务性能,一般都会采用「主从复制」集群来保障数据库中数据的高可用。
而在 postgresql 中,主从复制有其特定的技术名称 ——流复制(streaming replication)。主从复制是所有数据库主从架构的统称,而流复制是 postgresql 实现主从复制的核心技术,也是最常用的方式,特点是从库实时(流式)接收主库的 wal 日志并应用,延迟较低。postgresql 中更推荐用 “主库(primary)” 和 “从库(standby)” 替代 “master/slave” 的说法。
此外,postgresql 的流复制还可细分:
- 异步流复制(默认):主库写入数据后无需等待从库确认,性能高,可能有少量延迟。
- 同步流复制:主库写入数据后,必须等待从库确认已接收 wal 日志才返回成功,安全性高但性能略低。
二、流复制原理与步骤
postgresql 流复制的核心依赖于其wal(write-ahead logging,预写日志)机制,这是postgresql 保证数据一致性的基础,也是复制的 “数据源”。
1. wal 日志的作用
- 主库执行任何数据修改操作(增删改)时,会先将操作记录写入 wal 日志(类似 “操作日志”,相当于mysql中的binlog),再更新实际数据文件。
- 即使主库突然崩溃,重启后可通过 wal 日志恢复未完成的操作,保证数据一致性。
- 对复制而言:wal 日志是主从数据同步的 “桥梁”—— 从库通过获取并应用主库的 wal 日志,即可复现主库的所有操作,保持数据一致。
2. 流复制的核心进程
主库(primary)
wal_sender进程:当从库连接主库时,主库会启动wal_sender进程,负责将 wal 日志实时发送给从库。
从库(standby)
wal_receiver 进程:从库启动后,会启动 wal_receiver 进程,主动连接主库wal_sender,接收 wal 日志并写入从库的 wal 文件。
startup 进程:负责读取本地接收的 wal 日志,并将日志中的操作应用到从库的数据文件中,最终实现数据同步。
3.流复制的同步步骤
1.主库每执行一次数据修改(如插入、更新),都会生成新的 wal 记录并写入本地 wal 文件。
2.从库启动后,wal_receiver 进程根据 postgresql.conf 中 primary_conninfo 的配置(主库 ip、复制用户、密码),主动连接主库的 5432 端口。
3.主库验证从库的连接(通过 pg_hba.conf 配置的权限)后,启动 wal_sender 进程,开始向从库实时流式传输新生成的 wal 日志(从备份结束的位置开始,避免重复传输)。
4.从库的 wal_receiver 接收 wal 日志后,写入本地的 wal 文件。从库的 startup 进程读取本地 wal 文件,将日志中的操作逐条应用到从库的数据文件中,最终实现与主库的数据一致。
三、流复制的实现
- 操作系统:centos7
- postgresql版本:psql (postgresql) 13.22
- 主库ip:11.0.0.136
- 从库ip:11.0.0.137
1、准备工作
# 1.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 或者开放5432端口
firewall-cmd --add-port=5432/tcp --permanent
firewall-cmd --reload
# 2.关闭selinux
setenforce 0
sed -i 's/^selinux=.*/selinux=disabled/' /etc/selinux/config
# 3.同步时间
ntpdate ntp.ntsc.ac.cn
# 4.确保你的yum源可用2、安装postgresql(主从库都安装)
进入官网:https://www.postgresql.org/download/

选择相应操作系统和版本

# 1、安装 postgresql 官方的 yum 源配置包 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/el-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm # 2、安装 postgresql 的服务器端程序 yum install -y postgresql13-server # 3、初始化 postgresql 的数据库集群 /usr/pgsql-13/bin/postgresql-13-setup initdb # 4、启动 postgresql 并设置开机自启 systemctl enable postgresql-13 systemctl start postgresql-13 # 5、验证安装 psql --version
3、主库配置
1、修改主库核心配置
vim /var/lib/pgsql/13/data/postgresql.conf # 添加以下内容 ----------------------------------------------------------------------------------------- # 允许所有ip连接(生产环境可指定从库ip) listen_addresses = '*' # wal日志级别(至少为replica才能支持流复制) wal_level = replica # 允许的最大复制连接数(至少1,建议3-5) max_wal_senders = 3 # 保留的wal日志大小(防止从库同步时wal被删除,建议1gb) wal_keep_size = 1gb # 开启归档模式(流复制依赖归档) archive_mode = on # 归档命令(暂时用/bin/true表示不实际归档,仅开启模式) archive_command = '/bin/true' -----------------------------------------------------------------------------------------
2、配置主库访问控制
vim /var/lib/pgsql/13/data/pg_hba.conf # 添加以下内容 ----------------------------------------------------------------------------------------- # 允许从库(11.0.0.137)通过 replica 用户进行复制(md5 密码验证) # host 数据库 / 功能 用户名 从库ip 认证方式 host replication replica 11.0.0.137/32 md5 -----------------------------------------------------------------------------------------
3、创建复制专用用户(replica)
# 1、切换到postgres用户 su - postgres # 2、进入数据库 psql
# 3、创建复制专用用户,设置密码 create role replica replication login encrypted password 'peidongqing@123'; # 4、 退出psql \q # 5、退出postgres用户 exit
# 6、重启主库 systemctl restart postgresql-13
4、从库配置
1、停止从库服务并清空默认数据
从库需使用主库的备份数据初始化,因此先删除默认数据
# 停止从库postgresql服务 systemctl stop postgresql-13 # 清空从库数据目录(默认路径) rm -rf /var/lib/pgsql/13/data/*
2、从主库同步基础数据
# 切换到postgres用户(确保权限正确) su - postgres # 执行基础备份(从主库11.0.0.136同步数据到从库) pg_basebackup -h 11.0.0.136 -u replica -d /var/lib/pgsql/13/data/ -fp -xs -p
执行后会提示输入密码,输入设置的replica用户密码peidongqing@123,等待备份完成
-h 11.0.0.136:主库 ip-u replica:复制用户-d:从库数据目录(需与主库一致)-fp:输出格式为原始文件(非压缩)-xs:备份时自动复制 wal 日志(确保数据一致性)-p:显示进度
3、配置从库连接主库
# 切换到root用户,编辑从库配置文件 vim /var/lib/pgsql/13/data/postgresql.conf ----------------------------------------------------------------------------------------- # 从库连接主库的信息 primary_conninfo = 'host=11.0.0.136 port=5432 user=replica password=peidongqing@123' # 允许从库只读查询 hot_standby = on -----------------------------------------------------------------------------------------
4、创建standby.signal文件,启用从库模式
# 切换到postgres用户,创建信号文件 su - postgres touch /var/lib/pgsql/13/data/standby.signal # 退出postgres用户 exit # 启动从库服务 systemctl start postgresql-13 systemctl enable postgresql-13
5、验证主从复制
主从验证均是通过postgres用户登录数据库验证
# 切换 postgres 用户 su - postgres # 进入数据库 psql
1、连接状态验证
主库
select client_addr, state from pg_stat_replication; # 成功输出 client_addr | state -------------+----------- 11.0.0.137 | streaming (1 行记录)
从库
select status from pg_stat_wal_receiver; # 成功输出 status ----------- streaming (1 行记录)
2、数据同步验证
主库
# 创建数据表 create table test_replica (id int); # 插入数据 insert into test_replica values (11111);
从库
select * from test_replica;
# 成功输出
id
---------
111111
(1 行记录)总结
通过以上步骤,postgresql 13 一主一从流复制架构已搭建完成:
- 主库(11.0.0.136)负责写入数据,并通过 wal 日志同步到从库。
- 从库(11.0.0.137)实时接收主库日志,保持数据一致,支持只读查询。
- 若主库故障,可手动将从库提升为主库。
到此这篇关于postgresql流复制(主从复制)详细教程的文章就介绍到这了,更多相关postgresql流复制(主从复制)内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论