作为一个系列,下面在介绍完什么要使用 patroni 以及为什么选择 etcd后, 今天就开始需要安装patroni , 由于patroni 是一个基于python 的程序,这就与patroni的版本和 在本篇中的安装完成后,需要配置patroni 的配置文件, 在patroni 启动之前,需要将 POSTGRESQL 的三台机器进行相关的复制, 当然之前需要对postgresql 的pg_hba 一个 patroni /etc/patroni.yml > /pgdata/patroni.log 2>&1 & ? patronictl -c /etc/patroni.yml list ? 基本上patroni 的安装就完毕了, 但实际上一个软件的安装紧紧是开始使用这个软件的开始,并不是终结. Patroni 在被设计的之初就考虑了稳定和容错性, 避免了Brain-Split的问题 Patroni收集的所有数据都镜像在一个分布式键-值存储中,并且基于存储中提供的信息,所有的Patroni实例在决策上达成一致
作为关于Patroni 的第四篇文字, 总想有些深度, 那深度是从哪里而来,首先我们先从patroni 运行后,在系统中存储的键值入手. 首先根据patroni 的原理, 关键的配置数据尤其针对服务器中的数据是要存储在DCS 系统中的. 我们先通过etcd 的命令来查看我们目前ETCD本身的分布式的状态. ? 首先我们先确认我们的 etcd的版本, 这里需要说明的是ETCD 如果状态不正确,则postgresql patroni 的集群状态一定也是不正常的,所以对ETCD的一些基本操作也是必须的. ? 我们继续通过ETCD的接口获取members 中的内容,可以发现这里的内容(上图),与patroni 的工作状态有关, 如果patroni 在某个节点不在工作,则这里显示\"state\":\"stopped 下面找了一个官方的patroni.yaml 的例子来说说配置文件 scope: batman 集群的名字 ETCD 上显示 namespace: /service/ 集群配置信息在ETCD
PostgreSQL 的 Patroni 是一个系列, 目前已经写到了 4 , 实际我也不知道应该写到多少结束. ? 那这个软件的作者是谁 Alexander 和 Oleksii (其实有时候真该反思反思, MYSQL 的MHA 是日本人发明的, Postgresql Patroni 是德国人发明的, 当然还有 为什么要使用patroni ,对比目前的常用的高可用的方式存在的问题 1 提升一个复制节点时无响应的情况下,存在脑裂的可能 2 单一的monitor节点对于集群的监控缺陷以及失败节点必须被清理的问题 实际上到底Patrnoi 有没有一个简单的 introduce Patroni 是一个有 Zalando 研发的,完整由python 代码的开源产品,通过DCS来对postgresql 各个节点的状态进行判断 另外通过docker + K8S 部署patroni的方案也是有的,参见下图, 也是目前另一种更方便的并且适合大批量部署的方式. ?
目前Patroni 系列已经更新到了7 , 本次的重点在于看如何在Patroni的管理下,修改系统的配置参数. 首先我们在修改配置参数的情况下,确认几点的先行需要知道的知识 1 POSTGRESQL 本身的配置文件在PATRONI 生效后,不会在对服务器配置生效 2 在修改了Patroni 中的 POSTGRESQL patronictl -c /etc/patroni.yml show-config ? 在正确的配置中修改保存后,在patroni 的日志中,会显示下面的内容 ? patronictl -c /etc/patroni.yml show-config ? 我们注意星号,星号的位置是说明有有一些配置是需要重启动patroni 才能被执行的. 我们通过patroni 的命令来重启动机器,结束后相关的星号就会消失详见下图 ? ?
2.1 在主从节点安装 Patroni 及依赖 Patroni 需要依赖 ZK 客户端和 PostgreSQL 驱动,在 188 和 189 节点 执行: # 安装 Python 及 pip sudo ALTER ROLE postgres WITH PASSWORD 'your_super_password'; 在主节点(192.168.31.188)创建 Patroni 配置文件 /etc/patroni # Patroni 管理的复制槽 # 健康检查与 API 配置 restapi: listen: 0.0.0.0:8008 # Patroni API 监听端口 connect_address (从节点 189) 在从节点(192.168.31.189)创建 Patroni 配置文件 /etc/patroni/postgres.yml scope: pg_cluster # 集群名称(主从必须一致 # Patroni 管理的复制槽 # 健康检查与 API 配置 restapi: listen: 0.0.0.0:8008 # Patroni API 监听端口 connect_address
安装Patroni Patroni是一个管理Postgres配置的开源Python软件包。 它可以配置为处理复制,备份和恢复等任务。 它使用Patroni提供的REST端点来完成此操作。 Patroni确保在任何给定时间只有主Postgres节点显示为在线,强制HAProxy连接到正确的节点。 在Patroni的Github存储库中查看最新版本的postgres0.yml文件。 创建一个systemd脚本,允许您启动,停止和监视Patroni。 patroni安装在您计算机上/ usr / local / bin / patroni以外的位置,请相应地更新上述文件。 启动Patroni和Postgres: sudo systemctl start patroni 检查Patroni的状态: sudo systemctl status patroni 如果一切设置正确
前言 上篇文章中介绍了如何使用 Patroni + HAProxy + Keepalived + watchdog + ETCD 搭建高可用的 PostgreSQL 集群: 使用 Patroni + 数据库集群层:PostgreSQL + Patroni 实现数据高可用,实现毫秒级切换,使业务无感知。 分布式一致性:ETCD 集群提供一致性保障,防止集群出现脑裂的现象。 恢复处理流程如下: 故障检测 - Watchdog 检测到心跳超时 告警通知 - 通知管理员和监控系统 服务重启 - Systemd 重启 Patroni 服务 系统重启 - 内核 Watchdog 组件 Patroni 是 PostgreSQL 高可用架构的核心管家,基于 etcd 共识机制实现自动化的主备选举、故障检测与故障转移,实时监控数据库状态并维护集群配置一致性,协调主备节点的流复制同步 Patroni 流程架构图 dcs: ttl: 30 # Leader租约超时时间 loop_wait: 10 # 心跳发送间隔
本次学习的是 postgresql 的高可用方式 Patroni Patroni 本身并不是一个软件,而是一个模板通过python来构建一个高可用的postgresql的解决方案。 软件本身可以通过其他的分布式软件来进行支持( zookeeper, etcd 等),同时根据你选择的不同的模块来安装patroni. Patroni 本身使用的数据同步方式是postgresql的流复制方式,默认的情况我们还是使用异步的方式,在Patroni 中会有一个参数, Maximum_lag_on_failover ,通过设置 在patroni 的设置中,有三种方式,1 动态设置, 2 本地设置 3 环境设置,其中有一些设置在主库和从库之间必须保持一致,这些值在本地中的配置文件是不生效的。 而Patroni 使用的是 YAML的方式来进行配置的,所以这也就要求,配置文件的严谨性,例如多一个空格,少一个缩进,都是不可以的。
Patroni+HAProxy+Keepalived+watchdog+ETCD各组件原理前言上篇文章中介绍了如何使用Patroni+HAProxy+Keepalived+watchdog+ETCD搭建高可用的 数据库集群层:PostgreSQL+Patroni实现数据高可用,实现毫秒级切换,使业务无感知。分布式一致性:ETCD集群提供一致性保障,防止集群出现脑裂的现象。 心跳Patroni-PostgreSQL高可用管理器,发送心跳Systemd-服务管理器,处理服务重启LinuxKernel-内核Watchdog,提供硬件级保障Watchdog的心跳检测机制如下:心跳发送 :Patroni每10秒发送一次心跳心跳接收:Watchdog监控心跳状态超时检测:30秒超时触发恢复动作安全裕度:5秒缓冲时间Watchdog处理的故障场景包含:脑裂问题-多个主节点同时存在进程假死- :防止故障节点继续写入集群状态验证:与etcd集群状态对比数据一致性检查:验证WAL日志位置Patroni组件Patroni是PostgreSQL高可用架构的核心管家,基于etcd共识机制实现自动化的主备选举
所以 patroni 占用了不短的一个时间, 对比proxysql也是一样,那个系列也会持续. ? DCS or network issues shorter than this will not cause Patroni to demote the leader. 未了避免脑裂,Patroni 需要确认postgresql 不能在leader 键值在DCS过期后继续接受事务的commit, 在patroni 无法进行 leader lock后,则patroni 将开始试图停止 watchdog 的主要产生的原因是,如果patroni 无法在此刻关闭postgresql 怎么办? 因为patroni 也不是"孙悟空",也是人肉一枚, 如果由于各种原因导致patroni本身无法工作,watch dog 将尝试从新启动系统,如果工作后,无论怎样patroni还是无法正常工作,则watchdog
2 Patroni Patroni 本身起源于一个Governor 的分支,来自于一个compose 项目,在Zalando 中被改进的原来越好用。 Patroni确保PostgreSQL HA集群的端到端设置,包括流复制。它支持创建备用节点的各种方式,工作方式类似于模板,可以根据您的需要进行定制。 通过patroni 可以自动完成postgresql服务失败自动拉起,以及主从节点的切换和失败节点重新加入等功能。同时基于分布式存储的特性可以直接防止脑裂的发生。 通过上面的介绍,可以比对出二者不不同点 1 Patroni 本身是一个开源项目目前在Zalando 手里进行维护和发展 Repmgr 是PG 数据库开发公司2象限的产品,目前开源 2 Patroni 本身通过DCS 来进行数据节点的选主和高可用信息的存储,所以 选择分布式存储对 patroni本身来说是重要的。
Patroni8008:此端口用于Patroni的HTTP API-- 开放8008端口sudo firewall-cmd --zone=public --add-port=8008/tcp --permanent -- 查看patroni的版本# patroni --versionpatroni 4.1.0配置 PatroniPatroni 的配置各不相同,需要再每个节点上进行配置patroni的配置文件和patroni.service mdw 节点patroni.yml 配置文件配置[root@mdw ]# cat /etc/patroni.ymlscope: watchdogmycluster # 所有节点必须一致 查看 patroni 集群的运行状态可以在部署的 patroni 节点上运行以下的命令查看运行状态。 控制切换与心跳的核心参数以下是控制 patroni 的参数。
大家好我叫亚历山大.库是金,今天我给大家介绍的是patroni 3.0的一些新的规划和功能,主要有以下的一些议题,功能介绍,问题的修复,以及新的功能。 在之前的版本的PATRIONI 中有一个问题关于 DCS 导致的误切换的问题,DCS(Distributed configuration store) ,之前的版本的patroni 主要依赖DCS 来解决 但如果更新失败,则无法成为主节点,PG 会将主节点降级,为解决这个问题,我们引入了一个新的选项,failsafe_mode 他通过在DCS/config 中的全局动态配置进行启用,这里如果主节点可以通过patroni 在之前的版本,patroni 在更新状态前会等待postgres 被关闭,但基于PG的关闭在某些情况比较慢,而现在patroni 判断一个节点的关闭是通过pg_controldata 中打印出shut 另外我们也准备在patroni 中整合关于复制槽failover的部分,虽然patroni我们有了自己的解决方案,但是我们有一些问题没有解决,所以我们在后面要整合新的解决方案,来弥补我们自己的解决方案的问题
组件介绍 Patroni Patroni 是一个使用 Python 构建的高可用性(HA)PostgreSQL 的方案,Patroni 支持多种分布式配置存储,如 ZooKeeper、etcd、Consul /simple patroni -- 查看patroni的版本 # patroni --version patroni 4.1.0 配置 Patroni Patroni 的配置各不相同,需要再每个节点上进行配置 patroni的配置文件和patroni.service配置文件。 -- 加载配置文件 sudo systemctl daemon-reload -- 启动patroni sudo systemctl start patroni -- 查看patroni的运行状态 sudo 重新进行初始化patroni 查看 patroni 集群的运行状态 可以在部署的 patroni 节点上运行以下的命令查看运行状态。
3 停止patroni 在主节点的服务。 首先我们找到当前的主节点,当然也可以用patroni的命令,这里没有使用 当我们定位到集群中的主节点后,我们停止这个主节点的patroni的服务 在停止主节点的patroni的服务的一刻, 系统开始进行了切换 4 停止两个patroni 的服务 整个的系统出现问题,剩下的一个正常工作的patroni 系统报下图的信息 其他两个节点在重新启动了patroni后,也报类似的错误,整个集群的复制被终止, 同时发现两个关闭 服务,在主节点的服务后,故障转换开始,所以patroni的服务的启动时必须的,要保证其服务运行,否则主节的patroni 无法工作就会进行故障切换,当停止两个patroni 的服务,整体集群出现故障, 3 停止主数据库服务,patroni 会自动将数据库服务拉起来,如果直接停止主服务的服务器,则进行切换,在主服务器启动后,启动数据库服务,ETCD,patroni 后, 开始对失效的patroni 的曾经的主库进行
但Patroni 有一个问题,就是在patroni 服务本身失效的情况下,有可能会产生双主的问题,而更糟糕的是在patroni 在旧主节点再次生效下,一些在双主时期写入旧主的数据会通过pg_rewind 这点是一个硬伤,所以在使用patroni的时候,必须对patroni 服务本身进行严格的监控,同时必须配置一个靠谱的 VIP 服务及时切换,让应用写入新主。这个问题就基本上避免了。 从最上面的图看,patroni 在面对网络的抖动的方面要强于 repmgr, 这主要也是基于二者的高可用架构的不同,patroni 本身是建立在raft 协议,或者paxos 协议上的一个模板,(具体是 Patroni 优点 Patroni 启用的是一个端到端的服务支持REST APIS 对于二次开发是友好的,基于DSC 的概念,是一款具有分布式理念的高可用软件。 Patroni 问题: Patroni 本身是不会检测复制连接的状态,当主从的复制不工作的情况下,此节点还是会被展示成一个从库, 同时patroni的安装一直是一个比较复杂的问题,需要选择一款 DCS软件并且对此软件的工作原理和操作有比较深的使用知识
Etcd用于Patroni节点之间共享信息。Patroni监控本地的PostgreSQL状态。 Patroni的主备端是通过是否能获得 leader key 来控制的,获取到了leader key的Patroni为主节点,其它的为备节点。 其中Patroni不仅简单易用而且功能非常强大。 PG,pip3安装Patroni lhrpgpatroni73 172.72.6.73 PostgreSQL 13.3 + Patroni 2.1.2 备节点2,yum安装PG,pip3安装Patroni /app/patroni/etc/patroni_config.yml >> /app/patroni/log/patroni.log 2>&1 &" ExecReload=/bin/kill -s patroni.service systemctl status patroni.service # 因为 patroni 会检测 PostgreSQL 数据库是否正常运行,如果没有运行,会自动启动
是一个非常流行的使用面非常广的关系数据库,有很多种构建Postgres HA集群的方式,例如PAF,pgool等,以下将以CentOS7系统和PostgreSQL9.6版本为例,结合高可用虚拟IP(以下简称vip),patroni 整个集群架构如下: image.png 其中三个pg节点一主两从,使用patroni管理pg节点状态,使用etcd集群存储patroni元数据,每个节点通过pgbouncer管理本机的pg连接池,每个节点的 haproxy配置一致,都会代理三个pg实例,客户端请求通过keepalived管理的vip来访问pg,通过haproxy与patroni rest api配合,可以提供以下两个端口的服务: 5000端口 ,可从第三方获取现成的rpm:https://github.com/cybertec-postgresql/patroni-packaging/releases 安装pgbouncer,下载地址:http 配置:/etc/patroni/patroni.yml scope: pgcluster name: node1 namespace: /service/ log: level: INFO max_queue_size
以下是启动 Pgpool-II 的示例命令: pgpool -n -f /etc/pgpool2/pgpool.conf 3.2 Patroni Patroni 是一个用于管理 PostgreSQL 高可用性集群的开源工具 通过配置 Patroni,可以轻松管理 PostgreSQL 的复制节点,并在主节点故障时自动切换到备用节点。 Patroni:猫头虎 公司选择了 Patroni 作为故障转移工具,以确保主数据库故障时能够快速切换到备用节点。Patroni 使用 etcd 作为协调器,并能够在故障发生时自动触发切换操作。 自动故障转移的正确性:Patroni 虽然提供了自动故障转移功能,但需要确保配置正确并进行测试。猫头虎 公司定期进行演练和测试,以验证在主节点故障时自动切换的可行性。 参考资料 PostgreSQL官方文档:高可用章节 “Mastering PostgreSQL 12” by Hans-Jürgen Schönig Pgpool-II官方文档 Patroni官方文档
PostgreSQL 功能 使用 Spilo 12 或更旧的镜像 入门 支持的 Postgres 和应用程序设置 概念 作用域 所涉实体概述 状态 相关视频 相关文章 更多 Postgres Operator 在由 Patroni Patroni: https://github.com/zalando/patroni PostgreSQL: https://www.postgresql.org/ Operator 功能 Postgres Kind 本地运行良好 支持 AWS EBS gp2 到 gp3 迁移,支持 iops 和吞吐量配置 PostgreSQL 功能 支持 PostgreSQL 14,从 9.6+ 开始 通过 Patroni 作用域 Postgres Operator 的 scope 是提供、修改配置和清理使用 Patroni 的 Postgres 集群,基本上是为了在 K8s 上轻松方便地运行基于 Patroni 的集群。 我们尽量把工作留给 K8s 和 Patroni,尤其是集群引导和高可用性。不过,operator 需要参与一些总体编排,比如滚动更新以改善用户体验。