暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

浅析Patroni2.0 配置文件

前言

今天我们来探讨一下Patroni Configuration的配置。

Patroni Configuration

Patroni的配置文件是一个Yaml文件,这个文件分为许多部分,一般会把这个配置文件放在/etc目录下。

我们以github给的postgres0.yml为例。

1.scope,namespace和name

scope 集群的名称。

namespace 是在DCS(服务发现)组件中创建集群和节点标识的位置。简单来说就是etcd中存储的位置,不配置的话默认就存储在/service目录下。我们可以为每一个集群定义一个命名空间,也可以在同一个命名空间中存储多个集群。

name 运行Patroni当前实例的节点的名称。

2.restapi

这是patroni REST API的配置。

listen 定义了REST API服务侦听的地址和端口。这个监听地址

connect_address 定义了patroni用于查询REST API的地址和端口

我们来简单介绍一下restapi。

其实网上理论很多,但是最简单的就如图所示,引用知乎上一句言简意赅的话就是:客户端URL定位资源,然后用HTTP的方式进行操作(get/post/put/delete)。那么为什么要搞出这种东西,是因为我们的客户端现在多种多样,有电脑、有手机、有终端,所以打造一个统一访问的方法就很重要了。那么restapi就是这种方法。

那么既然它可以读,我们就来测试一下。这里要先在操作系统安装jq包,不然不利于读出来的这种json格式。

执行curl -s http://133.0.204.206:8008/patroni | jq

可以获取出集群的一些信息,以及数据库复制状态的一些状态信息。

restapi还有两个选项是certfilekeyfile,可以定义证书文件和密钥的路径,这可以启动安全保护的作用。

authentication 可以为restapi配置身份验证

3.etcd

etcd:  hosts: 133.0.204.203:2379,133.0.204.204:2379,133.0.204.205:2379
复制

etcd的配置比较简单,基本上只要配置连接到它们的IP地址就行了。这里注意的是host指定一个地址,hosts可以指定多个地址。

4.bootstrap

bootstrap:  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"  initdb:  - encoding: UTF8  - locale: C  - lc-ctype: zh_CN.UTF-8  - data-checksums  pg_hba:  - host replication repl 0.0.0.0/0 md5  - host all all 0.0.0.0/0 md5
复制

这里是Patroni的引导程序,patroni集群初始化的时候,就会把信息写入到etcd中的/namespace/scope/config下面

这个信息我们可以使用restapi来查看,我们来查一下,因为我们只配置了scope和name,所以namespace是就是默认的/service.

scope: patnori-testname: postgres1
复制

我们先通过curl查看etcd下面的keys,来查namespace。

[root@133e0e204e206 ~]# curl http://133.0.204.203:2379/v2/keys/{"action":"get","node":{"dir":true,"nodes":[{"key":"/service","dir":true,"modifiedIndex":20,"createdIndex":20}]}}
复制

可以看到一个路径/service。接下来我们代入/namespace/scope/config

这儿就把我们配置的bootstrap信息获取出来了。

然后我们来看看bootstrap的信息,首先是dcs的配置信息。

  dcs:    ttl: 30    loop_wait: 10    retry_timeout: 10    maximum_lag_on_failover: 1048576    master_start_timeout: 300    synchronous_mode: false
复制

ttl ttl我特意查了一下是Time To Live是缩写,也就是生存时间,这里官方文档的写的特别模糊,直译过来是不容易懂的。Google Cloud里面的描述可能更加容易懂一点。

To assert its cluster membership role, the primary node regularly updates the leader key in the DCS. The leader key includes a time to live (TTL). If the TTL elapses without an update, the leader key is evicted from the DCS, and the leader election starts to select a new primary from the candidate pool.

The following diagram shows a healthy cluster in which Node A successfully updates the leader lock.

主节点会定期更新DCS中的leader的密钥,leader的密钥包括生存时间(TTL),如果密钥在没有更新的情况下(达到TTL时间),则领导者密钥将从DCS中驱逐,并且领导者选举开始从候选者池中选择新的主要成员。

上面的图就显示了运行状况良好的群集,其中节点A成功更新了leader lock。

loop_wait 循环更新领导者密钥过程中的休眠时间,也是写了一个循环程序更新领导者密钥,然后在中间sleep(loop_wait )。

May 19 17:35:16 133e0e204e206 patroni[19271]: 2021-05-19 17:35:16,224 INFO: Lock owner: postgres1; I am postgres1May 19 17:35:16 133e0e204e206 patroni[19271]: 2021-05-19 17:35:16,236 INFO: no action.  i am the leader with the lockMay 19 17:35:26 133e0e204e206 patroni[19271]: 2021-05-19 17:35:26,224 INFO: Lock owner: postgres1; I am postgres1May 19 17:35:26 133e0e204e206 patroni[19271]: 2021-05-19 17:35:26,247 INFO: no action.  i am the leader with the lockMay 19 17:35:36 133e0e204e206 patroni[19271]: 2021-05-19 17:35:36,224 INFO: Lock owner: postgres1; I am postgres1May 19 17:35:36 133e0e204e206 patroni[19271]: 2021-05-19 17:35:36,233 INFO: no action.  i am the leader with the lockMay 19 17:35:46 133e0e204e206 patroni[19271]: 2021-05-19 17:35:46,224 INFO: Lock owner: postgres1; I am postgres1May 19 17:35:46 133e0e204e206 patroni[19271]: 2021-05-19 17:35:46,232 INFO: no action.  i am the leader with the lockMay 19 17:35:56 133e0e204e206 patroni[19271]: 2021-05-19 17:35:56,224 INFO: Lock owner: postgres1; I am postgres1May 19 17:35:56 133e0e204e206 patroni[19271]: 2021-05-19 17:35:56,232 INFO: no action.  i am the leader with the lock
复制

这个时间可以从日志中看到,每隔大概10秒, 就会有一段i am the leader with the lock。

retry_timeout etcd和PostgreSQL操作重试的超时时间(以秒为单位)。任何小于此值的超时都不会导致领导者降级。

maximum_lag_on_failover 如果Master和Replicate之间的字节数延迟大于此值,那么Replicate将不参与新的领导者选举。

synchronous_mode 是否打开同步复制模式。在打开模式下,将选择一个副本作为同步副本,并且只有最新的领导者和同步副本才能参与领导者选举。同步模式确保成功提交的事务不会在故障转移时丢失。它的代价是当用户无法确保事务的持久性时,将失去写操作的可用性。

postgresql 这里定义了引导过程中PostgreSQL的配置,是否使用pg_rewind,是否使用复制插槽,还有PostgreSQL参数等信息。

    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"
复制

initdb 定义了在引导过程中要传递给initdb的选项(例如,编码或校验方法)。

  initdb:  - encoding: UTF8  - locale: C  - lc-ctype: zh_CN.UTF-8  - data-checksums
复制

pg_hba 定义了集群初始化后,pg_hba.conf中该设置的条目。

  pg_hba:  - host replication repl 0.0.0.0/0 md5  - host all all 0.0.0.0/0 md5
复制

5.postgresql

上面的postgresql是引导(bootstrap)中的配置,下面这个postgresql是针对每个节点数据库的设置,你可以根据你的需求进行设置。

postgresql:  listen: 0.0.0.0:5432  connect_address: 133.0.204.206:5432  data_dir: /app/pgdata  bin_dir: /app/pg/bin  authentication:    replication:      username: repl      password: "Sqlite123"    superuser:      username: postgres      password: "Sqlite123"
复制

这里的listen用来设置postgresql.conf参数listen_addresses和port。

connect_address定义了可从其他节点和应用程序访问Postgres的地址和端口。

data_dir 指定集群的数据目录的存放路径。

bin_dir PostgreSQL二进制文件存放路径。

authentication 定义用于复制的用户,超级用户。

6.tag

最后一段就是标签的设置,如果集群包含异地的数据中心,可以根据需要配置该节点为不参与选主,不参与负载均衡,也不作为同步备库。

tags:    nofailover: false    noloadbalance: false    clonefrom: false    nosync: false
复制

后记

Patroni的配置文件是比较复杂的。具体可以参考下列网站:

https://github.com/zalando/patroni/blob/master/docs/SETTINGS.rst

文章转载自励志成为postgresql大神,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论