Linux|centos7|postgresql数据库主从复制之异步还是同步的问题

news2024/11/27 6:18:10

前言:

postgresql数据库是一个比较先进的中型关系型数据库,原本以为repmgr和基于repmgr的主从复制是挺简单的一个事情,但现实很快就给我教育了,原来postgresql和MySQL一样的,也是有异步或者同步的复制区别的

PostgreSQL直到目前版本(截至2024年4月)并未内置原生的半同步复制功能,不像MySQL那样有明确的半同步复制选项。然而,PostgreSQL提供了两种复制模式,分别是异步复制和同步复制:

  1. 异步复制:这是PostgreSQL默认的复制模式,主节点在事务提交时不等待备节点确认,备节点通过流复制接收并应用主节点的WAL日志。

  2. 同步复制:在PostgreSQL中,可以通过设置synchronous_commit参数和synchronous_standby_names参数来实现一定程度的同步复制。当synchronous_commit设置为on时,主节点在提交事务时会等待至少一个备节点确认收到WAL记录。通过synchronous_standby_names可以指定至少有多少个备节点必须确认,或者指定特定备节点名称。

尽管严格意义上的“半同步”概念在PostgreSQL中没有直接对应的实现,但通过上述配置可以模拟近似的效果,即在某种程度上平衡数据一致性与性能。然而,这种同步复制并不是真正的“半同步”,因为它要么是等待所有指定的备节点确认(同步),要么是不等待任何备节点确认(异步)。

这里的意思是一主多从(从数量至少为2),可以指定单独的某个或者多个从的synchronous_standby_names而不是所有的从节点,没有指定的从节点自然就是在异步复制模式,这样就实现了异步和同步复制的混合

一,

查询主从是哪种复制模式

本例中我只有两个postgresql服务器组成的主从,主节点是192.168.123.17,从节点是192.168.123.20,主从是基于repmgr搭建的

repmgr高可用搭建见上一篇博客:Linux|centos7-postgresql数据库|yum安装数据库和配置repmgr高可用集群以及repmgr的日常管理工作-CSDN博客

查询方法1

主节点执行以下命令查询,该命令是直接读取postgresql的主配置文件,根据配置文件的内容返回内容的:

SELECT name, setting, unit FROM pg_settings WHERE name IN ('synchronous_commit', 'synchronous_standby_names');

输出如下:

此时这两个值有内容表示是同步复制,否则为异步复制

查询方法2

这个命令也是比较准确的:

select sync_state from pg_stat_replication;

输出为sync,表示是同步复制,否则为异步模式,如果有多个值表示混合复制模式

查询方法3

通过pg_controldata命令,Latest checkpoint location,Latest checkpoint's REDO location, Latest checkpoint's oldestXID这三个值都一模一样表示是同步复制,否则是异步复制

主节点:

[root@centos7 ~]# pg_controldata 
pg_control version number:            1201
Catalog version number:               201909212
Database system identifier:           7351900556498275811
Database cluster state:               in production
pg_control last modified:             Wed 03 Apr 2024 06:32:04 AM CST
Latest checkpoint location:           0/B9000028
Latest checkpoint's REDO location:    0/B9000028
Latest checkpoint's REDO WAL file:    0000000600000000000000B9
Latest checkpoint's TimeLineID:       6
Latest checkpoint's PrevTimeLineID:   6
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID:          0:458006
Latest checkpoint's NextOID:          303174
Latest checkpoint's NextMultiXactId:  1
Latest checkpoint's NextMultiOffset:  0
Latest checkpoint's oldestXID:        479
Latest checkpoint's oldestXID's DB:   1
Latest checkpoint's oldestActiveXID:  0
Latest checkpoint's oldestMultiXid:   1
Latest checkpoint's oldestMulti's DB: 1
Latest checkpoint's oldestCommitTsXid:0
Latest checkpoint's newestCommitTsXid:0
Time of latest checkpoint:            Wed 03 Apr 2024 06:32:04 AM CST
Fake LSN counter for unlogged rels:   0/3E8
Minimum recovery ending location:     0/0
Min recovery ending loc's timeline:   0
Backup start location:                0/0
Backup end location:                  0/0
End-of-backup record required:        no
wal_level setting:                    logical
wal_log_hints setting:                on
max_connections setting:              1000
max_worker_processes setting:         8
max_wal_senders setting:              10
max_prepared_xacts setting:           0
max_locks_per_xact setting:           64
track_commit_timestamp setting:       off
Maximum data alignment:               8
Database block size:                  8192
Blocks per segment of large relation: 131072
WAL block size:                       8192
Bytes per WAL segment:                16777216
Maximum length of identifiers:        64
Maximum columns in an index:          32
Maximum size of a TOAST chunk:        1996
Size of a large-object chunk:         2048
Date/time type storage:               64-bit integers
Float4 argument passing:              by value
Float8 argument passing:              by value
Data page checksum version:           0
Mock authentication nonce:            e76af00554364729517eece5fa0fcf6f7f0662da3a154cabb730c2ab24edd267

从节点:

pg_control version number:            1201
Catalog version number:               201909212
Database system identifier:           7351900556498275811
Database cluster state:               in archive recovery
pg_control last modified:             Wed 03 Apr 2024 06:30:41 AM CST
Latest checkpoint location:           0/B8000028
Latest checkpoint's REDO location:    0/B8000028
Latest checkpoint's REDO WAL file:    0000000600000000000000B8
Latest checkpoint's TimeLineID:       6
Latest checkpoint's PrevTimeLineID:   6
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID:          0:458006
Latest checkpoint's NextOID:          303174
Latest checkpoint's NextMultiXactId:  1
Latest checkpoint's NextMultiOffset:  0
Latest checkpoint's oldestXID:        479
Latest checkpoint's oldestXID's DB:   1
Latest checkpoint's oldestActiveXID:  0
Latest checkpoint's oldestMultiXid:   1
Latest checkpoint's oldestMulti's DB: 1
Latest checkpoint's oldestCommitTsXid:0
Latest checkpoint's newestCommitTsXid:0
Time of latest checkpoint:            Wed 03 Apr 2024 06:30:35 AM CST
Fake LSN counter for unlogged rels:   0/3E8
Minimum recovery ending location:     0/B80000A0
Min recovery ending loc's timeline:   6
Backup start location:                0/0
Backup end location:                  0/0
End-of-backup record required:        no
wal_level setting:                    logical
wal_log_hints setting:                on
max_connections setting:              1000
max_worker_processes setting:         8
max_wal_senders setting:              10
max_prepared_xacts setting:           0
max_locks_per_xact setting:           64
track_commit_timestamp setting:       off
Maximum data alignment:               8
Database block size:                  8192
Blocks per segment of large relation: 131072
WAL block size:                       8192
Bytes per WAL segment:                16777216
Maximum length of identifiers:        64
Maximum columns in an index:          32
Maximum size of a TOAST chunk:        1996
Size of a large-object chunk:         2048
Date/time type storage:               64-bit integers
Float4 argument passing:              by value
Float8 argument passing:              by value
Data page checksum version:           0
Mock authentication nonce:            e76af00554364729517eece5fa0fcf6f7f0662da3a154cabb730c2ab24edd267

 

二,

设置复制为同步模式(不设置自然的就是默认模式了)

首先检查postgresql.auto.conf 这个文件,看primary_conninfo的值里有没有包含application_name 这样的字样,如果有就是同步复制模式,否则就是异步复制模式

查看此配置文件的原因是有些时候某些操作会自动写此文件,而该文件的优先等级又非常的高,也就是此文件里又的内容会生效,不管postgresql.conf 里写了什么都没用,这个文件内的配置是必定生效

如果没有application_name,那么是异步复制模式,此时需要更改postgresql.conf,主要是以下两个配置项:

synchronous_commit ,该选项有多个值,一般是使用remote_write

synchronous_commit 参数在PostgreSQL中用于控制事务提交时对同步复制的要求级别。它的设置可以根据对数据一致性和性能的不同需求进行调整。以下是几个常见的设置值:

  1. on: 这是最保守的设置,意味着在事务提交时,主节点会等待所有已知的同步备节点确认WAL记录已写入磁盘。这对于要求最高数据一致性的场景是理想选择,但可能会降低写入性能。

  2. remote_write: 这个设置意味着主节点只需要等待至少一个同步备节点将WAL记录写入其操作系统缓存即可,不需要确认数据已落到磁盘。相比onremote_write减少了等待时间,但增加了在备节点未将缓存写入磁盘前发生故障导致数据丢失的风险。

  3. remote_apply: 更进一步,设置为remote_apply时,主节点不仅等待备节点写入WAL记录,还需要等待备节点将事务应用到数据库中。这是最高的同步复制一致性级别,但也是性能影响最大的设置。

  4. off: 这个设置禁用了同步复制,主节点在事务提交时不等待任何备节点的反馈,此时所有的备节点都变成异步复制,主节点的写入性能最高,但数据安全性最低,这个是默认设置,也就是默认是异步复制

  5. local:这个设置表示事务仅在本机提交就可以了,不管是否同步到了从节点

选择哪种设置取决于业务需求和容忍的数据丢失风险。在repmgr管理的PostgreSQL集群中,通常会根据业务需求权衡数据安全性与性能来选择合适的synchronous_commit设置。如果需要较高数据一致性且备节点足够可靠,remote_write可能是一个常用的选择,但仍需结合具体应用场景分析。

synchronous_commit = remote_write       # synchronization level;
                                        # off, local, remote_write, remote_apply, or on
#wal_sync_method = fsync                # the default is the first option
                                        # supported by the operating system:
                                        #   open_datasync
                                        #   fdatasync (default on Linux)
                                        #   fsync
                                        #   fsync_writethrough
                                        #   open_sync

synchronous_standby_names

synchronous_standby_names = '*' # standby servers that provide sync rep
                                # method to choose sync standbys, number of sync standbys,
                                # and comma-separated list of application_name
                                # from standby(s); '*' = all

如何知道这个该写哪个呢?如果有多个从节点,不希望全部是同步复制,只希望指定的是同步复制模式,很简单,下面的SQL语句查询就可以,第三个:

select * from pg_stat_replication;

repmgr的主配置文件里也有,例如node_name='pg2' ,这个是从节点的repmgr的主配置文件;如果希望全部都是同步复制模式(多从节点的时候),那么简单的一个星号就可以了

这两个配置选项设置好后,就可以重启主节点,让同步复制生效了

小结:

postgresql.confpostgresql.auto.conf这两个配置文件里的配置要一致,不要一个是同步复制,一个是异步复制,那样可能会造成混乱,有的时候会使主库暂停服务。而同步复制可以提高数据安全,因为时时刻刻主从的数据都是一致的嘛,但这也是一个双刃剑,如果从库挂了或者由于网络,从库磁盘等等问题,导致同步复制会进行不下去,那么,主库可能要hang住

在同步复制的环境中,如果一个从库(备库)挂了,其对主库(源库)的影响取决于具体采用的同步策略:

  1. 对于全同步复制(MySQL中并没有原生的全同步复制,这里假设是一种所有从库都需确认的极端情况),如果任何从库不可用,则主库无法执行新的事务直至从库恢复在线。这意味着主库将暂停对外服务,因为它在等待所有从库确认事务,这种情况下系统的可用性大大降低。

  2. 对于半同步复制(MySQL的Semi-Synchronous Replication),主库在执行完事务后至少等待一个从库确认才会返回成功给客户端。在这种情况下,如果唯一的半同步从库挂了,主库会等待超时(默认是几秒钟,可通过rpl_semi_sync_master_timeout参数调整)后变为异步模式继续服务,以免阻塞事务提交。这样,虽然不会像全同步那样立刻导致主库无法服务,但如果长期缺少半同步从库,数据安全性则退化为异步复制级别。

  3. 对于一般的异步复制环境,从库挂了并不会直接影响主库的服务,主库仍然可以接收并执行新的事务,只是这部分未被已挂掉从库同步的事务在从库恢复前不会出现在从库上。

总结来说,在同步复制的场景下,从库挂掉会导致以下几种可能影响:

  • 全同步复制:主库事务处理阻塞,系统整体可用性下降。
  • 半同步复制:主库可能会有短暂延迟,然后转为异步模式,数据安全性减弱但不影响服务可用性。
  • 异步复制:主库不受影响,但从库上的数据将落后于主库,直到从库重新上线并恢复同步。

在异步复制的场景中,如果一个从库(备库)挂了,对主库(源库)的影响相对较小:

  1. 主库操作不受影响:主库会继续处理客户端的读写请求,事务提交不会因为从库的离线而延迟或阻止。异步复制的特点是主库在接收到事务提交请求后,无需等待从库确认就返回给客户端事务已提交,因此主库本身的性能和可用性不受从库状态影响。

  2. 数据一致性:从库挂掉时,这段时间内主库产生的新的事务不会立即同步到该从库,因此该从库的数据会落后于主库,直至从库恢复并完成同步。

  3. 高可用性和灾备:如果主库发生故障,由于从库未能及时跟上主库的数据,可能无法立即作为新的主库接管服务,除非你能接受一定的数据丢失。在高可用性场景下,通常会配置多个从库,其中一个或多个从库作为潜在的故障切换候选,以减少单个从库故障带来的风险。

  4. 监控与恢复:从库挂掉时,需要及时检测并恢复从库服务,以确保后续能够继续进行复制,保持数据的一致性和满足灾备需求。

总之,在异步复制中,从库挂掉不会直接影响主库的工作,但会影响整个集群的数据一致性、高可用性和灾备能力,因此需要及时监控和处理从库故障。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1565089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql语句学习

SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据; (先join在on) 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算&a…

5.vector容器的使用

文章目录 vector容器1.构造函数代码工程运行结果 2.赋值代码工程运行结果 3.容量和大小代码工程运行结果 4.插入和删除代码工程运行结果 5.数据存取工程代码运行结果 6.互换容器代码工程运行结果 7.预留空间代码工程运行结果 vector容器 1.构造函数 /*1.默认构造-无参构造*/ …

基于Java的商城网站系统设计与实现:Spring Boot后端与Vue.js前端

本文介绍了如何利用Java的Spring Boot框架和Vue.js技术构建一个商城网站系统。通过采用B/S结构,后端使用Spring Boot进行开发,前端采用Vue.js进行开发,实现了系统的设计与实现。 随着电子商务的兴起,商城网站成为了现代人购物的主…

网络安全 | 什么是DDoS攻击?

关注WX:CodingTechWork DDoS-介绍 DoS:Denial of Service,拒绝服务。DDoS是通过大规模的网络流量使得正常流量不能访问受害者目标,是一种压垮性的网络攻击,而不是一种入侵手段。NTP网络时间协议,设备需要…

【图像分割】nnUnetV1与V2的Linux部署与应用命令

以前觉得麻烦,一直没用过nnunet,虽然知道它很火,最近一个契机,部署使用了一下nnunet,记录一下其部署和使用的方法与命令。 1、部署 首先,我有一个环境,这个环境可以是以前就有的,也可…

左值与右值,以及c++11的相关特性。

目录 左值 右值 左值引用总结: 右值引用总结: 右值引用使用场景和意义: 1、左值引用的使用场景: 编译器优化1: 2、移动构造与移动赋值: 3、右值引用的使用场景: 编译器优化2&#xff1a…

Qt_Note20_QML_自定义Grid控件与OpacityMask的使用

import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtGraphicalEffects 1.14Window {visible: truewidth: 640height: 480title: qsTr("Hello World")// 自定义Grid控件与OpacityMask的使用Grid {id: gridwidth: 15height: 200co…

SQL语句学习+牛客基础39SQL

什么是SQL? SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。 SQL 的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。 SQL语法 数据库表 一个…

Autosar-从0到1构建Autosar最小系统(免费)-1

1建立Ecu最小系统 1.1Ecu最小系统组成 Ecu最小系统至少需要:SWC、Com、ComM、EcuM、BswM、Os、RTE等。 Autosar各模块的配置以arxml文件形式保存,因此生成以上模块需要以下各个arxml文件。 模块 所需的arxml文件 准备好以上arxml文件后,就可…

python核心篇之桌面程序

推荐使用: wxPython 一. 安装wxPython 二. 第一个wxPython程序 展示 代码 # coding: utf-8import wx# 创建应用程序对象 app wx.App() # 创建窗口对象 frame wx.Frame(None, title"Hello World", size(300, 200), pos(100, 100)) # 显示窗口 frame.Show() # 进入主…

【Spring实战项目】SpringBoot3整合WebSocket+拦截器实现登录验证!从原理到实战

🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…

CV论文--2024.4.3

1、Style Aligned Image Generation via Shared Attention 中文标题:共享注意力下的风格对齐图像生成 简介:大规模文本到图像(T2I)模型在创意领域迅速崭露头角,可以从文本提示中生成视觉上引人入胜的输出。然而&#…

【卫星家族】 | 高分六号卫星影像及获取

1. 卫星简介 高分六号卫星(GF-6)于2018年6月2日在酒泉卫星发射中心成功发射,是高分专项中的一颗低轨光学遥感卫星,也是我国首颗精准农业观测的高分卫星,具有高分辨率、宽覆盖、高质量成像、高效能成像、国产化率高等特…

C语言 | Leetcode C语言题解之第8题字符串转换整数atoi

题目&#xff1a; 题解&#xff1a; int myAtoi(char * s){int i0;int out0;int pol1;int lenstrlen(s);if(len0) return 0;while(s[i] ) i; //删除空格if(s[i]-){ //判断正负pol-1;i;}else if(s[i]){pol1;i;}else{pol1;}while(s[i]!\0){if(s[i]<0||s[i]>9){ /…

【Turtle】海龟先生

什么是编程 计算机只懂0和1这样的语言&#xff0c;可是我们不懂&#xff0c;当我们希望 计算要能帮我们做事情的时候&#xff0c;该怎么办呢&#xff1f; 我们需要一种更简便的方法告诉计算机要做什么&#xff0c;所以人类发明了编程语言 利用计算机编程语言&#xff0c;我们…

Transformer - 注意⼒机制

Transformer - 注意⼒机制 flyfish 计算过程 flyfish # -*- coding: utf-8 -*-import torch import torch.nn as nn import torch.nn.functional as F import os import mathdef attention(query, key, value, maskNone, dropoutNone):# query的最后⼀维的⼤⼩, ⼀般情况下就…

动态规划详解(Dynamic Programming)

目录 引入什么是动态规划&#xff1f;动态规划的特点解题办法解题套路框架举例说明斐波那契数列题目描述解题思路方式一&#xff1a;暴力求解思考 方式二&#xff1a;带备忘录的递归解法方式三&#xff1a;动态规划 推荐练手题目 引入 动态规划问题&#xff08;Dynamic Progra…

QT背景介绍

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、QT背景 1.1什么是QT 1.2QT的发展历史 1.3什么是框架、库 1.4QT支持的平台 1.5QT的优点 1.6QT的…

分布式锁 — Redisson 全面解析!

前言 分布式锁主要是解决集群&#xff0c;分布式下数据一致性的问题。在单机的环境下&#xff0c;应用是在同一进程下的&#xff0c;只需要保证单进程多线程环境中的线程安全性&#xff0c;通过 JAVA 提供的 volatile、ReentrantLock、synchronized 以及 concurrent 并发包下一…

JVM_垃圾收集器

GC垃圾收集器 文章目录 GC垃圾收集器GC垃圾回收算法和垃圾收集器关系GC算法主要有以下几种四种主要的垃圾收集器SerialParallelCMSG1垃圾收集器总结查看默认垃圾收集器 默认垃圾收集器有哪些各垃圾收集器的使用范围部分参数说明 新生代下的垃圾收集器并行GC(ParNew)并行回收GC&…