第3章 Patroni REST API
Patroni具有丰富的REST API,Patronictl自身在领导者竞赛中使用了patronictl工具,以执行故障转移/切换/重新初始化/重新启动/重新加载,通过HAProxy或任何其他类型的负载平衡器来执行HTTP健康检查 ,当然也可以用于监视。在下面,您将找到Patroni REST API端点的列表。
3.1 健康检查端点
对于所有运行状况检查,GET请求Patroni返回一个JSON文档以及该节点的状态以及HTTP状态代码。如果您不需要或不需要JSON文档,则可以考虑使用OPTIONS方法而不是GET。
• 仅当Patroni节点作为领导者运行时,对Patroni REST API的以下请求将返回HTTP状态代码200:
  –GET/
  –GET/master
  –GET/primary
  –GET/read-write
• GET /standby-leader:仅当Patroni 节点在备用集群中作为leader 运行时才返回HTTP 状态代码200。
• GET /leader:当Patroni 节点有leader 锁时,返回HTTP 状态码200。 与前两个端点的主要区别在于它没有考虑 PostgreSQL 是作为主服务器还是作为后备领导者运行。
• GET /replica: replica健康检查端点。 仅当Patroni节点处于running状态,角色为replica且未设置noloadbalance标签时,才返回HTTP状态码200。
• GET /replica?lag=<max-lag>:replica检查端点。 除了从replica检查外,它还检查复制延迟并仅在低于指定值时返回状态代码 200。 出于性能原因,来自 DCS 的关键 cluster.last_leader_operation 用于 Leader wal 位置和replica上的计算延迟。 max-lag 可以以字节(整数)或人类可读的值指定,例如 16kB、64MB、1GB。
  – GET /replica?lag=1048576
  – GET /replica?lag=1024kB
  – GET /replica?lag=10MB
  – GET /replica?lag=1GB
• GET /replica?tag_key1=value1&tag_key2=value2:replica检查端点。 此外,它还将在 yaml 的标签部分检查用户定义的标签 key1 和 key2 及其各自的值 配置管理。 如果没有为实例定义标签,或者 yaml 配置中的值与查询值不匹配,它将返回 HTTP 状态代码 503。
在以下请求中,由于我们正在检查leader或standby-leader的状态,因此 Patroni 不会应用任何用户定义的标签,它们将被忽略。
• GET /?tag_key1=value1&tag_key2=value2
• GET /master?tag_key1=value1&tag_key2=value2
• GET /leader?tag_key1=value1&tag_key2=value2
• GET /primary?tag_key1=value1&tag_key2=value2
• GET /read-write?tag_key1=value1&tag_key2=value2
• GET /standby_leader?tag_key1=value1&tag_key2=value2
• GET /standby-leader?tag_key1=value1&tag_key2=value2
• GET /read-only:与上述端点类似,但也包括主节点
• GET /synchronous 或GET /sync:仅当Patroni 节点作为同步备用节点运行时才返回HTTP 状态代码200。
• GET /asynchronous 或 GET /async:仅当 Patroni 节点作为异步备用节点运行时才返回 HTTP 状态代码 200
• GET /asynchronous?lag= 或 GET /async?lag=:异步待机 检查端点。 除了检查异步或异步之外,它还检查复制延迟并仅在低于指定值时返回状态代码 200。 出于性能原因,来自 DCS 的关键 cluster.last_leader_operation 用于 Leader wal 位置和replica上的计算延迟。 max-lag 可以以字节(整数)或人类可读的值指定,例如 16KB、64MB、1GB。
  – GET /async?lag=1048576
  – GET /async?lag=1024kB
  – GET /async?lag=10MB
  – GET /async?lag=1GB
• GET /health:仅当PostgreSQL 启动并运行时才返回HTTP 状态代码200。
• GET /liveness:始终返回 HTTP 状态代码 200,它仅表示 Patroni 正在运行。 可用于 livenessProbe。
• GET /readiness:当Patroni 节点作为领导者运行或PostgreSQL 启动并运行时,返回HTTP 状态代码200。 当无法使用 Kubernetes 端点进行领导选举 (OpenShift) 时,端点可用于 readinessProbe。
readiness 和liveness 端点是非常轻量的不需要执行SQL。 探针的配置方式应使其在引导密钥到期时的某个时间开始失效。默认值ttl为30秒,示例探针如下所示:
readinessProbe:
  httpGet:
    scheme: HTTP
    path: /readiness
    port: 8008
  initialDelaySeconds: 3
  periodSeconds: 10
  timeoutSeconds: 5
  successThreshold: 1
  failureThreshold: 3
livenessProbe:
  httpGet:
    scheme: HTTP
    path: /liveness
    port: 8008
  initialDelaySeconds: 3
  periodSeconds: 10
  timeoutSeconds: 5
  successThreshold: 1
  failureThreshold: 3

3.2 监控端点
GET /patroni 由 Patroni 在leader选举期间使用。 您的监控系统也可以使用它。此端点生成的 JSON 文档与健康检查端点生成的 JSON 具有相同的结构。
$ curl -s http://localhost:8008/patroni | jq .
{
  "state": "running",
  "postmaster_start_time": "2019-09-24 09:22:32.555 CEST",
  "role": "master",
  "server_version": 110005,
  "cluster_unlocked": false,
  "xlog": {
    "location": 25624640
  },
  "timeline": 3,
  "database_system_identifier": "6739877027151648096",
  "patroni": {
    "version": "1.6.0",
    "scope": "batman"
  }
}

3.3 集群状态端点
• GET /cluster 端点生成描述当前集群拓扑和状态的 JSON 文档:
$ curl -s http://localhost:8008/cluster | jq .{
    "members": [{
      "name": "postgresql0",
      "host": "127.0.0.1",
      "port": 5432,
      "role": "leader",
      "state": "running",
      "api_url": "http://127.0.0.1:8008/patroni",
      "timeline": 5,
      "tags": {
        "clonefrom": true
      }
    },
    {
      "name": "postgresql1",
      "host": "127.0.0.1",
      "port": 5433,
      "role": "replica",
      "state": "running",
      "api_url": "http://127.0.0.1:8009/patroni",
      "timeline": 5,
      "tags": {
        "clonefrom": true
      },
      "lag": 0
    }
  ],
  "scheduled_switchover": {
    "at": "2019-09-24T10:36:00+02:00",
    "from": "postgresql0"
  }
}

• GET /history 端点提供了有关集群切换/故障切换历史的视图。 格式与 pg_wal 目录中的历史文件的内容非常相似。唯一的区别是显示新时间线创建时间的时间戳字段。
$ curl -s http://localhost:8008/history | jq .
[
  [
    1,
    25623960,
    "no recovery target specified",
    "2019-09-23T16:57:57+02:00"
  ],
  [
    2,
    25624344,
    "no recovery target specified",
    "2019-09-24T09:22:33+02:00"
  ],
  [
    3,
    25624752,
    "no recovery target specified",
    "2019-09-24T09:26:15+02:00"
  ],
  [
    4,
    50331856,
    "no recovery target specified",
    "2019-09-24T09:35:52+02:00"
  ]
]

3.4配置端点
GET /config:获取动态配置的当前版本:
$ curl -s localhost:8008/config | jq .
{
  "ttl": 30,
  "loop_wait": 10,
  "retry_timeout": 10,
  "maximum_lag_on_failover": 1048576,
  "postgresql": {
    "use_slots": true,
    "use_pg_rewind": true,
    "parameters": {
      "hot_standby": "on",
      "wal_log_hints": "on",
      "wal_level": "hot_standby",
      "max_wal_senders": 5,
      "max_replication_slots": 5,
      "max_connections": "100"
    }
  }
}

PATCH /config:更改现有配置。
$ curl -s -XPATCH -d \
'{"loop_wait":5,"ttl":20,"postgresql":{"parameters":{"max_connections":"101"}}
˓→}' \
http://localhost:8008/config | jq .
{
  "ttl": 20,
  "loop_wait": 5,
  "maximum_lag_on_failover": 1048576,
  "retry_timeout": 10,
  "postgresql": {
    "use_slots": true,
    "use_pg_rewind": true,
    "parameters": {
      "hot_standby": "on",
      "wal_log_hints": "on",
      "wal_level": "hot_standby",
      "max_wal_senders": 5,
      "max_replication_slots": 5,
      "max_connections": "101"
    }
  }
}

上面的REST API调用修补了现有配置,并返回了新配置。让我们检查节点是否处理了此配置。 首先,它应该每 5 秒开始打印日志行(loop_wait=5)。 “max_connections”的改变需要重启,因此应显示“pending_restart”标志:
$ curl -s http://localhost:8008/patroni | jq .{
  "pending_restart": true,
  "database_system_identifier": "6287881213849985952",
  "postmaster_start_time": "2016-06-13 13:13:05.211 CEST",
  "xlog": {
    "location": 2197818976
  },
  "patroni": {
    "scope": "batman",
    "version": "1.0"
  },
  "state": "running",
  "role": "master",
  "server_version": 90503
}

删除参数:
如果你想删除(重置)一些设置,只需用 null 修补它:
$ curl -s -XPATCH -d \
'{"postgresql":{"parameters":{"max_connections":null}}}' \
http://localhost:8008/config | jq .
{
  "ttl": 20,
  "loop_wait": 5,
  "retry_timeout": 10,
  "maximum_lag_on_failover": 1048576,
  "postgresql": {
    "use_slots": true,
    "use_pg_rewind": true,
    "parameters": {
      "hot_standby": "on",
      "unix_socket_directories": ".",
      "wal_level": "hot_standby",
      "wal_log_hints": "on",
      "max_wal_senders": 5,
      "max_replication_slots": 5
    }
  }
}

上面的调用从动态配置中删除 postgresql.parameters.max_connections.PUT /config: 也可以无条件地执行现有动态配置的完全重写:
$ curl -s -XPUT -d \
'{"maximum_lag_on_failover":1048576,"retry_timeout":10,"postgresql":{"use_
˓→slots":true,"use_pg_rewind":true,"parameters":{"hot_standby":"on","wal_log_hints":
˓→"on","wal_level":"hot_standby","unix_socket_directories":".","max_wal_senders":5}},
˓→"loop_wait":3,"ttl":20}' \
http://localhost:8008/config | jq .
{
  "ttl": 20,
  "maximum_lag_on_failover": 1048576,
  "retry_timeout": 10,
  "postgresql": {
    "use_slots": true,
    "parameters": {
      "hot_standby": "on",
      "unix_socket_directories": ".",
      "wal_level": "hot_standby",
      "wal_log_hints": "on",
      "max_wal_senders": 5
    },
    "use_pg_rewind": true
  },
  "loop_wait": 3
}

3.5 切换和故障切换端点
POST /switchover 或 POST /failover。 这些端点彼此非常相似。 但是有一些细微的差异:
1. 故障转移端点允许在没有健康节点时执行手动故障转移,但同时不允许调度切换。
2. 切换端点相反。 它仅在集群健康(有领导者)时才起作用,并允许在给定时间安排切换。
如果要在特定时间安排切换,则必须在POST请求的JSON正文中至少指定leader 或candidate 字段以及可选的scheduled_at字段。
示例:执行到特定节点的故障转移:
$ curl -s http://localhost:8009/failover -XPOST -d '{"candidate":"postgresql1"}'
Successfully failed over to "postgresql1"

示例:在指定时间调度一个切换,在一个集群中从leader到一些健康的副本节点上:
$ curl -s http://localhost:8008/switchover -XPOST -d \
'{"leader":"postgresql0","scheduled_at":"2019-09-24T12:00+00"}'
Switchover scheduled

根据情况,请求可能会以不同的 HTTP 状态代码和内容结束。 成功完成切换或故障转移后,将返回状态码 200。 如果成功安排了切换,Patroni 将返回 HTTP 状态代码 202。如果出现问题,将在响应正文中返回错误状态代码(400、412 或 503 之一)以及一些详细信息。 更多信息请查看patroni/api.py:do_POST_failover() 方法的源代码。
• DELETE /switchover:删除计划切换
POST /switchover 和POST /failover 端点被分别用于 patronictl switchover 和patronictl failover
DELETE /switchover 用于 patronictl flush <cluster-name> switchover。
3.6 重启端点
• POST /restart:您可以通过执行 POST /restart 调用在特定节点上重新启动 Postgres。 在 POST 请求的 JSON 正文中,可以选择指定一些重启条件:
  – restart_pending:布尔值,如果设置为 true Patroni 将仅在重启挂起时重启 PostgreSQL,以便应用 PostgreSQL 配置中的一些更改。
  – role:只有当节点的当前角色与 POST 请求中的角色匹配时才执行重新启动。
  – postgres_version:仅当postgres 的当前版本小于POST 请求中指定的版本时才执行重新启动。
  – timeout:在 PostgreSQL 开始接受连接之前我们应该等待多长时间。 覆盖 master_start_timeout。
  – schedule:带时区的时间戳,安排在将来某个地方重启。
• DELETE /restart:删除计划的重启
POST /restart 和 DELETE /restart 端点分别被patronictl restart 和patronictl flush <cluster-name> restart 使用。
3.7 重载端点
POST /reload 调用将命令 Patroni 重新读取和应用配置文件。 这相当于向 Patroni 进程发送 SIGHUP 信号。 如果您更改了一些需要重新启动的 Postgres 参数(如 shared_buffers),您仍然必须通过调用 POST/restart 端点或在patriotictl restart 的帮助下明确地重新启动Postgres。
重新加载端点由patriotictl reload 使用。
3.8 重新初始化端点
POST /reinitialize:重新初始化指定节点上的PostgreSQL数据目录。只允许在副本上执行它。 一旦调用,它将删除数据目录并启动pg_basebackup或其他替代副本创建方法。
如果 Patroni 处于尝试恢复(重新启动)故障的 Postgres 的循环中,则调用可能会失败。 为了解决这个问题,可以在请求正文中指定 {"force":true}。
重新初始化端点由patriotictl reinit 使用。