PG高可用学习@2
目录标题
- 一、Patroni 支持在同步复制下备库故障时自动降级为异步复制?
- 参考依据
- 1. PostgreSQL 官方文档
- 2. Patroni 官方文档
- 3. 高可用和容错设计原则
- 二、patroni 是如何检测备库故障的?
- 1. 心跳机制
- 2. 监控数据库进程状态
- 3. 查询系统视图
- 4. 复制延迟监测
- 5. 网络连接测试
- 三、动态配置设置
一、Patroni 支持在同步复制下备库故障时自动降级为异步复制?
synchronous_commit
synchronous_mode
synchronous_standby_names
备库优先级别
模拟故障
同步备库从1-0切换到2-0
当 synchronous_commit
设置为 on
时,PostgreSQL 主库会等待至少一个同步备库确认接收到事务日志后才会向客户端返回事务提交成功的信息。如果备库挂掉,主库就会一直等待,导致卡住。Patroni 是一个用于管理 PostgreSQL 高可用集群的工具,它支持将同步复制降级为异步复制,以解决主库卡住的问题。
根据 Patroni 官方文档,Patroni 使用 PostgreSQL 的流复制。默认情况下,Patroni 配置 PostgreSQL 为异步复制。选择复制模式取决于您的业务考虑。需要调查异步复制和同步复制,以及其他高可用性解决方案,以确定哪种解决方案最适合您的需求。在异步复制模式下,集群被允许丢失一些已提交的事务,以确保可用性。当主服务器失败或因其他任何原因变得不可用时,Patroni 将自动提升一个足够健康的备用服务器为主服务器。任何尚未复制到备用服务器的事务都保留在主服务器上的“分叉时间线”中,并且实际上是可恢复的。
要启用 PostgreSQL 的同步复制,可以在 Patroni 的 YAML 配置文件中的 parameters
部分添加以下行:
synchronous_commit: "on"
synchronous_standby_names: "*"
启用同步复制后,使用至少三个 Postgres 数据节点以确保写入可用性,如果一个主机失败。使用 PostgreSQL 同步复制并不保证在所有情况下都不会丢失事务。当主服务器和当前作为同步副本的服务器同时失败时,可能会提升一个不包含所有事务的第三个节点。
Patroni 的 synchronous_mode
可以在运行时通过 patronictl edit-config
命令或通过 Patroni REST 接口开启或关闭。有关动态配置的说明,请参见 Patroni 官方文档。开启 synchronous_mode
并不保证在所有情况下都能实现多节点提交的持久性。当没有合适的备用服务器可用时,主服务器仍然会接受写入,但不保证它们的复制。当主服务器以这种模式失败时,不会提升任何备用服务器。当主机重新上线时,它将自动被提升,除非系统管理员执行了手动故障转移。这种行为使得同步模式适用于具有两个节点的集群集。
当 synchronous_mode
打开且备用服务器崩溃时,提交将阻塞,直到下一次迭代的 Patroni 运行并切换主服务器到独立模式(在最坏情况下,写入延迟为 ttl
秒,平均情况下为 loop_wait
/2 秒)。手动关闭或重新启动备用服务器不会导致提交服务中断。备用服务器将在 PostgreSQL 关闭之前向主服务器发出信号,以释放其同步备用职责,然后 PostgreSQL 关闭。
如果需要保证每个写入都持久地存储在至少两个节点上,请启用 synchronous_mode_strict
以及 synchronous_mode
。此参数会阻止 Patroni 在没有同步备用候选时关闭主服务器上的同步复制。缺点是,主服务器在没有同步副本候不可写入(除非 Postgres 事务显式关闭 synchronous_mode
),这会阻塞所有客户端写入请求,直到至少有一个同步副本可用。
您可以通过设置 nosync
标签为 true
来确保备用服务器永远不会成为同步备用。这对于通过网络连接缓慢且可能导致性能下降的备用服务器,建议设置此标签。将标签 nostream
设置为 true
也将产生相同的效果。
参考依据
1. PostgreSQL 官方文档
PostgreSQL 官方文档详细解释了 synchronous_commit
参数的作用和不同取值的含义。当 synchronous_commit
设置为 on
时,主库会严格等待同步备库的确认,这可能导致在备库故障时主库卡住。而将其设置为 off
可以让主库在提交事务时不等待备库确认,实现异步复制。
2. Patroni 官方文档
Patroni 官方文档提供了关于如何通过修改配置文件来调整 PostgreSQL 参数的详细说明。我们可以通过修改 patroni.yml
文件中的 postgresql.parameters
部分来动态调整 synchronous_commit
参数,以适应不同的集群状态。
3. 高可用和容错设计原则
在高可用集群设计中,当同步备库出现故障时,将同步复制降级为异步复制是一种常见的容错策略。这样可以确保主库在备库故障时仍然能够继续处理事务,避免因等待备库确认而导致系统卡住,从而提高系统的可用性。
replication_modes
第10章 复制模式
二、patroni 是如何检测备库故障的?
Patroni 是一款用于管理 PostgreSQL 高可用集群的工具,它主要通过心跳机制、监控数据库进程状态、查询系统视图以及利用 PostgreSQL 内置的复制状态信息等方式来检测备库故障,以下为你详细介绍:
1. 心跳机制
- 原理:Patroni 基于 etcd、Consul 或 ZooKeeper 等分布式键值存储系统实现心跳机制。主库和备库会定期向这些存储系统写入自己的状态信息(心跳信息),包括节点的健康状况、角色(主库或备库)、当前时间戳等。
- 故障检测:Patroni 会持续监控这些心跳信息。如果某个备库在规定的时间内没有更新其心跳信息,Patroni 就会认为该备库可能出现故障。例如,设置的心跳间隔为 2 秒,超时时间为 10 秒,若备库超过 10 秒未更新心跳,Patroni 就会触发故障处理流程。
2. 监控数据库进程状态
- 进程检查:Patroni 会定期检查备库上的 PostgreSQL 进程是否正常运行。它可以通过操作系统命令(如
ps
命令)来查看 PostgreSQL 进程是否存在。 - 故障判定:如果在多次检查中都无法找到 PostgreSQL 进程,Patroni 会判定该备库出现故障。例如,每隔 5 秒检查一次,连续 3 次都未发现进程,就认为备库故障。
3. 查询系统视图
- 状态查询:Patroni 会在备库上执行 SQL 查询,通过查询 PostgreSQL 的系统视图来获取备库的状态信息。常用的系统视图包括
pg_stat_replication
(主库上查看复制状态)和pg_stat_wal_receiver
(备库上查看 WAL 接收状态)。 - 故障识别:如果查询结果显示备库的复制状态异常,如
pg_stat_wal_receiver
中的state
字段不是正常的streaming
状态,或者pg_stat_replication
中显示备库长时间没有接收或应用 WAL 日志,Patroni 会判断备库可能存在故障。
4. 复制延迟监测
- 延迟计算:Patroni 会监控备库与主库之间的复制延迟。通过比较主库和备库的 WAL 位置(如
pg_current_wal_lsn()
函数获取的日志序列号),计算出备库落后主库的日志量。 - 故障判断:如果复制延迟超过了预设的阈值,Patroni 会认为备库可能出现问题。例如,设定延迟阈值为 100MB,当备库落后主库的日志量超过 100MB 且持续一段时间(如 5 分钟),就判定备库故障。
5. 网络连接测试
- 连接尝试:Patroni 会定期尝试与备库建立网络连接,包括数据库连接和其他必要的通信连接。
- 故障确认:如果多次连接尝试都失败,Patroni 会认为备库可能由于网络问题或自身故障而无法正常响应,从而判定备库故障。例如,每隔 3 秒尝试连接一次,连续 5 次失败就触发故障处理。
三、动态配置设置
动态配置存储在DCS(分布式配置存储)中并应用于所有集群节点。
为了更改动态配置,您可以使用:ref:patronictl_edit_config 工具或 Patroni:ref:REST API <rest_api>
。
-
loop_wait:循环休眠的秒数。默认值:10,最小可能值:1
-
ttl:获取领导者锁的 TTL(以秒为单位)。可以将其视为启动自动故障转移过程之前的时间长度。默认值:30,最小可能值:20
-
retry_timeout:DCS 和 PostgreSQL 操作重试的超时时间(以秒为单位)。短于此时间的 DCS 或网络问题不会导致 Patroni 降级领导者。默认值:10,最小可能值:3
当改变 loop_wait、retry_timeout 或 ttl 的值时,必须遵循以下规则:
loop_wait + 2 * retry_timeout <= ttl
Dynamic Configuration Settings
相关文章:

PG高可用学习@2
目录标题 一、Patroni 支持在同步复制下备库故障时自动降级为异步复制?参考依据1. PostgreSQL 官方文档2. Patroni 官方文档3. 高可用和容错设计原则 二、patroni 是如何检测备库故障的?1. 心跳机制2. 监控数据库进程状态3. 查询系统视图4. 复制延迟监测5. 网络连接…...

centos 8和centos 9 stream x64的区别
以下是 CentOS 8 与 CentOS Stream 9 的主要区别,从技术架构、更新策略到适用场景等维度进行对比: AI产品独立开发实战营 联系我了解 1. 定位与更新策略 特性CentOS 8CentOS Stream 9定位原为 RHEL 8 的免费稳定复刻版RHEL 9 的上游开发分支ÿ…...

C++基础学习记录—类
1、面向对象的三大特征:封装、继承、多态 2、类和对象 2.1、类的概念 类:类是一个抽象的概念,用于描述同一类对象的特点。 对象:根据类的概念所创造的实体。 类中包含属性和行为 属性:描述类的数据,一…...

云原生时代的后端开发:架构、工具与最佳实践
随着云计算的迅猛发展,云原生(Cloud Native)逐渐成为后端开发的主流趋势。云原生后端不仅能够提高应用的灵活性和可扩展性,还能显著优化开发和运维流程。本文将围绕云原生后端的关键概念、当前热门技术及最佳实践,帮助…...

ARM Cortex-M3/M4 权威指南 笔记【一】技术综述
一、Cortex-M3/M4 处理器的一般信息 1.1 处理器类型 ARM Cortex-M 为 32 位 RISC(精简指令集)处理器,其具有: 32位寄存器32位内部数据通路32位总线接口 除了 32 位数据,Cortex-M 处理器(以及其他任何 A…...

12.项目结构
后端结构 ruoyi-admin 项目启动的入口 提供了两种启动方式 1.RuoYiApplication基于springboot,内置tomcat,直接运行。 2.RuoYiServletInitializer将springboot项目打成一个war包,用外置的servlet容器来运行。 通用功能的controller 后台登录相关的、权限控制相关的、数据字…...

保研考研机试攻略:python笔记(4)
🐨🐨🐨15各类查找 🐼🐼二分法 在我们写程序之前,我们要定义好边界,主要是考虑区间边界的闭开问题。 🐶1、左闭右闭 # 左闭右闭 def search(li, target): h = len(li) - 1l = 0#因为都是闭区间,h和l都可以取到并且相等while h >= l:mid = l + (h - l) // 2…...

高阶C语言|枚举与联合
💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习! 👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对C语言感兴…...

【天梯赛】L1-104 九宫格(C++)
易忽略的错误:开始习惯性地看到n就以为是n*n数组了,实际上应该是9*9的固定大小数组,查了半天没查出来 题面 L1-104 九宫格 - 团体程序设计天梯赛-练习集 代码实现 #include<bits/stdc.h> using namespace std; //易错:开…...

现代C++多线程基础 -忆苦思甜pthread_mutex
c 老古董 文章目录 c 老古董pthread_mutex概念常用apipthread_mutex_initpthread_mutex_lockpthread_mutex_trylockpthread_mutex_unlockpthread_mutex_destroy 案例 pthread_mutex 概念 互斥锁 mutex是一种简单的加锁的方法来控制对共享资源的访问,mutex只有两种…...

soular基础教程-使用指南
soular是TikLab DevOps工具链的统一帐号中心,今天来介绍如何使用 soular 配置你的组织、工作台,快速入门上手。  1. 账号管理 可以对账号信息进行多方面管理,包括分配不同的部门、用户组等,从而确保账号权限和职责…...

网络安全网格架构(CSMA) 网络安全框架csf
CSRF:Cross Site Request Forgy(跨站请求伪造) 用户打开另外一个网站,可以对本网站进行操作或攻击。容易产生传播蠕虫。 CSRF攻击原理: 1、用户先登录A网站 2、A网站确认身份返回用户信息 3、B网站冒充用户信息而不是直接获取用…...

基于DeepSeek API和VSCode的自动化网页生成流程
1.创建API key 访问官网DeepSeek ,点击API开放平台。 在开放平台界面左侧点击API keys,进入API keys管理界面,点击创建API key按钮创建API key,名称自定义。 2.下载并安装配置编辑器VSCode 官网Visual Studio Code - Code Editing…...

【AI时代】Page Assist - 本地 AI 模型的 Web UI (谷歌浏览器) 本地DeepSeek启用联网功能
Page Assist - 本地 AI 模型的 Web UI 一、部署本地模型 参考教程:https://blog.csdn.net/Bjxhub/article/details/145536134二、安装插件 Page Assist 浏览器谷歌商店搜索 Page Assist ,安装该插件。 注意:需要一点科学的魔法。 三、使用…...

电脑IP地址自定义
1.连接WIFI 2.打开控制面板 3.打开网络共享中心 4.选择想要修改的WIFI 点击连接的WIFI选择属性 点击要修改的配置协议IPV4/IPV6 设置IP地址为需要的地址...

python卷积神经网络人脸识别示例实现详解
目录 一、准备 1)使用pytorch 2)安装pytorch 3)准备训练和测试资源 二、卷积神经网络的基本结构 三、代码实现 1)导入库 2)数据预处理 3)加载数据 4)构建一个卷积神经网络 5࿰…...

EX_25/2/11
将 epoll 服务器 客户端拿来用 客户端: 写一个界面,里面有注册登录 服务器:处理注册和登录逻辑,注册的话将注册的账号密码写入数据库,登录的话查询数据库中是否存在账号,并验证密码是否正确 额外功能&a…...

二.2 整数表示(2.1-2.4)
在本节中,我们描述用位来编码整数的两种不同的方式:一种只能表示非负数,而另一种能够表示负数、零和正数。后面我们将会看到它们在数学属性和机器级实现方面密切相关。我们还会研究扩展或者收缩一个已编码整数以适应不同长度表示的效果。 图2…...

中间件-安装Minio-集成使用(ubantu-docker)
目录 1、安装docer 2、运行以下命令拉取MinIO的Docker镜像 3、检查当前所有Docker下载的镜像 4、创建目录 5、创建Minio容器并运行 6、SDK操作 FileUploader.java 1、安装docer 参考这篇:Linux安装Docker 2、运行以下命令拉取MinIO的Docker镜像 docker pull…...

夸克网盘多链接批量保存,自动同步更新,批量分享
最近夸克网盘有点火,好多资源都上夸克网盘了,做了一个夸克网盘的批量化程序,已经打包好了,不用配置代码环境就能用 夸克网盘工具:https://pan.quark.cn/s/c22f3451a6ab 百度网盘工具:https://pan.quark.cn…...

2025清华:DeepSeek从入门到精通.pdf(附下载)
本文是一份关于如何深入理解和使用DeepSeek技术的全面指南,由清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室的余梦珑博士后及其团队编撰。DeepSeek是一家中国科技公司,专注于通用人工智能(AGI)的研发,其开源推…...

【AIGC】在VSCode中集成 DeepSeek(OPEN AI同理)
在 Visual Studio Code (VSCode) 中集成 AI 编程能力,可以通过安装和配置特定插件来实现。以下是如何通过 Continue 和 Cline 插件集成 DeepSeek: 一、集成 DeepSeek 获取 DeepSeek API 密钥:访问 DeepSeek 官方网站,注册并获取 …...

android动态设置是否允许应用卸载
摘要:通过广播设置全局参数控制应用是否允许卸载,全局参数在Launcher和PackageInstaller两个模块中使用到。此功能可用于MDM后台控制是否允许设备卸载应用。 1. 静态注册广播 由于系统安装和卸载的功能集中在PackageInstaller模块中,为了更…...

基于微信小程序的博物馆预约系统的设计与实现
hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…...

使用NPOI自定义导出excel文件
说明 1、自定义列名,将从数据库查询到的数据赋值到对应的单元格上。 2、excel文件默认导出到桌面。 3、支持进度条显示。 界面 功能实现 public void TaskTest(){Task task new Task(ExportExcel);task.Start(); }/// <summary>/// 查询数据/// </summa…...

基于vue2 的 vueDraggable 示例,包括组件区、组件放置区、组件参数设置区 在同一个文件中实现
为了在Vue 2中实现一个包含组件区、组件放置区以及组件参数设置区的界面,我们可以使用vue-draggable库来处理拖拽功能,并结合其他UI组件库如Element UI来构建界面。下面是一个基本的示例,展示如何实现这样的布局。 第一步:安装必…...

使用rknn进行facenet部署
文章目录 开源仓库pth转onnxnetron可视化onnx转rknnC++实现开源仓库 https://github.com/bubbliiiing/facenet-pytorch pth转onnx 修改facenet网络的forward函数代码 修改前 def forward(self, x, mode = "predict"):if mode ==...

#渗透测试#批量漏洞挖掘#29网课交单平台 SQL注入
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 1. 漏洞原理 2. 漏洞定位 3. 攻击验证示…...

百问网imx6ullpro调试记录(linux+qt)
调试记录 文章目录 调试记录进展1.开发板相关1.1百问网乌班图密码 1.2 换设备开发环境搭建串口调试网络互通nfs文件系统挂载 1.3网络问题1.4系统启动1.5进程操作 2.QT2.1tslib1.获取源码2.安装依赖文件3.编译 2.2qt移植1.获取qt源码2.配置编译器3.编译 2.3拷贝到开发板1.拷贝2.…...

【python】3_容器
目录 一、列表 list 1.1基本语法 1.2 常用操作方法 1.3 列表的遍历 二、元组 tuple 特点: 三、字符串 常用操作方法: 四、序列 操作方法:切片 五、元素 特点: 基本语法: 集合常用功能: 六、字…...