見出し画像

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を活用して作成しています。


いいなと思ったら応援しよう!