给数据库增加一份实时副本:PostgreSQL主从流复制实战
只有一台PostgreSQL服务器时所有数据和业务连接都集中在同一个节点。服务器宕机、磁盘故障或系统维护都可能让数据库暂时不可用如果备份不完整恢复过程还会进一步拉长。主从流复制提供了一种相对直接的容灾思路。主库继续承担正常写入同时把产生的WAL日志发送给从库从库持续接收并回放这些变化从而保留一份接近实时的数据副本。本文会以两台安装PostgreSQL 14的Linux服务器为例先在主库配置监听地址、WAL参数和复制账号再通过pg_hba.conf限制从库使用专用用户连接。随后使用pg_basebackup生成一致性基础备份将数据传输到从库并通过standby.signal和primary_conninfo建立持续复制关系。完成启动后再分别从主库和从库验证复制状态及数据同步结果。主从链路运行正常后还会介绍从库提升、复制延迟查询和新增从库等常用操作并使用 cpolar 为受控的远程连接建立TCP地址方便在没有公网IP的环境中进行测试和维护。1.环境准备1.1 基础环境要求节点类型服务器地址系统版本PostgreSQL 版本核心要求主库Master192.168.42.140示例CentOS 7/8/9或Ubuntu 20.0414开启网络端口、关闭防火墙 / 放行5432端口从库Slave/Standby192.168.42.145示例与主库一致与主库完全一致与主库网络互通、磁盘空间不小于主库1.2 安装PostgreSQL还没安装PostgreSQL的小伙伴可以去cpolar官网参考《谁说没公网IP不能远程连数据库PostgreSQLcpolar打通任督二脉》这篇文章哦~2.1 修改PostgreSQL主配置文件主配置文件路径/var/lib/pgsql/14/data/postgresql.confvim/var/lib/pgsql/14/data/postgresql.conf修改以下核心参数取消注释并调整值# 1. 监听地址允许从库连接可指定从库IP或0.0.0.0允许所有listen_addresses*# 2. 开启归档模式主从复制依赖archive_modeon archive_commandcp %p /var/lib/pgsql/14/archive/%f# %p归档文件路径%f归档文件名# 提前创建归档目录mkdir-p/var/lib/pgsql/14/archivechown-Rpostgres:postgres /var/lib/pgsql/14/archive# 3. WAL日志配置保证复制可靠性wal_levelreplica# 复制所需的WAL级别replica/archive/logicalreplica足够wal_buffers16MB# 根据内存调整默认通常足够max_wal_senders10# 最大并发复制连接数大于从库数量即可wal_keep_size1GB# 保留WAL日志的大小防止从库同步滞后导致日志被清理# 4. 同步模式可选按需配置# synchronous_commit on # 默认同步提交保证主从数据一致性追求性能可设为off# synchronous_standby_names slave1 # 指定从库名称需与从库recovery.conf对应# 5. 其他优化可选max_connections1000# 大于从库的max_connections2.2 修改客户端认证配置文件文件路径/var/lib/pgsql/14/data/pg_hba.confvim/var/lib/pgsql/14/data/pg_hba.conf添加从库的连接授权允许从库 IP 通过复制用户连接hostreplication repl_user192.168.42.145/32 md5# 从库IPrepl_user为复制专用用户hostall all192.168.42.0/24 md5# 可选允许内网其他机器连接2.3 创建复制专用用户切换到postgres用户执行 SQL 命令创建用于主从复制的专用用户需授予复制权限su- postgres psql执行SQL-- 创建复制用户密码自定义示例Repl123456 CREATE ROLE repl_user WITH REPLICATION LOGIN ENCRYPTED PASSWORD********;-- 验证用户可选\du repl_user;-- 退出psql\q2.4 重启主库使配置生效systemctl restart postgresql-14 systemctl status postgresql-14sudo-upostgres psql-cSELECT pg_is_in_recovery();# 主库返回f非恢复模式2.5 备份主库数据供从库初始化使用pg_basebackup工具备份主库数据该工具专门用于PostgreSQL复制环境的从库初始化# 切换到postgres用户su- postgres# 执行备份备份到临时目录后续拷贝到从库pg_basebackup-h192.168.42.140-Urepl_user-p5432-D/tmp/pg_master_backup-Fp-Xs-P-R# 参数说明# -h主库地址# -U复制用户# -p主库端口# -D备份目录# -F p输出格式为普通文件与主库数据目录结构一致# -X s备份过程中同步复制WAL日志保证备份一致性# -P显示备份进度# -R自动生成复制所需的standby.signal文件和postgresql.auto.conf配置简化从库配置备份完成后将备份目录打包拷贝到从库的/var/lib/pgsql/14/目录下可通过 scp 传输tar-zcvfpg_master_backup.tar.gz /tmp/pg_master_backup# 主库上打包备份scppg_master_backup.tar.gz root192.168.1.101:/var/lib/pgsql/14# 传输到从库到从库所在地址查看一下是否传送成功到/var/lib/pgsql/143.从库配置3.1 停止从库PostgreSQL服务并清理原有数据目录# 停止从库服务systemctl stop postgresql-14# 清理原有数据目录初始化后的空目录需替换为主库备份mv/var/lib/pgsql/14/data /var/lib/pgsql/14/data_bak# 备份原有目录防止误删mkdir-p/var/lib/pgsql/14/data3.2 解压主库备份到从库数据目录# 切换到postgres用户su- postgres# 解压备份包tar-zxvf/var/lib/pgsql/14/pg_master_backup.tar.gz-C/var/lib/pgsql/14/# 移动备份数据到data目录mv/var/lib/pgsql/14/tmp/pg_master_backup/* /var/lib/pgsql/14/data/# 修改目录权限必须为postgres用户和组chown-Rpostgres:postgres /var/lib/pgsql/14/datachmod700/var/lib/pgsql/14/data3.3 验证 / 修改从库复制配置由于主库备份时使用了-R参数会自动生成standby.signal标识从库身份和postgresql.auto.conf包含复制连接信息无需手动创建# 查看自动生成的复制配置cat/var/lib/pgsql/14/data/postgresql.auto.confls/var/lib/pgsql/14/data/若没有则手动创建standby.signal并修改postgresql.conf# 手动创建standby.signal标识为从库touch/var/lib/pgsql/14/data/standby.signal# 编辑postgresql.conf添加复制配置,添加以下参数vim/var/lib/pgsql/14/data/postgresql.conf# 从库专属配置hot_standbyon# 允许从库处于恢复模式时提供查询服务只读max_connections500# 小于主库的max_connectionsprimary_conninfouserrepl_user passwordRepl123456 host192.168.42.140 port5432# 主库连接信息3.4 启动从库服务# 启动从库systemctl start postgresql-14 systemctlenablepostgresql-14# 验证从库状态systemctl status postgresql-144.验证主从复制是否生效4.1 主库验证复制状态su- postgres psql# 查看复制连接状态可看到从库的连接信息SELECT * FROM pg_stat_replication;# 输出说明# - usenamerepl_user复制用户# - client_addr192.168.1.101从库IP# - statestreaming表示正在流式复制# - sync_stateasync异步复制或 sync同步复制需主库配置synchronous_commiton从提供的pg_stat_replication查询结果来看PostgreSQL主从复制已经成功建立并且处于正常运行状态。这是一个非常关键的监控视图用于查看 主库上的复制连接状态。4.2 从库验证复制状态su- postgres psql# 1. 验证是否处于恢复模式从库返回t主库返回fSELECT pg_is_in_recovery();4.3 验证主从数据一致性# 主库创建测试表并插入数据# 主库执行CREATE DATABASE test_repl;\c test_repl;CREATE TABLE user_info(id int, name varchar(50));INSERT INTO user_info VALUES(1,test_replication);# 从库执行查看是否同步到数据\c test_repl;SELECT * FROM user_info;主库从库从上图我们可以看出主从复制成功啦5.主从复制常用操作5.1 切换主从故障转移简易版当主库故障时可将从库提升为主库# 从库执行停止恢复模式提升为主库su- postgres psql-cSELECT pg_promote();# 验证提升后从库pg_is_in_recovery()返回fpsql-cSELECT pg_is_in_recovery();5.2 监控复制延迟# 从库执行查看复制延迟单位秒SELECT now()- pg_last_xact_replay_timestamp()AS replication_delay;5.3新增从库只需重复 “从库配置” 步骤使用主库或现有从库需开启级联复制的pg_basebackup备份初始化即可。5.4 拓展主从复制已经成功搭建但我们的目标远不止于此。回想一下在开发、测试甚至小型项目交付中你是否也曾陷入这样的困境“我在家搭了个PostgreSQL数据库同事怎么连不上”“客户急着看Demo可服务跑在内网根本没法访问”“没有公网IP难道只能租云服务器或者干脆放弃远程演示”别焦虑——没有公网IP并不意味着你的服务只能困在局域网里。借助一个轻量级但强大的内网穿透工具cpolar你可以轻松将本地运行的PostgreSQL服务“暴露”到公网自动生成一个安全、可分享的HTTPS隧道地址。无论你身处家庭宽带、公司防火墙后还是校园网深处外部用户都能像访问普通网站一样通过标准端口安全连接你的数据库。本文将手把手带你完成这一过程从零配置cpolar到安全地将PostgreSQL服务映射至公网打通内网与外部世界的连接通道。从此“我的数据库在哪服务就在哪”不再是一句空话。准备好了吗让我们开启这场高效、安全、低成本的“内网突围”之旅6.安装cpolar实现随时随地开发6.1 什么是cpolarcpolar是一款安全高效的内网穿透工具无需公网IP或复杂配置只需一条命令即可将本地服务器、Web服务或任意端口映射到公网让你随时随地远程访问内网应用特别适合开发调试、远程运维和应急部署等场景。6.2 部署cpolarcpolar 可以将你本地电脑中的服务如 SSH、Web、数据库映射到公网。即使你在家里或外出时也可以通过公网地址连接回本地运行的开发环境。❤️以下是安装cpolar步骤使用一键脚本安装命令sudocurlhttps://get.cpolar.sh|sh安装完成后执行下方命令查看cpolar服务状态如图所示即为正常启动sudosystemctl status cpolarCpolar安装和成功启动服务后在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可打开浏览器访问本地9200端口使用cpolar账户密码登录即可,登录后即可对隧道进行管理。7.配置公网地址通过配置你可以在本地 WSL 或 Linux 系统上运行 SSH 服务并通过 Cpolar 将其映射到公网从而实现从任意设备远程连接开发环境的目的。隧道名称可自定义本例使用了:postgres注意不要与已有的隧道名称重复协议tcp本地地址192.168.42.140:5432端口类型随机临时TCP端口地区China Vip创建成功后打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址接下来就可以在其他电脑或者移动端设备异地上使用任意一个地址在终端中访问即可。tcp 表示使用的协议类型2.tcp.vip.cpolar.cn是 Cpolar 提供的域名11084是随机分配的公网端口号通过 Cpolar 提供的公网地址和端口使用 SSH 协议从任意一台主机连接到postgres账号啦psql-h2.tcp.vip.cpolar.cn-p11084-Upostgres-dmydb8.保留固定TCP公网地址使用cpolar为其配置TCP地址该地址为固定地址不会随机变化。选择区域和描述有一个下拉菜单当前选择的是“China VIP”。右侧输入框用于填写描述信息。保留按钮在右侧有一个橙色的“保留”按钮点击该按钮可以保留所选的TCP地址。列表中显示了一条已保留的TCP地址记录。地区显示为“China VIP”。地址显示为“8.tcp.vip.cpolar.cn:13299”。登录cpolar web UI管理界面点击左侧仪表盘的隧道管理——隧道列表找到所要配置的隧道postgres点击右侧的编辑。修改隧道信息将保留成功的TCP端口配置到隧道中。端口类型选择固定TCP端口预留的TCP地址填写保留成功的TCP地址点击更新。创建完成后打开在线隧道列表此时可以看到随机的公网地址已经发生变化地址名称也变成了保留和固定的TCP地址。最后测试一下固定的地址是否好用测试命令psql-h8.tcp.vip.cpolar.cn-p13299-Upostgres-dmydb这样我们成功打破了“没有公网 IP 就无法远程访问数据库”的固有认知。总结只有一台PostgreSQL服务器时所有数据和业务连接都集中在同一个节点。服务器宕机、磁盘故障或系统维护都可能让数据库暂时不可用如果备份不完整恢复过程还会进一步拉长。主从流复制提供了一种相对直接的容灾思路。主库继续承担正常写入同时把产生的WAL日志发送给从库从库持续接收并回放这些变化从而保留一份接近实时的数据副本。本文会以两台安装PostgreSQL 14的Linux服务器为例先在主库配置监听地址、WAL参数和复制账号再通过pg_hba.conf限制从库使用专用用户连接。随后使用pg_basebackup生成一致性基础备份将数据传输到从库并通过standby.signal和primary_conninfo建立持续复制关系。完成启动后再分别从主库和从库验证复制状态及数据同步结果。主从链路运行正常后还会介绍从库提升、复制延迟查询和新增从库等常用操作并使用 cpolar 为受控的远程连接建立TCP地址方便在没有公网IP的环境中进行测试和维护。

相关新闻

提升办公效率!Windows 搭建 OpenClaw 智能体,实现文件与网页自动化(含安装包)

提升办公效率!Windows 搭建 OpenClaw 智能体,实现文件与网页自动化(含安装包)

桌面 AI 智能体 OpenClaw 搭建教程|Windows 图形化部署,搭建自动化办公助手 ✨核心亮点:图形界面操作|省去复杂环境配置|整合全部运行依赖|支持本地运行|内置 28 万 Tokens 使用额度 资源获取…

2026/10/7 6:34:18 阅读更多 →
Flask-Blogging API全解析:开发者必须掌握的接口使用技巧

Flask-Blogging API全解析:开发者必须掌握的接口使用技巧

Flask-Blogging API全解析:开发者必须掌握的接口使用技巧 【免费下载链接】Flask-Blogging A Markdown Based Python Blog Engine as a Flask Extension. 项目地址: https://gitcode.com/gh_mirrors/fl/Flask-Blogging Flask-Blogging 是一个基于 Markdown 的…

2026/10/13 12:23:53 阅读更多 →
BitTorrent DHT核心功能揭秘:gh_mirrors/dht1/dht库关键API全指南

BitTorrent DHT核心功能揭秘:gh_mirrors/dht1/dht库关键API全指南

BitTorrent DHT核心功能揭秘:gh_mirrors/dht1/dht库关键API全指南 【免费下载链接】dht BitTorrent DHT library 项目地址: https://gitcode.com/gh_mirrors/dht1/dht BitTorrent DHT(分布式哈希表)是P2P网络中的核心组件,…

2026/10/10 22:13:12 阅读更多 →

最新新闻

摄像头如何看懂工地:视频智能检测技术落地与调参实战

摄像头如何看懂工地:视频智能检测技术落地与调参实战

当摄像头学会“看懂”工地:聊聊视频智能检测这门技术先说个直观感受。五年前如果有人说摄像头能自动发现工人没戴安全帽、能拦住翻围墙的人、能闻见工地上的烟火味,我多半会礼貌点头然后心想“这是产品宣传片吧”。但这两年我自己陆续接触过几个工地智能…

2026/10/14 5:22:04 阅读更多 →
DDD战术建模实战:聚合根、仓储与防腐层的代码落地

DDD战术建模实战:聚合根、仓储与防腐层的代码落地

写这篇的时候我刚从IDE里抬起头,咖啡已经凉透了。从第一天开始摸这套老系统到现在,十几天的时间里,大部分精力其实不是花在“写代码”上,而是花在“决定代码该长什么样”上。很多团队对DDD的认知停在“事件风暴画几张黄色便签”“…

2026/10/14 5:22:04 阅读更多 →
工地视频智能检测落地指南:从硬件选型到算法调优

工地视频智能检测落地指南:从硬件选型到算法调优

摄像头能“看懂”工地,这事儿放在三年前说出来很多人还当是概念炒作,但今天它已经实实在在成了工地安全管理的标配工具。我接触视频智能检测这几年,最直观的感受是:它不是简单给工地装上“眼睛”,而是让这些眼睛真正开…

2026/10/14 5:22:04 阅读更多 →
ASP无组件上传类AienAspUpload源码解析与实战避坑指南

ASP无组件上传类AienAspUpload源码解析与实战避坑指南

简介:艾恩ASP无组件上传类AienAspUpload是一套面向ASP开发者的轻量级文件上传解决方案,适合需要在传统ASP环境中快速实现表单处理与文件上传的初中级开发者。该类以简洁易懂的代码实现核心上传逻辑,支持提取表单数据、上传至不同文件夹、上传…

2026/10/14 5:22:04 阅读更多 →
C#多线程进阶指南:线程安全、Task与异步并发实践

C#多线程进阶指南:线程安全、Task与异步并发实践

1. 技术选型与整体思路拆解1.1 为什么进阶第一课要选多线程C#进阶的路子不少:反射、泛型、LINQ、表达式树、依赖注入……但如果你去问一个写服务端写了很多年的开发者,哪块内容对系统性能影响最大、最容易出线上事故、也最能区分“会写代码”和“会设计系…

2026/10/14 5:22:04 阅读更多 →
Linux磁盘管理核心:LVM三命令pvcreate、vgcreate、lvcreate实战详解

Linux磁盘管理核心:LVM三命令pvcreate、vgcreate、lvcreate实战详解

做Linux运维和服务器管理,磁盘管理是永远绕不开的基本功。而只要涉及“动态扩容”“灵活调整”这类需求,LVM(逻辑卷管理)几乎就是默认答案。网上讲LVM的教程不少,但大多数只停留在“敲命令能跑通”的层面,真…

2026/10/14 5:21:03 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →