Patroni集群备用数据中心升级实战指南

本文详细介绍了在Patroni管理的PostgreSQL集群中执行备用数据中心升级的两种方法:通过patronictl命令行工具和REST API。内容包括集群配置修改、复制槽管理以及防止脑裂场景的注意事项,为数据库管理员提供实用的操作指南。

执行Patroni集群的备用数据中心升级

与标准的多节点Postgres复制集群不同,当由Patroni管理时,所有故障转移都是自动执行的。然而,在处理跨数据中心故障转移时,情况就不同了,例如当备用数据中心必须接管故障的主数据中心时。以下描述了在这种情况下执行此类过程所需的机制。

本文描述了两种机制,这两种机制都管理集群的DCS:

  • 通过patronictl执行故障转移
  • 通过Patroni的REST API执行故障转移

关于patronictl

这是允许对DCs进行更改的基础命令。

1
patronictl -c /etc/patroni/config.yml edit-config --help
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Usage: patronictl edit-config [OPTIONS] [CLUSTER_NAME]

编辑集群配置

选项:
  --group INTEGER  Citus组
  -q, --quiet      不显示更改
  -s, --set TEXT   设置特定的配置值。可以多次指定
  -p, --pg TEXT    设置特定的PostgreSQL参数值。是-s postgresql.parameters的简写。可以多次指定
  --apply TEXT     从文件应用配置。使用-表示stdin。
  --replace TEXT   从文件应用配置,替换现有配置。使用-表示stdin。
  --force          在任何时候都不要求确认
  --help           显示此消息并退出。

关于REST API

Patroni的REST API对于Patroni的领导者选举过程至关重要,用于故障转移、切换、重新初始化、重启和重新加载等操作。它也可以被像HAProxy这样的负载均衡器用于HTTP健康检查以及监控。通常在使用REST API执行操作时使用CLI curl和jq。

设置

为了文档目的,假设以下情况: 两个数据中心,每个数据中心包含一个3节点复制集群。法兰克福当前配置为PRIMARY,阿姆斯特丹分别配置为STANDBY数据中心。

1
2
3
4
5
6
7
+ Cluster: Frankfurt (7546601820334116441) ------+----+-----------+
| Member  | Host           | Role    | State     | TL | Lag in MB |
+---------+----------------+---------+-----------+----+-----------+
| fradb1v | 10.108.134.168 | Leader  | running   |  2 |           |
| fradb2v | 10.108.134.113 | Replica | streaming |  2 |         0 |
| fradb3v | 10.108.134.150 | Replica | streaming |  2 |         0 |
+---------+----------------+---------+-----------+----+-----------+
1
2
3
4
5
6
7
+ Cluster: Amsterdam (7546601820334116441) -+-----------+----+-----------+
| Member  | Host           | Role           | State     | TL | Lag in MB |
+---------+----------------+----------------+-----------+----+-----------+
| amsdb1v | 10.108.134.211 | Standby Leader | streaming |  2 |           |
| amsdb2v | 10.108.134.235 | Replica        | streaming |  2 |         0 |
| amsdb3v | 10.108.134.29  | Replica        | streaming |  2 |         0 |
+---------+----------------+----------------+-----------+----+-----------+

备用领导者升级

升级备用领导者需要两个步骤:

  1. 升级当前备用领导者
  2. 删除远程连接的主节点使用的槽

版本1:使用patronictl

升级备用领导者

这两种变体之间的唯一区别是一个是交互式的,另一个不是。

变体A

1
2
# 交互式;在提交前询问
patronictl -c /etc/patroni/config.yml edit-config --set standby_cluster=null

变体B

1
2
# 强制执行
patronictl -c /etc/patroni/config.yml edit-config --set standby_cluster=null --force

创建新槽

这可以被视为一项可选活动,其中明确创建了一个复制槽,并理解将要配置一个新的备用数据中心,即故障的主数据中心。

1
2
patronictl -c /etc/patroni/config.yml edit-config 
           --set slots.standby_cluster.type=physical --force

注意:此命令和前面的命令可以合并为一个命令。仅出于文档目的,它们被分成两个独立的命令。

版本2:使用REST API

这种方法的好处是,它可以从任何可以访问集群中由Patroni管理的端口8008的主机执行。

升级备用领导者

主机被升级,恢复完成并变为读写模式。

1
curl -s -XPATCH -d '{"standby_cluster":null}' http://localhost:8008/config | jq .

创建新槽

根据先前演示的示例,在新的Leader上创建了一个新槽,用于复制到备用Leader。

1
2
3
4
curl -s -XPATCH -d 
'{
  "slots":{"standby_cluster":{"type": "physical"}}
}' http://localhost:8008/config | jq .

将已弃用的主数据中心重新配置为新的备用数据中心

以下说明与先前的说明有些相似。在Patroni集群"Frankfurt"中执行以下操作。

版本1:patronictl

配置新的备用领导者

1
2
3
4
5
6
patronictl -c /etc/patroni/config.yml edit-config 
    --set standby_cluster.host='amsdb1v,amsdb2v,amsdb3v' 
    --set standby_cluster.port=5432 
    --set standby_cluster.primary_slot_name=standby_cluster 
    --set standby_cluster.create_replica_methods=basebackup 
    --force

删除旧槽

除非有紧急原因需要该槽保留在新升级的Leader上,否则应将其删除。

1
patronictl -c /etc/patroni/config.yml edit-config --set slots=null --force

注意:尝试使用名为pg_drop_replication_slot的postgres函数删除槽将失败,因为patroni会简单地将其放回。

版本2:REST API

配置新的备用领导者

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
curl -s -XPATCH -d 
'{
  "standby_cluster": {
    "host": "amsdb1v,amsdb2v,amsdb3v",
    "port": 5432,
    "primary_slot_name": "standby_cluster",
    "create_replica_methods": [
      "basebackup"
    ]
  }
}' http://localhost:8008/config | jq .

删除旧槽

1
curl -s -XPATCH -d '{"slots":null}' http://localhost:8008/config | jq .

注意事项

  • 请记住,您正在管理两个不同的复制集群,即主集群和备用集群。
  • 使用patronictl需要访问每个相应集群中的一个主机。
  • 使用REST API假定在使用诸如curl之类的命令行接口时可以访问Patroni的端口8008。
  • 因为需要访问端口,所以存在潜在的安全风险,因此要么使用带密码的TLS,要么必须相应地配置防火墙规则。
  • 不用说…注意脑裂场景

最后:这是一篇关于Patroni灾难恢复的先前博客,它也解释了该技术背后的基本思想。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计