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

2023.9.6 Redis 的基本介绍

目录 Redis 的介绍 Redis 用作缓存和存储 session 信息 Redis 用作数据库 消息队列 消息队列是什么&#xff1f; Redis 用作消息队列 Redis 的介绍 特点&#xff1a; 内存中存储数据&#xff1a;奠定了 Redis 进行访问和存储时的快可编程性&#xff1a;支持使用 Lua 编写脚…...

2023-09-08力扣每日一题

链接&#xff1a; 2651. 计算列车到站时间 题意&#xff1a; 不看日期只看时间 解&#xff1a; &#xff1f; 实际代码&#xff1a; 还看&#xff01;你怎么肥四&#xff1f;int findDelayedArrivalTime(int arrivalTime, int delayedTime) {return (arrivalTimedelayed…...

adb-linux 调试桥

这里写自定义目录标题 摘要&#xff1a;一、简介二、adb使用参考连接 摘要&#xff1a; adb 可替代网络、串口等调试手段&#xff0c;可以方便的进行文件传输、终端登录等 一、简介 ADB的全称为Android Debug Bridge&#xff0c;即调试桥&#xff0c;方便调试设备或调试开发…...

入门人工智能 —— 使用 Python 进行文件读写,并完成日志记录功能(4)

入门人工智能 —— 使用 Python 进行文件读写&#xff08;4&#xff09; 入门人工智能 —— 使用 Python 进行文件读写打开文件读取文件内容读取整个文件逐行读取文件内容读取所有行并存储为列表 写入文件内容关闭文件 日志记录功能核心代码&#xff1a;完整代码&#xff1a;运…...

使用Caffeine实现帖子的缓存来优化网站的运行速度

导入依赖 <!-- https://mvnrepository.com/artifact/com.github.ben-manes.caffeine/caffeine --><dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.1.7</version>…...

Webpack5 搭建Vue项目(进阶版)

Webpack5 搭建Vue项目&#xff08;进阶版&#xff09; 提示&#xff1a;中间隔了好长时间&#xff0c;我胡汉三又回来继续更新了&#xff01;&#xff01;&#xff01;&#x1f602;&#x1f602;&#x1f602; 文章目录 Webpack5 搭建Vue项目&#xff08;进阶版&#xff09;前…...

论文阅读:Distortion-Free Wide-Angle Portraits on Camera Phones

论文阅读&#xff1a;Distortion-Free Wide-Angle Portraits on Camera Phones 今天介绍一篇谷歌 2019 年的论文&#xff0c;是关于广角畸变校正的。 Abstract 广角摄影&#xff0c;可以带来不一样的摄影体验&#xff0c;因为广角的 FOV 更大&#xff0c;所以能将更多的内容…...

力扣每日一题---207. 课程表

Problem: 207. 课程表 文章目录 解题方法复杂度Code 解题方法 y总的 Topsort 模板题 复杂度 时间复杂度: 添加时间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) Code class Solution {int res 0; public…...

在Kubernetes环境中有关Nginx Ingress与API Gateway的连接问题

文章目录 小结问题解决参考 小结 在Kubernetes环境中是通过Nginx Ingress来从外部访问Kubernetes内部的环境&#xff0c;并用API Gateway来分发请求&#xff0c;碰到了 502 Bad gateway.的问题&#xff0c;并尝试解决。 问题 从外部通过Nginx Ingress访问Kubernetes内部的环…...

c语言练习44:深入理解strstr

深入理解strstr strstr作用展示&#xff1a; #include <stdio.h> #include <string.h> int main() {char str[] "This is a simple string";char* pch;pch strstr(str, "simple");/*strncpy(pch, "sample", 6);*/printf("%s…...

如果我的网站被百度收录了_以后如何做更新争取更多收录/网址导航该如何推广

父元素添加 font-size:0px; line-height:0px; overflow:hidden; 转载于:https://www.cnblogs.com/lweiruil/p/4505099.html...

北京做网站建设的公司/马鞍山seo

1 本机PySpark环境配置 2 PyCharm配置Python解释器 3 应用入口&#xff1a;SparkContext 4 WordCount代码实战 5 代码结果解析 6 从HDFS读取数据 7 提交代码到集群执行 8 总结 1 Python语言开发Spark程序步骤&#xff1f; 主要是获取SparkContext对象,基于SparkContext对象作为…...

网站为什么被挂马/seo快排

分组查询 一、语法 select 分组函数&#xff0c;分组后的字段 from 表 【where 筛选条件】 group by 分组的字段 【having 分组后的筛选】 【order by 排序列表】 二、特点 使用关键字 筛选的表 位置 分组前筛选 where 原始表 grou…...

青年汇网站开发公司/百度搜索一下

通常SPI通过4个引脚与外部器件相连&#xff1a; MISO&#xff1a;主设备输入/从设备输出引脚。 MOSI&#xff1a;主设备输出/从设备输入引脚 SCK&#xff1a;串口时钟&#xff0c;作为主设备的输出&#xff0c;从设备的输入 NSS&#xff1a;从设备选择。这是一个可选的引脚…...

售房网站模板/广告推送平台

文章来源:第八军团收集整理 发布时间:2005-11-17 15:55:45 202.112.0.0 —— 202.112.31.0 CERBKB-CN China Education and Research Netwo 3 2202.112.32.0 —— 202.112.39.0 BJCOMP-CN CERNET super computer center 8202.112.40.0 —— 202.112.47.0 SHCOMP-CN CERNET …...

网站规划的内容/qq营销推广方法和手段

3.1功能界面的组件化编码流程(组件拆分思想) 拆分组件:拆分界面,抽取组件实现静态组件,使用组件实现静态页面效果时间动态组件 3.1 动态显示初始化数据 3.11数据类型 3.12数据名称 3.13保存在那个组件? 3.2交互(从绑定事件监听开始) 3.2组件的组合使用-TodoList 功能:组件化…...