PostgreSQL HA方案之Patroni[raft]篇

Patroni是PostgreSQL可选的高可用方案中接受度最广的一种,特别是在2.0之后,Patroni可以使用raft协议来解决分布式的一致性问题,减少了对etcd或zookeeper的依赖,大大简化了安装和运维, 本篇介绍如何基于raft来构建一个最简单的HA集群。

patroni安装和准备

用pip来安装patroni,因为使用raft来进行分布式集群管理,所以依赖选择patroni[raft], 如果使用consul则用patroni[consul], 以此类推。

pip install patroni[raft]

因为是以非root用户安装,patroni及patronictl安装在 $HOME/.local/bin

加载softdog内核模块,避免出现类似错误信息 no such file or directory /dev/watchdog

sudo modprobe softdog

目录创建和权限修改

PostgreSQL数据目录

mkdir -p /tmp/patroni_raft/{inst_01,inst_02,inst_03}
cd /tmp/patroni_raft
chmod -R 0700 inst_01 inst_02 inst_03

raft数据目录

mkdir -p /tmp/raft/{inst_01,inst_02,inst_03}

patroni配置文件

scope: my-ha-cluster
name: pg-1

restapi:
  listen: 0.0.0.0:8008
  connect_address: 127.0.0.1:8008

raft:
  data_dir: /tmp/raft/inst_01
  self_addr: 127.0.0.1:5010
  partner_addrs: ['127.0.0.1:5011','127.0.0.1:5012']    

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    postgresql:
      use_pg_rewind: true
      use_slots: true
      parameters:
        wal_level: replica
        hot_standby: "on"
        wal_keep_segments: 8
        max_wal_senders: 5
        max_replication_slots: 5
        checkpoint_timeout: 30

  initdb:
  - encoding: UTF8

  pg_hba:
  - host all dba all md5
  - host replication repl all md5

  users:
    dba:
      password: yourcode
      options:
        - createrole
        - createdb
    repl:
      password: yourcode
      options:
        - replication

postgresql:
  listen: 0.0.0.0:5432
  connect_address: 127.0.0.1:5432
  data_dir: /tmp/patroni_raft/inst_01
  config_dir: /tmp/patroni_raft/inst_01
  bin_dir: /usr/local/pgsql/bin
  authentication:
    replication:
      username: repl
      password: secret
    superuser:
      username: dba
      password: secret
  parameters:
    unix_socket_directories: '/tmp/patroni_raft/inst_01'

patroni运行

cp pg-1.yml pg-2.yml
cp pg-1.yml pg-3.yml

先把pg-2.yml和pg-3.yml中相应的配置修改一下,主要是节点名称和监听地址以及数据目录。

修改结束之后,用patroni拉起集群

cd /tmp/patroni_raft
~/.local/bin/patroni ./pg-1.yml
~/.local/bin/patroni ./pg-2.yml
~/.local/bin/patroni ./pg-3.yml

patroni状态检查

如果一切顺利,集群会被正常拉起, 为进一步确认集群状态,运行如下指令验证。

cd /tmp/patroni_raft
./local/bin/patronictl -c ./pg-1.yml list

正常的话,会显示如下信息

+ Cluster: my-ha-cluster (7016961673110130148) ----+-----------+
| Member | Host           | Role    | State   | TL | Lag in MB |
+--------+----------------+---------+---------+----+-----------+
| pg-1   | 127.0.0.1:5432 | Replica | running |  1 |         0 |
| pg-2   | 127.0.0.1:5433 | Replica | running |  1 |         0 |
| pg-3   | 127.0.0.1:5434 | Leader  | running |  1 |           |
+--------+----------------+---------+---------+----+-----------+

连接PostgreSQL

在上面的输出中显示, master是pg-3,监听的端口是5434, 接下来可以连接到master并创建表写入数据进行测试

psql -Udba -dpostgres -h localhost -p 5434