给数据库多一份后路:PostgreSQL主从复制和远程连接实战
很多项目刚开始跑PostgreSQL时往往只部署一台数据库。开发测试阶段这样没什么问题但一旦业务数据开始积累单机数据库的风险就会变得明显机器宕机、磁盘故障、误操作或服务异常都可能让系统直接停摆。主从流复制就是PostgreSQL里非常常见的一种高可用基础方案。它通过WAL日志把主库的数据变化持续同步到从库让数据库不再只有一份运行副本。主库负责写入从库可以承担备份、只读查询和故障切换准备。这篇文章会以PostgreSQL 14为例演示一主一从流复制的完整搭建过程。前面会先准备两台服务器确认系统版本、PostgreSQL版本、网络互通和端口访问再开始调整主库的postgresql.conf和pg_hba.conf。主库部分会配置监听地址、归档、WAL级别、复制连接数和保留日志大小并创建专用复制用户。随后使用pg_basebackup生成主库基础备份并将备份传输到从库用于初始化从库数据目录。后面会继续配置从库的standby.signal和复制连接信息启动服务后通过pg_stat_replication、pg_is_in_recovery()和测试表同步结果验证主从关系。最后再通过 cpolar 映射PostgreSQL的5432端口完成公网TCP连接测试。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日志并同步数据为后续备份、只读查询和故障切换提供基础。这套方案的重点不只是把从库启动起来而是把复制链路验证清楚。主库能看到pg_stat_replication中的streaming状态从库能通过pg_is_in_recovery()确认自己处于恢复模式测试表数据也能从主库同步到从库这些才说明复制真正生效。故障转移时可以通过pg_promote()将从库提升为新主库。不过这一步不建议随意操作正式环境中还应配合应用连接切换、备份策略、监控告警和回切方案避免只完成数据库提升却没有处理业务侧连接。配置 cpolar 后本地PostgreSQL服务可以通过公网TCP地址连接。随机TCP端口适合临时测试固定TCP地址更适合长期演示或外部环境接入避免连接信息频繁变化。需要注意的是数据库公网访问必须谨慎。无论是测试还是演示都应使用强密码、最小权限账号、明确的访问范围和必要的防火墙策略避免把核心数据库长期裸露在公网中。PostgreSQL负责数据可靠性主从复制负责降低单点风险cpolar则负责补上远程连接通道。

相关新闻

2026年AI原生证券交易应用架构选型:多智能体编排与全链路闭环的技术解析

2026年AI原生证券交易应用架构选型:多智能体编排与全链路闭环的技术解析

一、问题定义:插件式AI vs AI原生应用 2026年证券App的AI能力竞争,表面是功能多少之争,实质是架构范式之争。传统券商App多采用插件式AI:在既有菜单框架上叠加问答入口、资讯摘要或智能客服,AI模块与行情、交易、风控子…

2026/10/25 0:12:50 阅读更多 →
EditPlus 无法写入右键菜单设置的解决方法

EditPlus 无法写入右键菜单设置的解决方法

当用户在使用editplus软件时,希望editplus添加到系统的右键菜单上,以前通过首选项直接就修改了,最近在win11系统的时候,总是无法设置,原来是因为权限问题 文章目录一、使用管理员权限打开editplus软件二、通过修改注册…

2026/10/25 11:33:19 阅读更多 →
gemini国内使用详解教程

gemini国内使用详解教程

很多人关心的其实不是“能不能用”这四个字,而是“在国内怎样判断自己当前是否具备使用条件、遇到报错该怎么排查、哪些方法风险高不该碰”。直接说结论:Gemini 这类海外生成式 AI 服务,在国内是否能顺利用,关键不在“有没有教程”…

2026/10/25 4:32:37 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/25 11:19:54 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/24 17:47:00 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/24 18:34:36 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/25 10:02:42 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/25 3:12:30 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/24 21:09:59 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 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/25 10:02:43 阅读更多 →
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/24 11:09:35 阅读更多 →
黑夜航拍船只数据集训练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/25 7:47:32 阅读更多 →