Docker ComposeでPgpool-IIの構築ガイド
はじめに
この記事では、Docker Composeを使用してPgpool-IIとPostgreSQLをセットアップする方法を紹介します。Pgpool-IIは、PostgreSQLに対する接続の負荷分散やフェイルオーバー機能を提供するミドルウェアです。今回は、特にUbuntu 20.04ベースのカスタムDockerイメージを使用してPgpool-IIを構築し、その過程で発生し得る問題とその解決方法についても触れます。
構成概要
今回のセットアップでは、以下のコンポーネントをDocker Composeで管理します:
PostgreSQL 16(1インスタンス)
Pgpool-II(1インスタンス)
ステップ1: プロジェクトのディレクトリ構造を作成
プロジェクト用のディレクトリを作成し、必要なファイルやフォルダを準備します。
mkdir pgpool-docker
cd pgpool-docker
mkdir -p .docker/pgpool
touch docker-compose.yml
touch .docker/pgpool/Dockerfile
touch .docker/pgpool/pgpool.conf
touch .docker/pgpool/pool_hba.conf
touch .docker/pgpool/wait-for-db.sh
touch .docker/pgpool/pool_passwd
touch .docker/pgpool/.pgpoolkey
ステップ2: Docker Composeファイルの作成
以下は、docker-compose.ymlファイルの内容です。
version: '3'
services:
postgres:
image: postgres:16-alpine
ports:
- "5432:5432"
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: testdb
volumes:
- postgres:/var/lib/postgresql/data
pgpool:
build:
context: .
dockerfile: ./.docker/pgpool/Dockerfile
ports:
- "5433:5433"
volumes:
- pgpool:/var/run/postgresql
depends_on:
- postgres
volumes:
postgres:
pgpool:
ステップ3: PgpoolのDockerfileを作成
次に、Pgpool-IIのカスタムDockerイメージをビルドするためのDockerfileを作成します。
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y pgpool2 postgresql-client vim && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
COPY ./.docker/pgpool/pgpool.conf /etc/pgpool2/pgpool.conf
COPY ./.docker/pgpool/pool_hba.conf /etc/pgpool2/pool_hba.conf
COPY ./.docker/pgpool/wait-for-db.sh /wait-for-db.sh
COPY ./.docker/pgpool/pool_passwd /etc/pgpool2/pool_passwd
COPY ./.docker/pgpool/.pgpoolkey /root/.pgpoolkey
RUN mkdir -p /var/log/pgpool/oiddir && \
chmod 700 /var/log/pgpool/oiddir
RUN chmod 600 /root/.pgpoolkey
RUN chmod +x /wait-for-db.sh
EXPOSE 5433
ENTRYPOINT ["/wait-for-db.sh"]
CMD ["pgpool", "-n"]
ステップ4: Pgpoolの設定ファイルを作成
.pgpoolkeyファイルの準備とパスワードのハッシュ化
pg_md5を使用してパスワードをハッシュ化する際に、pg_md5コマンドが.pgpoolkeyファイルを必要とします。このファイルには、Pgpool-IIのハッシュ化に使用されるキーが保存されます。以下の手順で、事前に.pgpoolkeyを準備し、Pgpool-IIの機能を使ってパスワードのハッシュ化を行います。
まず、pg_md5コマンドを実行する前に、.pgpoolkeyファイルを作成します。
echo "your-secret-key" > .pgpoolkey
chmod 600 .pgpoolkey
次に、以下のコマンドを実行して、pool_passwdファイルにパスワードのハッシュを生成します。
pg_md5 -m -f .pgpoolkey -u user password
生成されたハッシュをpool_passwdファイルに追記します。
user:<hashed-password>
このpool_passwdファイルを、DockerfileのCOPY命令を使ってコンテナ内にコピーします。
Pgpool-II設定ファイルの作成
以下に、pgpool.confとpool_hba.confの設定例を示します。
# pgpool.conf
listen_addresses = '*'
port = 5433
backend_hostname0 = 'postgres'
backend_port0 = 5432
backend_weight0 = 1
enable_pool_hba = on
pool_passwd = '/etc/pgpool2/pool_passwd'
# pool_hba.conf
host all all 0.0.0.0/0 md5
ステップ5: Pgpoolが正常に終了しない問題の対処
Pgpool-IIが正常に終了しないと、PIDファイルが残り、コンテナの再起動ができなくなる問題があります。この問題を防ぐために、Pgpool-IIの終了処理を明示的に行うスクリプトを追加します。
#!/bin/bash
# wait-for-db.sh
set -e
trap 'rm -f /var/run/postgresql/pgpool.pid; exit 0' SIGTERM SIGINT
host="$1"
shift
cmd="$@"
until pg_isready -h "$host"; do
>&2 echo "Postgres is unavailable - sleeping"
sleep 1
done
>&2 echo "Postgres is up - executing command"
exec $cmd
このスクリプトでは、コンテナが停止される際にPIDファイルを削除する処理を追加しています。これにより、Pgpool-IIが正常に終了し、再起動が問題なく行えるようになります。
ステップ6: Gitリポジトリでの改行コードの管理
チーム開発でGitを使用する場合、Windows環境で.shファイルがチェックアウトされると、改行コードが自動的にCRLFに変換されることがあります。しかし、Linux環境ではLFが必要です。wait-for-db.shファイルがCRLFのままだと、コンテナ内でスクリプトが正常に実行されなくなります。
この問題を防ぐために、.gitattributesファイルをプロジェクトのルートディレクトリに追加し、シェルスクリプトの改行コードをLFに固定します。
echo "*.sh text eol=lf" > .gitattributes
これにより、.shファイルが常にLFで保存され、どの環境でも正しく動作するようになります。
ステップ7: クラスタの起動
すべての設定が完了したら、Docker Composeを使ってPgpool-IIとPostgreSQLのコンテナを起動します。
docker-compose up -d
ステップ8: 接続の確認
Pgpool-II経由でPostgreSQLに接続できるか確認します。psqlコマンドを使用してPgpool-IIに接続します。
psql -h localhost -p 5433 -U user -d testdb
接続に成功したら、psql内で\lコマンドなどを使ってデータベースが正しく設定されていることを確認します。
おわりに
この記事では、Docker Composeを使用してPgpool-IIとPostgreSQL 16の環境を構築する方法に加え、構築時に直面しやすい問題とその解決方法を紹介しました。また、チーム開発におけるシェルスクリプトの改行コード問題を防ぐための.gitattributesファイルの設定についても触れました。Pgpool-IIの機能を活用することで、パスワードのハッシュ化やPIDファイルの管理が効率的に行え、より堅牢な環境を構築することが可能です。
※この記事は、自分の作業メモをもとにAIを活用して作成しています。