🐙

Docker Composeを使用したPostgreSQLのレプリケーション環境の構築

2024/03/16に公開

Docker Composeを使用してPostgreSQLのレプリケーションを試す環境を構築する。
よくわからないが動けばOKを目的としている。
ほぼ参考先のままなので詳しくはそちらを参照。

環境

  • macOS Sonoma 14.3.1
  • Docker version 25.0.3, build 4debf41
  • Docker Compose version v2.24.6-desktop.1

手順

初期化用スクリプトを作成

レプリケーションユーザーとスロットを作成する初期化用スクリプトを作成する

00_init.sql
CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'password';
SELECT PG_CREATE_PHYSICAL_REPLICATION_SLOT('replication_slot');

docker-compose.ymlを作成する

version: '3.8'
x-db:
  &db
  image: postgres:16.2
  user: postgres

services:
  db_primary:
    <<: *db
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_HOST_AUTH_METHOD: "scram-sha-256\nhost replication all 0.0.0.0/0 md5"
      POSTGRES_INITDB_ARGS: "--auth-host=scram-sha-256"
    volumes:
      # 初期化用スクリプトをマウント
      - ./00_init.sql:/docker-entrypoint-initdb.d/00_init.sql
    command: |
      postgres 
      -c wal_level=replica 
      -c hot_standby=on 
      -c max_wal_senders=10 
      -c max_replication_slots=10 
      -c hot_standby_feedback=on

  db_replica:
    <<: *db
    ports:
      - "5433:5432"
    environment:
      PGUSER: replicator
      PGPASSWORD: password
    command: |
      bash -c "
      until pg_basebackup --pgdata=/var/lib/postgresql/data -R --slot=replication_slot --host=db_primary --port=5432
      do
      echo 'Waiting for primary to connect...'
      sleep 1s
      done
      echo 'Backup done, starting replica...'
      chmod 0700 /var/lib/postgresql/data 
      postgres
      "
    depends_on:
      - db_primary

起動

docker compose up -d

プライマリーに接続

以下のコマンドでプライマリーに接続する

docker compose exec db_primary psql

psqlでプライマリーに接続できたら適当なテーブルを作成し、レコードを追加する

postgres=# CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL 
);                              
CREATE TABLE
postgres=# INSERT INTO users (username) VALUES ('foo'), ('bar');
INSERT 0 2
postgres=# SELECT * FROM users;
 id | username 
----+----------
  1 | foo
  2 | bar
(2 rows)

レプリカに接続

以下のコマンドでレプリカに接続する

docker compose exec db_replica psql -d postgres -U postgres

\dtでusersテーブルが存在することが確認できる

postgres=# \dt
         List of relations
 Schema | Name  | Type  |  Owner   
--------+-------+-------+----------
 public | users | table | postgres
(1 row)

SELECTするとプライマリーで登録したレコードが確認できる

postgres=# SELECT * FROM users;
 id | username 
----+----------
  1 | foo
  2 | bar
(2 rows)

(任意)PostgreSQLの設定を変える

max_connectionsなど設定を変えたい場合はcommand部分で指定すれば変えることができる

services:
  db_primary:
    ...
    command: |
      postgres
      ...
+      -c max_connections=1000
     ...
  db_replica:
    ...
    command: |
      bash -c "
      ...
+     echo 'max_connections = 1000' >> /var/lib/postgresql/data/postgresql.conf
      chmod 0700 /var/lib/postgresql/data 
      postgres
      "
     ...

まとめ

以上でDocker Composeを使用してPostgreSQLのレプリケーションを試す環境を構築することができる。
設定変更などが必要な場合は、docker-compose.ymlファイルを適宜編集する。

参考

https://medium.com/@eremeykin/how-to-setup-single-primary-postgresql-replication-with-docker-compose-98c48f233bbf

Discussion