1つのPostgresクラスタの複数サービス共有は、無関係なサービスならデータベース分離を第一選択にする
アーキテクチャ
PostgreSQL
DB設計
知識
判断
コスト削減のために複数サービスを1つのPostgreSQLクラスタへ同居させる場合、分離の単位はPostgreSQL公式の指針に従って決める。
判断基準
- 互いに無関係なプロジェクト/サービス群は、同一クラスタ内で別々のデータベースに分離し、権限・アクセス制御をサービスごとに調整するのが公式推奨。
- スキーマ分離(同一データベース内の名前空間分割)は「相互に関連しリソースを共有すべきプロジェクト」向けの第二選択。同一プロダクト内のモジュール分割には合うが、無関係なサービスの同居には向かない。
- 隔離強度に明確な差がある: セッションは接続先データベースの境界を越えられないため、データベース分離の方がオブジェクトの分離が完全。スキーマ分離では同一データベース内の可視性・権限設定ミスの影響範囲が残る。
誤解しやすい点
- データベース分離してもクラスタ内で共有されるものが残る: ロール(ユーザー)はクラスタ全体で共有され、CPU・メモリ等の計算資源も共有される。1サービスの重いクエリが他サービスの性能に波及する問題は、どちらの分離方式でも解けない(それが問題になる規模ではクラスタ自体を分ける)。
- クロスデータベースアクセスは不可能ではなく、dblinkやpostgres_fdw相当の拡張を明示的に導入した場合のみ可能。導入しなければ境界は保たれる。
検証
サービスごとに専用ロールを作り、各ロールで他サービスのデータベースへ接続できないこと(接続権限が付与されていないこと)を確認する。バックアップ・リストアもデータベース単位で独立に行えることを確認しておくと、後の分離(クラスタ分割)が安くなる。