PostgreSQL Replication / Docker

PostgreSQLのレプリケーションをDockerで構築してみました。

PostgreSQL Replication

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 run など実行結果

設定変更反映は再起動

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

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

pg_hba.conf

・Replica

postgresql.conf