当前位置: 首页 > news >正文

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-7172.16.104.7Master/data/pgsql12/data/
172-16-104-56172.16.104.56Standby/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 节点,搭建 异步/同步 流复制,步骤归纳:

  1. 准备环境 PostgreSQL 主节点和备节点。
  2. 参数调整 pg_hba.conf、postgresql.conf,创建复制用户。
  3. 备份主节点的数据,恢复到备节点。
  4. 修改 primary_conninfo 启动备库。
  5. 检查是否启动成功。

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_stateasync 变为 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图片失败检查&#xff1a;1、uni.uploadFile自身没有文件大小限制。然而&#xff0c;这仍然取决于你的应用程序所在的平台和存储空间容量。 2、上传照片后不在fail&#xff0c;在sucess 提交照片-3 {"data": "<h…...

shell循环和函数

目录 1.for循环2.while循环3.until循环4.函数 1.for循环 for循环是固定循环&#xff0c;也就是在循环时就已经知道需要进行几次的循环&#xff0c;有事也把for循环成为计数循环。for的语法如下两种&#xff1a; 语法一 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 成功返回示例 部分数据展示&#xff1a; {"data&qu…...

MySQL最新版8.1.0安装配置教程

目录 目录 前言 安装流程图 1&#xff0c;MySQL数据库是什么? 2&#xff0c;下载zip压缩包 3&#xff0c;解压到要安装的目录 4,添加环境变量 4.1,找到环境变量 4.2,进行环境变量的添加 5.新建mysql 配置文件 6、安装mysql服务 7、初始化数据文件 8、启动mysql …...

5G试题_1

1、 全息技术属于对5G三大类应用场景网络需求中的哪一种&#xff1f;&#xff08;A&#xff09; A. 增强移动宽带 B. 海量大连接 C. 低时延高可靠 D. 低时延大带宽 2、 在5G时代&#xff0c;不同领域的不同设备大量接入网络&#xff0c;其实引用传统的组网方式和服务提供形式也…...

正规股票配资网站的三个明显特点分析

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

质疑苹果5G信号造假成为闹剧,反而将运营商置于尴尬境地

在iPhone15发布会处于热点之际&#xff0c;一位号称通信专家的人士指责iPhone的5G信号造假&#xff0c;一度闹得沸沸扬扬&#xff0c;导致舆论一开始都是质疑苹果造假&#xff0c;然而在知乎却有更多专业人士指出这位专家不了解5G技术&#xff0c;这个问题或许反而出在运营商身…...

vue 预览zip

ZIP的数据从接口传递数据流过来。解析数据流&#xff0c;并将zip的目录绑定到tree中。 1.引入插件jszip&#xff1a; yarn add jszip 2.在需要引用的页面引用&#xff1a; import JSZip from jszip 3. 实现代码 api(option).then((res)>{ // 接口获取zip的数据流 l…...

人先自辱,而后人辱之

语出《孟 子.离娄上》“夫人必自街&#xff0c;而后人懈之;家必自毁&#xff0c;而后人毁之"。 自己不把自己当人看&#xff0c;别人肯定也不会。善待自己&#xff0c;接纳自己。 过去的不再留恋。 心平气和&#xff0c;气定神闲。 政治论述题&#xff0c;每一个题目&a…...

web端三维重建算法-colmap++

vismap vismap 是colmap 版本 &#xff08;1&#xff09; 支持superpoint superglue &#xff08;2&#xff09; 支持netvlad 图像检索 &#xff08;3&#xff09;支持特征点尺度定权 &#xff08;4&#xff09;支持二维码定位 &#xff08;5&#xff09;支持融合gps &#x…...

MyBatisPlus(二)基础Mapperr接口:增删改查

MyBatisPlus&#xff1a;基础Mapper接口&#xff1a;增删改查 插入一条数据 代码 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是一个开源框架&#xff0c;可以基于Spring框架快速开发和构建生产级别的应用程序。Kibana是一个可视化和交互式分析平台&#xff0c;用于检索和分析Elasticsearch集群中存储的数据。 下面是Spring Boot整合Kibana的基本步骤&#xff1a; 添加Maven依赖 在pom.xm…...

PostgreSQL 数据备份恢复

文章目录 PostgreSQL 备份方式SQL备份&#xff08;逻辑备份&#xff09;文件系统备份&#xff08;物理备份&#xff09;归档备份&#xff08;物理备份&#xff09; 逻辑备份&恢复物理备份&恢复&#xff08;全量&#xff09;备份恢复 物理备份&恢复&#xff08;某个…...

线性代数的本质(七)——特征值和特征向量

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

c语言进阶部分详解(指针初阶)

大家好&#xff01;&#xff0c;前段时间一直在准备数学建模竞赛&#xff0c;现在也是忙完了。抓紧继续给大家带来c语言的内容。今天给大家带来指针初阶部分的讲解 当我们谈论C语言中的指针时&#xff0c;实际上是在讨论一种非常重要的概念&#xff0c;因为指针是C语言的核心之…...

Socks5代理IP在跨境电商与网络游戏中的网络安全应用

在数字化时代&#xff0c;跨境电商和网络游戏已成为全球网络世界中的两大热门领域。然而&#xff0c;这两者都面临着相似的网络安全挑战&#xff0c;需要高效的网络代理来解决。本文将讨论Socks5代理IP在跨境电商和网络游戏中的关键作用&#xff0c;以及如何通过这一技术增强网…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

门静脉高压——表现

一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构&#xff1a;由肠系膜上静脉和脾静脉汇合构成&#xff0c;是肝脏血液供应的主要来源。淤血后果&#xff1a;门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血&#xff0c;引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space

问题&#xff1a;IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案&#xff1a;将编译的堆内存增加一点 位置&#xff1a;设置setting-》构建菜单build-》编译器Complier...