基于patroni+etcd打造可自动故障转移的postgresql集群(代码片段)

PostgreSQLChina PostgreSQLChina     2023-01-14     735

关键词:

作者:杭州美创科技有限公司

得益于PostgreSQL的开源特性,越来越多的第三方集群管理软件填补了PostgreSQL在集群方面的易用性和可靠性,patroni+etcd提供了一系列的集群管理方案。etcd负责集群状态信息的存放,用来联系各个节点,patroni负责为集群提供高可用服务,两者的集合为PostgreSQL集群提供了故障转移的高可用服务,它不仅配置简单,而且功能丰富:

  • 支持手动和自动故障转移
  • 支持一主多从、级联复制
  • 支持同步、异步模式
  • 支持使用watchdog防止脑裂

前期准备

节点规划。实验过程我们使用一主两从构建一套高可用环境。

关闭主机防火墙

# systemctl stop firewalld.service
# systemctl disable firewalld.service

安装postgresql并搭建流复制环境(此步骤略)

在各个节点上部署etcd

安装必要的依赖包及etcd软件

# yum install -y gcc python-devel epel-release
# yum install -y etcd

编辑配置文件(以下列出了需要修改的参数,并以主节点为例)

# vim /etc/etcd/etcd.conf

#[Member]
ETCD_DATA_DIR="/var/lib/etcd/node1.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.22.128:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.22.128:2379,http://127.0.0.1:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.22.128:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.22.128:2379"
ETCD_INITIAL_CLUSTER="node1=http://192.168.22.128:2380,node2=http://192.168.22.129:2380, node3=http://192.168.22.130:2380"

启动etcd集群,并设置开机自启动

# systemctl start etcd
# systemctl enable etcd

在各个节点上部署python3

需要使用高版本的python来使用patroni服务,一般的linux环境内置了2.7版本的python环境,因此我们需要升级python,这里采用源码编译安装方式安装

# wget -c https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz
# ./configure
# make
# make install

删除原2.7版本的软连接,添加新的软链接以使用python3

# rm -f /usr/bin/python
# ln -s /usr/local/bin/python3 /usr/bin/python

在各个节点上部署patroni

安装必要的依赖包和patroni软件

# pip3 install psycopg2-binary -i https://mirrors.aliyun.com/pypi/simple/
# pip3 install patroni -i https://mirrors.aliyun.com/pypi/simple/

修改patroni配置文件(以主节点为例)

# vim /etc/patroni.yml

scope: pgsql
namespace: /pgsql/
name: pgsql_node2
 
restapi:
  listen: 192.168.22.128:8008
  connect_address: 192.168.22.128:8008
 
etcd:
  host: 192.168.22.128:2379
 
bootstrap:
  # this section will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster
  # and all other cluster members will use it as a `global configuration`
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    master_start_timeout: 300
    synchronous_mode: false
    postgresql:
      use_pg_rewind: true
      use_slots: true
      parameters:
        listen_addresses: "0.0.0.0"
        port: 5432
        wal_level: logical
        hot_standby: "on"
        wal_keep_segments: 100
        max_wal_senders: 10
        max_replication_slots: 10
        wal_log_hints: "on"
#        archive_mode: "on"
#        archive_timeout: 1800s
#        archive_command: gzip < %p > /data/backup/pgwalarchive/%f.gz
#      recovery_conf:
#        restore_command: gunzip < /data/backup/pgwalarchive/%f.gz > %p
 
postgresql:
  listen: 0.0.0.0:5432
  connect_address: 192.168.22.128:5432
  data_dir: /pgdata/patr2
  bin_dir: /usr/pgsql-12/bin
#  config_dir: /etc/postgresql/9.6/main
  authentication:
    replication:
      username: repl
      password: repl
    superuser:
      username: postgres
      password: postgres
 
#watchdog:
#  mode: automatic # Allowed values: off, automatic, required
#  device: /dev/watchdog
#  safety_margin: 5
 
tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false

配置patroni服务单元

# vim /etc/systemd/system/patroni.service 
[Unit]
Description=Runners to orchestrate a high-availability PostgreSQL
After=syslog.target network.target

[Service]
Type=simple
User=postgres
Group=postgres
#StandardOutput=syslog
ExecStart=/usr/local/bin/patroni /etc/patroni.yml
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=process
TimeoutSec=30
Restart=no

[Install]
WantedBy=multi-user.target

启动patroni服务

# systemctl start patroni

当然地,我们也可以直接使用patroni命令来启动patroni服务,配置服务单元是为了更方便使用。

#/usr/local/bin/patroni /etc/patroni.yml > patroni.log 2>&1 &

集群环境使用

查看节点信息

# patronictl -c /etc/patroni.yml list
+ Cluster: pgsql (6972099274779350082)+------+---------+----+-----------+
|   Member    |        Host         |  Role  |  State  | TL | Lag in MB |
+-------------+---------------------+--------+---------+----+-----------+
| pgsql_node1 | 192.168.22.128:5432 | Leader | running | 3  |           |
| pgsql_node2 | 192.168.22.129:5432 |        | running | 3  |      0    |
| pgsql_node3 | 192.168.22.130:5432 |        | running | 3  |      0    |
+-------------+---------------------+--------+---------+----+-----------+

手动切换主从,选择某一可用的从节点,使其成为主节点角色

# patronictl -c /etc/patroni.yml switchover
Master [pgsql_node1]: pgsql_node1
Candidate ['pgsql_node2', 'pgsql_node3'] []: pgsql_node2
When should the switchover take place (e.g. 2021-06-20T11:42 )  [now]: now

查看集群状态

# patronictl -c /etc/patroni.yml list
+ Cluster: pgsql (6972099274779350082)+------+---------+----+-----------+
|   Member    |        Host         |  Role  |  State  | TL | Lag in MB |
+-------------+---------------------+--------+---------+----+-----------+
| pgsql_node1 | 192.168.22.128:5432 |        | running | 3  |      0    |
| pgsql_node2 | 192.168.22.129:5432 | Leader | running | 3  |           |
| pgsql_node3 | 192.168.22.130:5432 |        | running | 3  |      0    |
+-------------+---------------------+--------+---------+----+-----------+

自动切换主从。重启node1节点所在主机。查看集群状态,node2自动提升为主,如果只是关闭节点实例,则patroni会再将数据库服务自动拉起。

# patronictl -c /etc/patroni.yml list
+ Cluster: pgsql (6972099274779350082)+------+---------+----+-----------+
|   Member    |        Host         |  Role  |  State  | TL | Lag in MB |
+-------------+---------------------+--------+---------+----+-----------+
| pgsql_node2 | 192.168.22.129:5432 | Leader | running | 3  |           |
| pgsql_node3 | 192.168.22.130:5432 |        | running | 3  |      0    |
+-------------+---------------------+--------+---------+----+-----------+

初始化某一节点。当某一节点与主库不同步,或者节点异常运行时,可以使用此方法初始化节点信息以重新加入集群。

# patronictl -c /etc/patroni.yml reinit pgsql
+ Cluster: pgsql (6972099274779350082)+------+---------+----+-----------+
|   Member    |        Host         |  Role  |  State  | TL | Lag in MB |
+-------------+---------------------+--------+---------+----+-----------+
| pgsql_node1 | 192.168.22.128:5432 |        | running | 3  |      0    |
| pgsql_node2 | 192.168.22.129:5432 | Leader | running | 3  |           |
| pgsql_node3 | 192.168.22.130:5432 |        | running | 3  |      0    |
+-------------+---------------------+--------+---------+----+-----------+
选择以下需要添加的节点名称:pgsql_node3
你确定要重新初始化成员 pgsql_node3?[y/N]:y
成功:为成员pgsql_node3执行初始化

patroni是基于python开发的模板,etcd集群是按照Raft算法和协议开发的,是一个强一致性的、分布式的key-value数据库。两者的结合相辅相成,使得PostgreSQL集群在使用和维护过程中变得更便捷、更透明。

从同步自动故障转移 AlwaysOn 可用性组 AAG 传送日志

】从同步自动故障转移AlwaysOn可用性组AAG传送日志【英文标题】:LogShippingfromSynchronousAutomaticFailoverAlwaysOnAvailabilityGroupAAG【发布时间】:2016-11-1013:53:43【问题描述】:我有一个使用同步提交和自动故障转移运行的AlwaysOn可用性组。... 查看详情

docker容器之patroni篇(代码片段)

...动切换,今天将向大家介绍,如何搭建容器下的Patroni集群环境,Patroni作为开箱即用PG高可用工具,越来越多的被各个厂商用于云环境下使用。patroni基本架构如图所示:etcd作为分布式注册中心、进行集群选主... 查看详情

(转)从0开始搭建sqlserveralwayson第二篇(配置故障转移集群)

...第二篇,主要讲述如何搭建故障转移集群,因为AlwaysOn是基于Windows的故障转移集群的 在讲解步骤之前需要了解一下故障转移集群仲裁配置下面图片来自《WindowsServer2012系统配置指南》四种集群的仲裁配置: 查看详情

patroni(代码片段)

作者:王志斌前言Patroni作为PG开箱即用的高可用解决方案,尤其在云端环境常作为首选,本文主要介绍如何部署Patroni集群,其特点归纳如下:易用性:模板化部署可用性:分布式一致性软件提供强一致... 查看详情

yarnyarnha高可用集群(代码片段)

...e/Standby模式的ResourceManagerHA架构。架构Hadoop官方推荐方案:基于Zookeeper集群实现YARNHA。实现HA集群的关键是:主备之间状态数据同步、主备之间顺利切换(故障转移机制)针对数据同步问题,可以通过zk来存储共享集群的状态数据。因为z... 查看详情

云原生第三周--kubernetes组件详解(代码片段)

...ey-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。etcd具有下面这些属性:完全复制:集群中的每个节点都可以使用完整的存档高可用性:Etcd可用于避免硬件的单点故障或网络问题一致性:每次读取都会... 查看详情

failoverswarm故障转移

#故障转移Failover#当其中一个节点关闭宕机时,其节点中的service会转移到另一个节点上。Swarm会检测到node1发生故障并把此故障节点的状态标记为Down;dockernodels可查看node1的STATUS为Down同时Swarm会把node1上的service调度到其它有资源的... 查看详情

kubernetes故障转移和自愈能力机制详解(代码片段)

...愈能力1.如何定义自愈能力2.Kubernetes中的自愈能力机制2.1自动滚动升级2.2自动扩缩容2.3自动容错2.4自动更新配置2.5自动修复3.Pod健康监控4.什么是Liveness和Readiness探针五.Kubernetes中的调试1.Kubernetes中的日志记录2.调试故障转移和自愈... 查看详情

检查自动故障转移是不是始终在可用性组上不起作用?

】检查自动故障转移是不是始终在可用性组上不起作用?【英文标题】:whattocheckifautomaticfailoverdoesnotworkonalwaysonavailabilitygroup?检查自动故障转移是否始终在可用性组上不起作用?【发布时间】:2017-04-1722:14:44【问题描述】:在我... 查看详情

SQL Server 可用性组自动故障转移不起作用

】SQLServer可用性组自动故障转移不起作用【英文标题】:SQLServerAvailabilityGroupAutomaticFailoverNotWorking【发布时间】:2015-01-1910:13:27【问题描述】:我有一个ASP.NETMVCWeb应用程序,它使用实体框架连接配置了高可用性的SQLServer2012。它... 查看详情

sqlserver2000故障转移群集

参考技术A  在一个Microsoft群集服务(MSCS)故障转移群集中可以安装最多个Microsoft®SQLServer&#; 实例  通过运行群集中某个节点上的SQLServer安装程序安装SQLServer实例安装程序将实例安装在安装过程中指定的故障转移群... 查看详情

基于saltstackartifactory打造传统模式下持续部署平台

...式复杂;·安全问题容易被忽视。二、工具介绍1.Saltstack基于ZeroMQ的开源的配置管理工具。笔者之所以选型使用saltstack,而放弃了ansible,原因是由于ansible基于ssh通信,在管控主机超过五百台之后,基于消息队列的命令下发方式无... 查看详情

故障转移集群的仲裁

...用仲裁投票(QuorumVoting)决定集群的健康状况,或使故障自动转移,或使集群离线。当集群中的结点发生故障时,会由其他结点接手继续提供服务,不过,当结点之间通信出现问题,或大多数结点发生故障时,集群就会停止服务... 查看详情

etcd是啥东西?它和zookeeper有啥区别

...ry和CoreOS的Fleet都广泛使用了etcd。  etcd集群的工作原理基于raft共识算法(TheRaftConsensusAlgorithm)。  etcd在0.5.0版本中重新实现了raft算法,而非像之前那样依赖于第三方库go-raft。  raft共识算法的优点在于可以在高效的解决... 查看详情

自动故障转移在 Hadoop 中不起作用

】自动故障转移在Hadoop中不起作用【英文标题】:AutomaticFailovernotworkinginHadoop【发布时间】:2017-04-1908:27:38【问题描述】:我正在尝试构建一个3节点集群(2个Namenode(nn1,nn2)和1个datanode(dn1))。使用NamenodeWEBUI,我可以看到nn1处于活... 查看详情

repmgr自动故障转移的参数配置(代码片段)

...postgres‘data_directory=‘/var/lib/pgsql/12/data‘repmgr守护程序和自动故障转移参数以上参数是repmgr操作所需的基本参数,要启用repmgr守护程序和自动故障转移,需要启用/添加许多其他参数。failover=‘automatic‘failover的参数有两个,manual... 查看详情

hadoopha自动故障转移&频繁启动问题解决(代码片段)

...HA配置后,NN一直频繁切换,这个现象就是hadoop的脑裂自动故障转移配置vim$ 查看详情

常用postgresqlha(高可用)工具收集

PostgreSQLHACollect:1.pgpool2.Pacemaker+Corosync3.ecox4.Patroni:ATemplateforPostgreSQLHAwithZooKeeper,etcdorConsulPatronioriginatedasaforkofGovernor,theprojectfromCompose.Itincludesplentyofnewfeatures.5.Governor:ATemplateforPostgreSQLHAwithetcd,已经弃用,他们推荐patroniConsul的优势&m... 查看详情