‘Quick start on Debian 11’

このクイックスタートを使用して、Debian 11でEDB Postgres Advanced ServerまたはEDB Postgres Extended Serverバージョン15を使用して高可用性のデモクラスターを作成します。 etcdホストはetcd1 、etcd2 、およびetcd3 と呼ばれます。ストリーミングレプリケーションの2つのデータベースノードはpg-patroni1 とpg-patroni2 です。

Demo diagram

Demo diagram


Etcd

etcdをインストールして設定するには、 'Installing and configuring etcd' を参照してください。

EDB Postgres AdvancedまたはExtended Server

pg-patroni1 とpg-patroni2 の両方のホストで、お好みのPostgresフレーバーをインストールします。 EDBリポジトリを使用してこれらの製品をインストールする方法の詳細については、

EDB Postgres Advanced Server または EDB Postgres Extended Server を参照してください。

選択したPostgresフレーバーによって環境変数が決まります。

EDB Postgres Advanced Serverの場合、次の設定を使用します。

export PGPORT=5444
export PGUSER=enterprisedb
export PGGROUP=enterprisedb
export PGDATA="/var/lib/edb-as/15/main"
export PGBIN="/usr/lib/edb-as/15/bin"
export PGSOCKET="/var/run/edb-as"

EDB Postgres Extended Serverの場合、次の設定を使用します。

export PGPORT=5432
export PGUSER=postgres
export PGGROUP=postgres
export PGDATA="/var/lib/edb-pge/15/data"
export PGBIN="/usr/lib/edb-pge/15/bin"
export PGSOCKET="/var/run/edb-pge"

Patroniは、最初のPostgresクラスターをブートストラップ(作成)し、サービスの開始を担当します。このサービスで systemctl が無効になっていることを確認し、インストール中に作成されたPostgresクラスターを削除します。

$ sudo systemctl stop edb-as@15-main.service
$ sudo systemctl disable edb-as@15-main.service
$ sudo rm -fr /var/lib/edb-as/15/main
```または

```bash
$ sudo systemctl stop edb-pge-15.service
$ sudo systemctl disable edb-pge-15.service
$ sudo rm -fr /var/lib/edb-pge/15/data

ウォッチドッグ

Patroniは、ウォッチドッグデバイスと対話するコンポーネントです。 pg-patroni1 とpg-patroni2 の両方のホストでソフトウェアウォッチドッグの権限を設定します。

$ cat <<EOF | sudo tee /etc/udev/rules.d/99-watchdog.rules
KERNEL=="watchdog", OWNER="$PGUSER", GROUP="$PGGROUP"
EOF
$ sudo sh -c echo "softdog" >> /etc/modules-load.d/softdog.conf
$ sudo modprobe softdog
$ sudo chown $PGUSER:$PGGROUP /dev/watchdog

パトローニ

pg-patroni1 とpg-patroni2 の両方のホストで、etcdのPatroniとその依存関係をインストールします。

'Installing Patroni' を参照してください。

/etc/patroni.yml でPatroni構成を定義します。

$ CLUSTER_NAME="demo-cluster-1"
$ MY_NAME=$(hostname --short)
$ MY_IP=$(hostname -I | awk  {print $1})
$ cat <<EOF | sudo tee /etc/patroni.yml
scope: $CLUSTER_NAME
namespace: /db/
name: $MY_NAME

restapi:
  listen: "0.0.0.0:8008"
  connect_address: "$MY_IP:8008"
  authentication:
    username: patroni
    password: mySupeSecretPassword

etcd3:
    hosts:
    - etcd1:2379
    - etcd2:2379
    - etcd3:2379

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    postgresql:
      use_pg_rewind: true
      use_slots: true
      parameters:
        archive_mode: "on"
        archive_command: "/bin/true"

  initdb:
  - encoding: UTF8
  - data-checksums
  - auth-local: peer
  - auth-host: scram-sha-256

  pg_hba:
  - host replication replicator 0.0.0.0/0 scram-sha-256
  - host all all 0.0.0.0/0 scram-sha-256

  # Some additional users which needs to be created after initializing new cluster
  users:
    admin:
      password: admin%
      options:
        - createrole
        - createdb

postgresql:
  listen: "0.0.0.0:$PGPORT"
  connect_address: "$MY_IP:$PGPORT"
  data_dir: $PGDATA
  bin_dir: $PGBIN
  pgpass: /tmp/pgpass0
  authentication:
    replication:
      username: replicator
      password: confidential
    superuser:
      username: $PGUSER
      password: my-super-password
    rewind:
      username: rewind_user
      password: rewind_password
  parameters:
    unix_socket_directories: "$PGSOCKET,/tmp"

watchdog:
  mode: required
  device: /dev/watchdog
  safety_margin: 5

tags:
  nofailover: false
  noloadbalance: false
  clonefrom: false
  nosync: false
EOF

注釈

この例の`postgresql: authentication:` セクションでは、初期化(initdb)中にスーパーユーザーが作成され、後でPatroniがデータベースに接続するために使用します。レプリケーションユーザーは、スタンバイサーバーがストリーミングレプリケーションを介してレプリケーションソースにアクセスするために作成および使用されます。最後に、巻き戻しユーザーが作成され、必要に応じて pg_rewind で使用されます。次に、パスワードポリシーに合わせて構成例のパスワードを変更することをお勧めします。

$MY_IP および$MY_NAME はローカルホストに固有です。それ以外の場合、 patroni.yml 構成はすべてのPatroniノードで同じです。

Patroniは、bin_dir の場所でpostgres バイナリを見つけますが、 EDB Postgres Advanced Serverバイナリはedb-postgres と呼ばれます。 Patroniがそのバイナリを見つけられるようにするシンボリックリンクを作成します。

$ sudo ln -s /usr/lib/edb-as/15/bin/edb-postgres /usr/lib/edb-as/15/bin/postgres

Patroniのインストールソースによっては、 systemd file が既に作成されている場合があります。正確なシステムユーザー、グループ、および構成パスを使用して独自のファイルを定義します。

$ cat <<EOF | sudo tee /etc/systemd/system/patroni.service
[Unit]
Description=Runners to orchestrate a high-availability Postgres
After=syslog.target network.target

[Service]
Type=simple
User=$PGUSER
Group=$PGGROUP
EnvironmentFile=-/etc/patroni_env.conf
ExecStart=patroni /etc/patroni.yml
ExecReload=/bin/kill -s HUP \$MAINPID
KillMode=process
TimeoutSec=30
Restart=no

[Install]
WantedBy=multi-user.target
EOF

$ sudo systemctl daemon-reload
$ sudo systemctl enable patroni
$ sudo systemctl start patroni

最初にpg-patroni1 でPatroniサービスを開始して、Postgresクラスターのリーダーにしてから、 pg-patroni2 を起動します。

クラスターのメンバーをリストするには、 patronictl コマンドを使用します。

$ patronictl -c /etc/patroni.yml list
+ Cluster: demo-cluster-1 (7104275668989116902) ----+----+-----------+
| Member      | Host            | Role    | State   | TL | Lag in MB |
+-------------+-----------------+---------+---------+----+-----------+
| pg-patroni1 | 192.168.121.61  | Leader  | running |  1 |           |
| pg-patroni2 | 192.168.121.135 | Replica | running |  1 |         0 |
+-------------+-----------------+---------+---------+----+-----------+

Patroni REST APIはポート8008 で利用できます。

EDB Postgres Advanced Serverでは、データベースクラスターの実行後、他のsystemdの依存関係のリセットが必要になる場合があります。次のコマンドを使用して、リセットを実行します。

$ sudo systemctl restart edb-as15-pgagent.service
$ sudo systemctl reset-failed

HAProxy

この例では、 pg-patroni1 とpg-patroni2 の両方のホストにHAProxyをインストールします。

$ sudo apt-get install -y haproxy
$ sudo systemctl stop haproxy
$ sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bck
$ cat <<EOF | sudo tee /etc/haproxy/haproxy.cfg
global
    maxconn 100

defaults
    log    global
    mode    tcp
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s

listen stats
    mode http
    bind *:7000
    stats enable
    stats uri /

listen read-write
    bind *:5000
    option httpchk OPTIONS /read-write
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server pg-patroni1 pg-patroni1:$PGPORT maxconn 100 check port 8008
    server pg-patroni2 pg-patroni2:$PGPORT maxconn 100 check port 8008

listen read-only
    balance roundrobin
    bind *:5001
    option httpchk OPTIONS /replica
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server pg-patroni1 pg-patroni1:$PGPORT maxconn 100 check port 8008
    server pg-patroni2 pg-patroni2:$PGPORT maxconn 100 check port 8008
EOF

$ sudo systemctl enable haproxy
$ sudo systemctl start haproxy

ポート5000 を使用する読み取り-書き込みと、ポート5001 を使用する読み取り専用の2つのセクションがあります。すべてのPostgresホストは、すべてプライマリまたはスタンバイの潜在的な候補であるため、両方のセクションに含まれています。 HAProxyは、各ホストが現在持っているロールを知るために、Patroni REST APIを照会します。

$ curl -s http://pg-patroni1:8008
{
  "state": "running",
  "postmaster_start_time": "2022-06-30 07:45:55.427895+00:00",
  "role": "master",
  "server_version": 140400,
  "xlog": {
    "location": 67108960
  },
  "timeline": 1,
  "replication": [
    {
      "usename": "replicator",
      "application_name": "pg-patroni2",
      "client_addr": "192.168.121.229",
      "state": "streaming",
      "sync_state": "async",
      "sync_priority": 0
    }
  ],
  "dcs_last_seen": 1656575356,
  "database_system_identifier": "7114936110138668110",
  "patroni": {
    "version": "2.1.3",
    "scope": "demo-cluster-1"
  }
}

注釈

/replica エンドポイントを使用することにより、Patroniはスタンバイサーバーのみにリダイレクトします。 /read-only を使用して、プライマリも含めます。

ポート 5000 とポート 5001 を使用して、読み書き接続または読み取り専用接続を選択できるようになりました。

$ psql -U admin -d postgres -h pg-patroni1 -p 5000 -c "SELECT pg_is_in_recovery();"
 pg_is_in_recovery
- ------------------
 f
(1 row)

$ psql -U admin -d postgres -h pg-patroni1 -p 5001 -c "SELECT pg_is_in_recovery();"
 pg_is_in_recovery
- ------------------
 t
(1 row)