PostgreSQLのレプリケーションをDockerで構築してみました。
DockerでPostgres単体を動くようにしてから、それを二つ使い上記を参考に構築しようと思いましたが、簡単にはいきませんでした。
最終的にははDocker Composeを使った事例を使わせていただきましたが、途中の作業について残しておこうと思います。
環境) Docker Desktop / Ubuntu 20.2 / WSL2 / Windows
まず下記を参考に単体Postgresを動作させました。
ttps://www.kagoya.jp/howto/cloud/container/dockerpostgresql/
Dockerfile
FROM postgres:15-alpine
ENV TZ Asia/Tokyo
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
※DBの永続性の観点からデータをボリュームに置くことが一般的だが、テストではコンテナを(docker rm)すると、すべて消えてくれた方が扱いやすいこともある
ビルド
docker image build -t mypostgres
設定変更反映は再起動
docker stop postgres-1
docker start postgres-1
(または、DockerDesktopからワンクリックで)
しかし二つのコンテナ間通信をするにはブリッジネットワークが必要。
docker network create postgres-network
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
…
72a8b1967ef7 postgres-network bridge local
…
ネットワークを指定して実行(中身は初期化される。すでに同名コンテナがある場合はエラーになるので (docker rm) で削除しておく)
docker run –name postgres-1 –network postgres-network -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d mypostgres
同様にレプリケーション側もつくろうとしましたが・・
docker run –name postgres-2 –network postgres-network -e POSTGRES_PASSWORD=postgres -p 5433:5433 -d mypostgres
レプリケーション側で下記のような初期バックアップをとるためのdataフォルダの退避をするために、Postgresをシェルからkillコマンドで停止させようとすると、当然ながらコンテナが停止してしまうためできません。
/var/lib/postgresql # pg_basebackup -R -h 172.24.0.2 -p 5432 -U postgres -D ./data
いろいろ試した後、下記をみつけ、動作確認しました。
「PostgreSQLのReplication構成をdocker-compose upで一撃で立ち上げたい」
https://zenn.dev/seita/articles/05f6ee4111193a
「PostgreSQL Replication with Docker」
https://medium.com/swlh/postgresql-replication-with-docker-c6a904becf77
git clone https://github.com/seitau/postgresql-replication.git
docker-compose.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
version: '3.8' services: primary: image: postgres:15-alpine restart: always command: -c 'config_file=/etc/postgresql/postgresql.conf' -c 'hba_file=/etc/postgresql/pg_hba.conf' environment: - POSTGRES_USER=root - POSTGRES_PASSWORD=password - POSTGRES_DB=db ports: - 15432:5432 volumes: - ./primary/data:/var/lib/postgresql/data - ./primary/postgresql.conf:/etc/postgresql/postgresql.conf - ./primary/pg_hba.conf:/etc/postgresql/pg_hba.conf - ./primary/init.sh:/docker-entrypoint-initdb.d/init.sh healthcheck: test: pg_isready -d db interval: 1s timeout: 1s retries: 5 replica: image: postgres:15-alpine restart: always entrypoint: /entrypoint.sh environment: - POSTGRES_USER=root - POSTGRES_PASSWORD=password - POSTGRES_DB=db ports: - 25432:5432 volumes: - ./replica/data:/var/lib/postgresql/data - ./replica/entrypoint.sh:/entrypoint.sh - ./replica/postgresql.conf:/etc/postgresql/postgresql.conf - ./replica/pg_hba.conf:/etc/postgresql/pg_hba.conf healthcheck: test: pg_isready -d db interval: 1s timeout: 1s retries: 5 depends_on: primary: condition: service_healthy |
docker-comopse up
(ブリッジネットワークは自動的に ***_defaultという名前で作られます)
自動的に作られた接続に関するファイル(Replica側)
/var/lib/postgresql/data # cat postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = ‘user=replicator passfile=”/root/.pgpass” channel_binding=prefer host=primary port=5432 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any’
primary_slot_name = ‘replication_slot_slave1’
コンテナの状態
DockerDesktopでは階層的に表示される。
レプリケーションの確認
(client_addrはReplicaのアドレス)
まだ把握していない部分がありますが、動かしながら試していこうと思います。
下記引用
—————–
設定ファイル
・Primary
postgresql.conf
1 2 3 4 5 6 7 8 |
listen_addresses = '*' # Replication wal_level = replica hot_standby = on max_wal_senders = 10 max_replication_slots = 10 hot_standby_feedback = on |
pg_hba.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust # Allow replication connections from localhost, by a user with the # replication privilege. local replication all trust host replication all 127.0.0.1/32 trust host replication all ::1/128 trust host replication all all trust host all all all trust |
・Replica
postgresql.conf
1 2 3 4 5 6 7 8 9 10 11 |
listen_addresses = '*' max_connections = 1000 max_worker_processes = 12 max_parallel_workers_per_gather = 4 # Replication wal_level = replica hot_standby = on max_wal_senders = 10 max_replication_slots = 10 hot_standby_feedback = on |