CentOS Stream 9 への PostgreSQL 16 インストール:プロダクション環境で「生き残る」ための秘訣

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

なぜ CentOS Stream 9 で PostgreSQL を使うのか?

最近、一連のシステムを CentOS 7 から CentOS Stream 9移行させました。その過程で、PostgreSQL を単に「動かす」だけなら簡単ですが、プロダクション環境で「快適に動かす」のは全く別物だと痛感しました。その違いは、SELinux、Firewalld、そしてアクセス権限をどう適切に扱うかにあります。

PostgreSQL は、高い信頼性が求められるシステムにおいて、粘り強く働く「働き者」のような存在です。CentOS Stream 9 と組み合わせることで、最新のカーネルと厳格なセキュリティを備えたモダンな基盤を構築できます。この記事は、Fintech 分野の DB クラスター を 6 ヶ月間実際に運用した経験に基づいています。SELinux のルールを一つ間違えるだけでシステムが停止してしまうような、シビアな現場での知見を凝縮しました。

クイックスタート:5分で PostgreSQL 16 をインストールする

テスト用に素早くインスタンスを構築する必要がある場合は、以下のコマンドを使用してください。現在はバージョン 16 が最も安定しているため、これを選択します。

# 1. PostgreSQL の公式リポジトリを追加
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# 2. 競合を避けるため、デフォルトの postgresql モジュールを無効化
sudo dnf -qy module disable postgresql

# 3. PostgreSQL 16 サーバーをインストール
sudo dnf install -y postgresql16-server

# 4. データベースを初期化
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb

# 5. サービスを有効化して起動
sudo systemctl enable postgresql-16
sudo systemctl start postgresql-16

systemctl status postgresql-16 コマンドで確認してください。緑色の active (running) という文字が表示されれば、第一段階は成功です。

プロダクション環境向けの実践的な設定

1. postgres アカウントのセキュリティ保護

デフォルトでは、PostgreSQL はローカル接続に peer 認証を使用します。これはシステムユーザーを完全に信頼する仕組みです。プロフェッショナルな管理を行うには、データベース内の postgres ユーザーに専用のパスワードを設定することをお勧めします。

sudo -u postgres psql
# psql インターフェース内で以下を入力:
ALTER USER postgres WITH PASSWORD 'あなたの非常に強力なパスワード';
\q

2. Firewalld の設定:無効化せず、正しくポートを開く

手間を省くために Firewall を無効化してしまう人が多いですが、CentOS Stream 9 において、これは致命的な間違いです。代わりに、安全を確保するために 5432 ポートだけを正確に開放しましょう。

# public ゾーンに postgresql サービスを追加
sudo firewall-cmd --permanent --add-service=postgresql

# 設定をリロードして変更を適用
sudo firewall-cmd --reload

3. SELinux への対応:システム管理者の悩みどころ

SELinux は、データベースが起動しなかったり、ログが書き込めなかったりする原因の筆頭です。この問題は、データ保存ディレクトリ(Data Directory)を外部ドライブ(例:/data/pgsql)に変更した際に最もよく発生します。

デフォルトのパスを変更した場合は、以下のコマンドを実行して SELinux コンテキストを更新してください。

sudo semanage fcontext -a -t postgresql_db_t "/data/pgsql(/.*)?"
sudo restorecon -Rv /data/pgsql

私の苦い経験から言えることは、SELinux は常に Enforcing モードにしておくべきだということです。エラー修正を面倒がって Permissive に変えてはいけません。SELinux を遵守することで、自動化された脆弱性スキャンからサーバーを守ることができます。

リモートアクセスの許可 (Remote Access)

デフォルトでは、PostgreSQL は localhost からsの接続のみをリッスンします。他のサーバーのアプリケーションからアクセスできるようにするには、2 つの設定ファイルを編集する必要があります。

postgresql.conf ファイルの修正

/var/lib/pgsql/16/data/postgresql.conf を開き、listen_addresses の行を探して以下のように修正します。

listen_addresses = '*' 

ヒント: * を使用すると、すべてのネットワークインターフェースでリッスンします。サーバーに内部ネットワーク用のプライベート IP がある場合は、セキュリティ向上のためにその IP を指定することをお勧めします。

pg_hba.conf ファイルの修正

これはログイン権限を制御するファイルです。/var/lib/pgsql/16/data/pg_hba.conf の末尾に以下の行を追加してください。

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             192.168.1.0/24          scram-sha-256

古い md5 よりも安全な scram-sha-256 の使用を推奨します。192.168.1.0/24 は、ご自身の内部 IP 範囲に置き換えてください。最後に、サービスを再起動します。

sudo systemctl restart postgresql-16

データベースをよりスムーズに動作させるための 4 つの注意点

以下は、深夜の緊急呼び出しを避けるための微調整のヒントです:

  • Shared Buffers の増量: PostgreSQL のデフォルト値は非常に低く(128MB)設定されています。RAM 8GB のサーバーであれば、通常は 2GB(RAM の 25% 相当)まで引き上げます。この変更により、データ読み取り速度が大幅に向上します。
  • スロークエリ (Slow Queries) の特定: postgresql.conflog_min_duration_statement500ms 程度に設定してください。この時間を超える実行の遅いクエリはすべて記録され、後の最適化が容易になります。
  • 自動バックアップ: ハードディスクの耐久性を過信しないでください。cronjob を使用して毎晩 pg_dump を実行しましょう。その後、バックアップファイルを別のサーバーや S3 ストレージに転送します。
  • パフォーマンス監視: 拡張機能 pg_stat_statements をインストールしてください。これは、どのクエリが最も CPU を消費しているかを調査するための強力なツールです。

セキュリティのルールをしっかりと把握していれば、CentOS Stream 9 への PostgreSQL のデプロイは難しくありません。重要なのは、OS の保護レイヤーを無効化するのではなく、OS と協調して動作させることです。安定したデータベースシステムの構築を応援しています!

Share: