当前位置: 首页 > 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…...

机器学习笔记之最优化理论与方法(十)无约束优化问题——共轭梯度法背景介绍

机器学习笔记之最优化理论与方法——共轭梯度法背景介绍 引言背景:共轭梯度法线性共轭梯度法共轭方向共轭VS正交共轭方向法共轭方向法的几何解释 引言 本节将介绍共轭梯度法,并重点介绍共轭方向法的逻辑与几何意义。 背景:共轭梯度法 关于…...

Mybatis核心对象及工作流程

目录 一、mybatis核心对象 (1)SqlSession对象直接操作数据库 (2)SqlSession对象通过代理对象操作数据库 二、mybatis工作流程 一、mybatis核心对象 (1)SqlSessionFactoryBuilder SqlSession工厂构建者对…...

无swing,高级javaSE毕业之贪吃蛇游戏(含模块构建,多线程监听服务),已录制视频

JavaSE,无框架实现贪吃蛇 B站已发视频:无swing,纯JavaSE贪吃蛇游戏设计构建 文章目录 JavaSE,无框架实现贪吃蛇1.整体思考2.可能的难点思考2.1 如何表示游戏界面2.2 如何渲染游戏界面2.3 如何让游戏动起来2.4 蛇如何移动 3.流程图…...

Kafka3.0.0版本——消费者(消费者组详细消费流程图解及消费者重要参数)

目录 一、消费者组详细消费流程图解二、消费者的重要参数 一、消费者组详细消费流程图解 创建一个消费者网络连接客户端,主要用于与kafka集群进行交互,如下图所示: 调用sendFetches发送消费请求,如下图所示: (1)、Fet…...

算法通关村-----位运算在海量元素中查找重复元素的妙用

用4KB内存寻找重复元素 问题描述 给定一个数组,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB内存可用,如何打印数组中所有的重复元素。 问题分析 Java中存储整数使用int…...

RabbitMQ: Publish/Subscribe结构

生产者 package com.qf.mq2302.publishSub;import com.qf.mq2302.utils.MQUtils;import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection;public class EmitLog {private static final String EXCHANGE_NAME "logs";public static void main…...

单片机-蜂鸣器

简介 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电 蜂鸣器主要分为 压电式蜂鸣器 和 电磁式蜂鸣器 两 种类型。 压电式蜂鸣器 主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后&…...

华为云云耀云服务器L实例评测 | 分分钟完成打地鼠小游戏部署

前言 在上篇文章【华为云云耀云服务器L实例评测 | 快速部署MySQL使用指南】中,我们已经用【华为云云耀云服务器L实例】在命令行窗口内完成了MySQL的部署并简单使用。但是后台有小伙伴跟我留言说,能不能用【华为云云耀云服务器L实例】来实现个简单的小游…...

Android——数据存储(二)(二十二)

1. SQLite数据库存储 1.1 知识点 (1)了解SQLite数据库的基本作用; (2)掌握数据库操作辅助类:SQLiteDatabase的使用; (3)可以使用命令操作SQLite数据库; …...

appium环境搭建

一.appium环境搭建 1.python3 python3的下载安装这里就不多做介绍了,当然你也可以选择自己喜欢的语音,比如java… 2.jdk 1)下载地址 官网(需登录账号): https://www.oracle.com/java/technologies/downloads/ 百度网盘&…...

十五、Webpack打包图片-js-Vue、Label命令、resolve模块解析

一、webpack打包图片 (1)加载图片案例准备 为了演示我们项目中可以加载图片,我们需要在项目中使用图片,比较常见的使用图片的方式是两种: img元素,设置src属性;其他元素(比如div&…...

ARM指令集--数据处理指令

数据处理指令:数学运算,逻辑运算 立即数 立即数的本质 就是包含在指令当中的数,属于指令的一部分 立即数的优点:取指的时候就可以将其读取到CPU,不用单独去内存读取,速度快 立即数的缺点:不…...

Excel embed into a webpage

无法编辑嵌入式 Excel 网页版 工作簿,但具有适当权限的人员可能能够在 Excel 中打开嵌入的工作簿,他们可以在其中编辑数据。 通过制作一个浏览器,打开并编辑它 https://onedrive.live.com/embed? resid5FC97855340825A9%21135& aut…...

uniapp点击事件在小程序中无法传参

这个问题很是神奇,第一次遇到。在h5中,点击事件可以正常传参,打包小程序后确失效了。 修改:for循环中的key,使用 index就好了...

ssprompt:一个LLM Prompt分发管理工具

阅读顺序 🌟前言🔔ssprompt介绍命令介绍Metafile介绍版本依赖规则 🌊 PromptHubGitHub Token 🚀 Quick Install系统依赖pip安装Linux, macOS, Windows (WSL)Windows (Powershell) 🚩 Roadmap🌏 项目交流讨论…...

修复 ChatGPT 发生错误的问题

目录 ChatGPT 发生错误?请参阅如何修复连接错误! 修复 ChatGPT 发生错误的问题 基本故障排除技巧 检查 ChatGPT 的服务器状态 检查 API 限制 检查输入格式 清除浏览数据 香港DSE是什么? 台湾指考是什么? 王湘浩 生平 …...

《热题100》字符串、双指针、贪心算法篇

思路:对于输入的的字符串,只有三种可能,ipv4,ipv6,和neither ipv4:四位,十进制,无前导0,小于256 ipv6:八位,十六进制,无多余0(00情况不允许),不…...

大数据组件Sqoop-安装与验证

🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 个人主页:beixi 本文章收录于专栏(点击传送):【大数据学习】 💓💓持续更新中,感谢各位前辈朋友们支持…...

运算符重载(个人学习笔记黑马学习)

1、加号运算符重载 #include <iostream> using namespace std; #include <string>//加号运算符重载 class Person { public://1、成员函数重载号//Person operator(Person& p) {// Person temp;// temp.m_A this->m_A p.m_A;// temp.m_B this->m_B p…...

为什么你的ElevenLabs马拉雅拉姆文输出失真?5步诊断法+3个预处理Python脚本立即修复

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs马拉雅拉姆文输出失真的根本成因 马拉雅拉姆语&#xff08;Malayalam&#xff09;作为印度喀拉拉邦的官方语言&#xff0c;拥有高度复杂的音节结构、连字规则&#xff08;conjunct consonant…...

UI-TARS桌面版:用自然语言控制计算机的智能GUI助手

UI-TARS桌面版&#xff1a;用自然语言控制计算机的智能GUI助手 【免费下载链接】UI-TARS-desktop The Open-Source Multimodal AI Agent Stack: Connecting Cutting-Edge AI Models and Agent Infra 项目地址: https://gitcode.com/GitHub_Trending/ui/UI-TARS-desktop …...

为什么你的旁遮普语语音听起来像“机械诵经”?ElevenLabs隐藏参数`stability=0.35`+`similarity_boost=0.72`调优公式首次披露

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;旁遮普语语音合成的“机械诵经”现象本质 当旁遮普语&#xff08;Gurmukhi script&#xff09;文本被输入主流TTS系统时&#xff0c;常出现一种高度重复、节奏僵硬、缺乏韵律起伏的输出效果——业内戏称…...

Cadence Allegro铺铜实战:从动态避让到静态优化,我的多层板效率提升心得

Cadence Allegro铺铜实战&#xff1a;从动态避让到静态优化&#xff0c;我的多层板效率提升心得 在高速PCB设计领域&#xff0c;Cadence Allegro作为行业标准工具&#xff0c;其铺铜功能直接影响设计效率与产品质量。当板层超过8层、元件密度突破500pin/inch时&#xff0c;动态…...

【UE5】EnhancedInput进阶实战:从基础绑定到模块化设计

1. EnhancedInput系统概述与核心优势 第一次接触UE5的EnhancedInput系统时&#xff0c;我完全被它的灵活性震惊了。相比传统输入处理方式&#xff0c;这套系统就像从手动挡汽车升级到了自动驾驶——不仅能识别简单的按键动作&#xff0c;还能精确捕捉输入设备的压力感应、手势轨…...

从零理解无刷电机方波驱动:用STM32CubeMX配置TIM1 PWM与EXTI中断实现换相

STM32无刷电机方波驱动实战&#xff1a;CubeMX配置与六步换相详解 1. 无刷电机驱动基础认知 无刷直流电机&#xff08;BLDC&#xff09;凭借高效率、长寿命和低噪音特性&#xff0c;已成为工业自动化、消费电子和智能家居领域的核心动力元件。与传统有刷电机相比&#xff0c;BL…...

从逻辑门到加法器:Verilog实现半加器与全加器的三种抽象层级

1. 项目概述&#xff1a;从逻辑门到加法器的数字世界基石在数字电路和芯片设计的入门路上&#xff0c;加法器是一个绕不开的经典课题。它不仅是算术逻辑单元&#xff08;ALU&#xff09;的核心组件&#xff0c;更是理解数字系统如何执行基本运算的关键。今天&#xff0c;我们不…...

SyncedStore深度解析:揭秘CRDT技术如何实现无冲突数据同步

SyncedStore深度解析&#xff1a;揭秘CRDT技术如何实现无冲突数据同步 【免费下载链接】SyncedStore SyncedStore CRDT is an easy-to-use library for building live, collaborative applications that sync automatically. 项目地址: https://gitcode.com/gh_mirrors/sy/Sy…...

终极指南:SwiftUI-experiments中的粒子动画实现技巧与实战教程

终极指南&#xff1a;SwiftUI-experiments中的粒子动画实现技巧与实战教程 【免费下载链接】SwiftUI-experiments Examples with SwiftUI and other Apple frameworks that showcase various interactions, animations and more 项目地址: https://gitcode.com/gh_mirrors/sw…...

告别风扇噪音与高温:FanControl让你的Windows电脑安静又冷静

告别风扇噪音与高温&#xff1a;FanControl让你的Windows电脑安静又冷静 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trend…...