PostgreSQL 流复制搭建与维护
文章目录
- 前言
- 1. 配置环境
- 1.1 环境介绍
- 1.2 主库白名单
- 1.3 主库参数配置
- 2. 流复制搭建
- 2.1 备份恢复
- 2.2 创建复制用户
- 2.3 参数修改
- 2.4 启动并检查
- 2.5 同步流复制
- 2.6 同步复制级别
- 3. 流复制监控
- 3.1 角色判断
- 3.2 主库查看流复制
- 3.3 延迟监控
- 3.4 备库查询复制信息
前言
PostgreSQL 流复制(Streaming Replication)是 9.0 提供的一种新的 WAL 传递方法。使用流复制时,每当 Primary 节点 WAL 产生,就会马上传递到 Standby 节点,流复制提供 异步
和 同步
两种模式,同步模式可以保障数据 0 丢失。
1. 配置环境
1.1 环境介绍
主机名 | IP 地址 | 角色 | 数据目录 |
---|---|---|---|
172-16-104-7 | 172.16.104.7 | Master | /data/pgsql12/data/ |
172-16-104-56 | 172.16.104.56 | Standby | /data/pgsql12/data/ |
PostgreSQL 版本:PostgreSQL 12.2
操作系统:CentOS Linux release 7.8.2003 (Core)
1.2 主库白名单
Master 节点配置 pg_hba.conf
表示接受流复制的用户连接:
host replication all 0/0 md5
上面这条 SQL 语句的含义是允许任意用户从任何网络(0/0)网络上发起到本数据库的流复制连接,使用MD5的密码认证。
1.3 主库参数配置
# 监听
listen_addresses = '*'# 流复制客户端的最大并发数,设置为 0 表示禁用复制
max_wal_senders = 10# WAL 日志级别
wal_level = replica
上面的参数需要重启 PostgreSQL 服务后生效。
2. 流复制搭建
使用 pg_basebackup 将主库数据备份恢复到 Standby 节点,搭建 异步/同步
流复制,步骤归纳:
- 准备环境 PostgreSQL 主节点和备节点。
- 参数调整 pg_hba.conf、postgresql.conf,创建复制用户。
- 备份主节点的数据,恢复到备节点。
- 修改 primary_conninfo 启动备库。
- 检查是否启动成功。
2.1 备份恢复
在主库执行全量备份:
pg_basebackup -D /data/pgsql12/backup -v -P -X stream -Upostgres -h 127.0.0.1 -p5432 -R
将备份 SCP 到备库节点:
scp -r ./backup/ root@172.16.104.56:/data/backup
关闭 Standby 节点,清空 Standby 节点的数据文件,或者使用 mv 修改目录名:
# 备份数据目录,或者可以直接清空
mv /data/pgsql12/data /data/pgsql12/data_bak
# 将备份文件转移到数据目录
mv /data/pgsql12/backup /data/pgsql12/data
# 修改文件属组
chown -R postgres:postgres /data/pgsql12
2.2 创建复制用户
主库创建专用于流复制的用户:
CREATE ROLE repl REPLICATION LOGIN PASSWORD 'repl123';
2.3 参数修改
PostgreSQL 使用 standby.signal
文件表示实例为 Standby 节点。在使用 pg_basebackup 备份添加 -R 参数(write configuration for replication)会在 postgresql.auto.conf
文件中写入 primary_conninfo
参数信息,这里我们需要按照实际情况调整:
primary_conninfo = 'host=172.16.104.7 port=5432 user=repl password=repl123'
2.4 启动并检查
参数配置完成后,启动 Standby 节点即可:
pg_ctl -D /data/pgsql12/data/ -l /data/pgsql12/logs/start.log start
在主节点,可通过下方 SQL 查询流复制的监控信息:
postgres=# \x
Expanded display is on.postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 27408
usesysid | 24865
usename | repl
application_name | walreceiver
client_addr | 172.16.104.56
client_hostname |
client_port | 40990
backend_start | 2023-09-05 14:11:56.978627+08
backend_xmin |
state | streaming
sent_lsn | 6/4001BB0
write_lsn | 6/4001BB0
flush_lsn | 6/4001BB0
replay_lsn | 6/4001BB0
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async
reply_time | 2023-09-05 15:03:58.408518+08
其中 state = streaming
表示流复制状态正常,如果有异常,可以查看 error log 中的信息,或者启动的时候就 tail -f
error_log,实时关注输出的异常信息。
2.5 同步流复制
上面 2.1~2.4 是介绍如何搭建 异步
流复制。
PostgreSQL 异步流复制的缺点是当主库损坏的时候,激活备库可能会丢失一部分数据,这于 MySQL 异步复制相同,主库只管发送增量日志,挂掉后可能有部分日志从库还没有接收到,此时发生切换就会出现数据丢失,同步复制可以解决该类问题。不过需要注意的是,如果配置同步复制 Standby 节点挂掉,会导致 Priamry 节点卡住,所以一般会有多个 Standby 节点,至少保障 WAL 同步到一个 Standby 节点。
同步复制配置多加一个 synchronous_standby_names
参数,有 3 种配置方法:
synchronous_standby_names = 's1,s2,s3'
在这个例子中,如果有 s1、s2、s3 三台 Standby 节点在运行,意味着 s1 为同步节点,其他节点均为潜在同步节点,即 WAL 只需传递给 s1 节点就可以提交。
synchronous_standby_names = 'FIRST 2 (s1, s2, s3)'
在这个例子中,如果有四个后备服务器 s1、s2、s3 和 s4 在运行,两个后备服务器 s1 和 s2 将被选中为同步后备,因为它们出现在后备服务器名称列表的前部。s3 是一个潜在的同步后备,当 s1 或 s2 中的任何一个失效, 它就会取而代之。s4 则是一个异步后备因为它的名字不在列表中。
synchronous_standby_names = 'ANY 2 (s1, s2, s3)'
在这个例子中,如果有四台后备服务器 s1、s2、s3 以及 s4 正在运行,事务提交将会等待来自至少其中任意两台后备服务器的回复。s4 是一台异步后备,因为它的名字不在该列表中。
现在我们的架构是一个 Primary 节点一个 Standby 节点,现在通过修改参数调整为 同步流复制
修改主库参数:
# 其中 walreceiver 为 Standby 节点的名字,由 primary_conninfo 中的 application_name 设置
synchronous_standby_names = 'walreceiver'
修改该参数不需要重启数据库,使用 reload 重新加载配置即可:
pg_ctl reload -D /data/pgsql12/data/
在 Primary 节点查询流复制的状态信息:
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 13561
usesysid | 24865
usename | repl
application_name | walreceiver
client_addr | 172.16.104.56
client_hostname |
client_port | 42126
backend_start | 2023-09-06 17:18:48.297466+08
backend_xmin |
state | streaming
sent_lsn | 6/50007D0
write_lsn | 6/50007D0
flush_lsn | 6/50007D0
replay_lsn | 6/50007D0
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | sync
reply_time | 2023-09-06 17:45:00.706196+08
其中 sync_state 由 async
变为 sync
表示为同步模式。
2.6 同步复制级别
影响同步复制还需要关注一个参数 synchronous_commit
用来设置事务的同步级别:
postgres=# select * from pg_settings where name = 'synchronous_commit';
-[ RECORD 1 ]---+------------------------------------------------------
name | synchronous_commit
setting | on
unit |
category | Write-Ahead Log / Settings
short_desc | Sets the current transaction's synchronization level.
extra_desc |
context | user
vartype | enum
source | default
min_val |
max_val |
enumvals | {local,remote_write,remote_apply,on,off}
boot_val | on
reset_val | on
sourcefile |
sourceline |
pending_restart | f
- local:WAL 日志被本地持久化后(不用管远程)事务 commit 就可以返回。
- remote_write:WAL 日志被传到备库的内存中(不必等其被持久化)事务 commit 才返回。
- remote_apply:WAL 日志被传到备库并被 apply,事务 commit 才返回。
- on:WAL 日志被传到备库并被持久化(不必等其被 apply)事务 commit 才返回。
- off:不必等 WAL 日志被本地持久化,也不管是否传到远程,事务 commit 都可以立即返回。
对于同步复制,可选的值有 remote_write、remote_apply、on。
3. 流复制监控
3.1 角色判断
select pg_is_in_recovery();
判断数据库是否为主库 f
表示是主库,t
表示属于备库角色。
3.2 主库查看流复制
查看流复制信息,可以在主库查看 pg_stat_replication 视图,可以查看流复制的状态信息:
- sent_lsn:发送 WAL 的位置。
- write_lsn:备库已接收到这部分日志,但还没有刷到磁盘中。
- flush_lsn:备库已把 WAL 写入到磁盘中。
- replay_lsn:备库应用 WAL 的位置。
- sync_state:同步模式。
- state:流复制状态。
select * from pg_stat_replication;
输出结果:
postgres=# \x
Expanded display is on.postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 13561
usesysid | 24865
usename | repl
application_name | walreceiver
client_addr | 172.16.104.56
client_hostname |
client_port | 42126
backend_start | 2023-09-06 17:18:48.297466+08
backend_xmin |
state | streaming
sent_lsn | 6/50007D0
write_lsn | 6/50007D0
flush_lsn | 6/50007D0
replay_lsn | 6/50007D0
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | sync
reply_time | 2023-09-07 10:06:18.000504+08
3.3 延迟监控
使用下方 SQL 可以查看 Standby 节点落后主库多少字节 WAL 日志:
select pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn) from pg_stat_replication;
3.4 备库查询复制信息
在备库也可以通过查询 pg_stat_wal_receiver
视图,获得流复制的监控信息:
- pid:WAL 接收进程 ID。
- status:流复制状态,只有
streaming
为正常状态。 - receive_start_lsn:WAL 接收进程启动时使用的第一个 WAL 日志的位置。
- receive_start_tli:WAL 接收进程启动时使用的第一个时间线编号。
- received_lsn:已经接收到并且已经被写入磁盘的最后一个 WAL 日志的位置。
- received_tli:已经接收到并且已经被写入磁盘的最后一个 WAL 日志的时间线编号。
- last_msg_send_time:接收到最后一条 WAL 日志消息后,向主库发回确认消息的发送时间。
- last_msg_receipt_time:备库接收到最后一条 WAL 日志消息的接收时间。
- slot_name:使用复制槽的名称。
- conninfo:连接主库的连接串,密码等安全相关的信息会被隐去。
select * from pg_stat_wal_receiver;
postgres=# \x
Expanded display is on.
postgres=#
postgres=# select * from pg_stat_wal_receiver;
-[ RECORD 1 ]---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid | 113395
status | streaming
receive_start_lsn | 6/5000000
receive_start_tli | 3
received_lsn | 6/50007D0
received_tli | 3
last_msg_send_time | 2023-09-07 10:20:00.207856+08
last_msg_receipt_time | 2023-09-07 10:20:00.20971+08
latest_end_lsn | 6/50007D0
latest_end_time | 2023-09-06 17:19:46.661221+08
slot_name |
sender_host | 172.16.104.7
sender_port | 5432
conninfo | user=repl password=******** dbname=replication host=172.16.104.7 port=5432 fallback_application_name=walreceiver sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any
相关文章:
PostgreSQL 流复制搭建与维护
文章目录 前言1. 配置环境1.1 环境介绍1.2 主库白名单1.3 主库参数配置 2. 流复制搭建2.1 备份恢复2.2 创建复制用户2.3 参数修改2.4 启动并检查2.5 同步流复制2.6 同步复制级别 3. 流复制监控3.1 角色判断3.2 主库查看流复制3.3 延迟监控3.4 备库查询复制信息 前言 PostgreSQ…...
【Redis】关于过期数据清除的一些策略
这里要讨论的为过期的数据是如何被清除的,也就是网上常常讨论的过期清除策略。 需要注意的是,redis除了会对过期的数据进行淘汰,也可以通过对内存大小进行限制,并对超出内存限制后进行数据淘汰。此时淘汰的数据未必是过期的&…...
动态SQL
Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。 1、if if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签…...

uniapp:OCR识别身份证上传原图失败,问题解决
1、上传普通图片成功 2、上传>4M | >5M图片失败检查:1、uni.uploadFile自身没有文件大小限制。然而,这仍然取决于你的应用程序所在的平台和存储空间容量。 2、上传照片后不在fail,在sucess 提交照片-3 {"data": "<h…...
shell循环和函数
目录 1.for循环2.while循环3.until循环4.函数 1.for循环 for循环是固定循环,也就是在循环时就已经知道需要进行几次的循环,有事也把for循环成为计数循环。for的语法如下两种: 语法一 for 变量 in 值1 值2 值3 …(可以是一个文件等)do程序do…...
京东详情api
简要描述 根据商品id获取详情数据 请求URL http://xxx.xxx.xxx.xxx:xxxx/jd.get.item 请求方式 get 请求Query参数 参数名示例值必选类型说明itemid100016034386是string商品idtokenadmin.api是string权限token 成功返回示例 部分数据展示: {"data&qu…...

MySQL最新版8.1.0安装配置教程
目录 目录 前言 安装流程图 1,MySQL数据库是什么? 2,下载zip压缩包 3,解压到要安装的目录 4,添加环境变量 4.1,找到环境变量 4.2,进行环境变量的添加 5.新建mysql 配置文件 6、安装mysql服务 7、初始化数据文件 8、启动mysql …...
5G试题_1
1、 全息技术属于对5G三大类应用场景网络需求中的哪一种?(A) A. 增强移动宽带 B. 海量大连接 C. 低时延高可靠 D. 低时延大带宽 2、 在5G时代,不同领域的不同设备大量接入网络,其实引用传统的组网方式和服务提供形式也…...

正规股票配资网站的三个明显特点分析
随着股票市场的快速发展,越来越多的投资者开始考虑使用股票配资来增加自己的资金流动性和收益率。然而,在选择股票配资网站时,投资者往往难以辨别哪些网站是正规的,哪些网站存在风险。因此,以下将分析正规股票配资网站…...

质疑苹果5G信号造假成为闹剧,反而将运营商置于尴尬境地
在iPhone15发布会处于热点之际,一位号称通信专家的人士指责iPhone的5G信号造假,一度闹得沸沸扬扬,导致舆论一开始都是质疑苹果造假,然而在知乎却有更多专业人士指出这位专家不了解5G技术,这个问题或许反而出在运营商身…...
vue 预览zip
ZIP的数据从接口传递数据流过来。解析数据流,并将zip的目录绑定到tree中。 1.引入插件jszip: yarn add jszip 2.在需要引用的页面引用: import JSZip from jszip 3. 实现代码 api(option).then((res)>{ // 接口获取zip的数据流 l…...
人先自辱,而后人辱之
语出《孟 子.离娄上》“夫人必自街,而后人懈之;家必自毁,而后人毁之"。 自己不把自己当人看,别人肯定也不会。善待自己,接纳自己。 过去的不再留恋。 心平气和,气定神闲。 政治论述题,每一个题目&a…...

web端三维重建算法-colmap++
vismap vismap 是colmap 版本 (1) 支持superpoint superglue (2) 支持netvlad 图像检索 (3)支持特征点尺度定权 (4)支持二维码定位 (5)支持融合gps &#x…...

MyBatisPlus(二)基础Mapperr接口:增删改查
MyBatisPlus:基础Mapper接口:增删改查 插入一条数据 代码 Testpublic void insert() {User user new User();user.setId(6L);user.setName("张三");user.setAge(25);user.setEmail("zhangsanexample.com");userMapper.insert(use…...
基础项目实用案例
文章目录 倒计时动态生成表格发布留言密码框验证模态框拖拽 倒计时 function countDown(time) {var nowTime new Date();var inputTime new Date(time);var times (inputTime - nowTime) / 1000;var d parseInt(times / 60 / 60 / 24);d d < 10 ? 0 d : d;var h par…...
sprngboot整合kabana
Spring Boot是一个开源框架,可以基于Spring框架快速开发和构建生产级别的应用程序。Kibana是一个可视化和交互式分析平台,用于检索和分析Elasticsearch集群中存储的数据。 下面是Spring Boot整合Kibana的基本步骤: 添加Maven依赖 在pom.xm…...

PostgreSQL 数据备份恢复
文章目录 PostgreSQL 备份方式SQL备份(逻辑备份)文件系统备份(物理备份)归档备份(物理备份) 逻辑备份&恢复物理备份&恢复(全量)备份恢复 物理备份&恢复(某个…...

线性代数的本质(七)——特征值和特征向量
特征值和特征向量 本章特征值和特征向量的概念只在方阵的范畴内探讨。 相似矩阵 Grant:线性变换对应的矩阵依赖于所选择的基。 一般情况下,同一个线性变换在不同基下的矩阵不同。仍然以平面线性变换为例,Grant 选用标准坐标系下的基向量 i…...

c语言进阶部分详解(指针初阶)
大家好!,前段时间一直在准备数学建模竞赛,现在也是忙完了。抓紧继续给大家带来c语言的内容。今天给大家带来指针初阶部分的讲解 当我们谈论C语言中的指针时,实际上是在讨论一种非常重要的概念,因为指针是C语言的核心之…...
Socks5代理IP在跨境电商与网络游戏中的网络安全应用
在数字化时代,跨境电商和网络游戏已成为全球网络世界中的两大热门领域。然而,这两者都面临着相似的网络安全挑战,需要高效的网络代理来解决。本文将讨论Socks5代理IP在跨境电商和网络游戏中的关键作用,以及如何通过这一技术增强网…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...