このすみノート

Webエンジニアが技術や趣味を書くブログです。

内部構造から学ぶPostgreSQL 1〜3章

内部構造から学ぶPostgreSQL 1〜3章の読書メモです。

はじめに

  • PostgreSQL 15の新機能
    • 論理レプリケーションの改善
    • MERGE文のサポート: UPSERTの進化系で、DELETEにも対応
    • オンラインバックアップ機能の改善
    • セキュリティの改善: publicスキーマへのアクセス権限が制限される
  • 日本PostgreSQL

[基本編] 1章 PostgreSQL超入門

  • PostgreSQLは、リレーショナルデータベースとオブジェクトデータベースの能力を兼ね備えたオブジェクトリレーショナルデータベースに分類される
  • オブジェクトデータベース機能として、ユーザー定義によりさまざまな機能拡張が可能。この拡張性は開発初期から備わっており、PostgreSQLの大きな特徴を示すものになっている
  • PostgreSQLは基本的に年に一回のメジャーバージョンアップがされる
  • 異なるメジャーバージョンでは、データベースを構成するファイルに互換性がない
  • メジャーバージョンのサポート期間は5年

[基本編] 2章 アーキテクチャの基本

  • PostgreSQLは複数プロセスを動作させることで、複雑な制御を可能としている
  • バックエンドプロセス: クエリ、結果の送受信は、クライアントごとのバックエンドプロセスで行われる
  • 共有メモリ
    • shared_buffers: テーブルやインデックスのデータをキャッシュする領域
    • wal_buffers: ディスクに書き込まれていないトランザクションログをキャッシュする領域
    • 可視性マップ: バキューム処理の高速化、インデックスオンリースキャンの高速な検索方法で使用
  • work_mem: 並び替えとハッシュテーブル操作のためにクエリ実行時に使われる。1つのクエリで複数回行われる場合は、該当する処理ごとに設定した領域が確保される
  • temp_buffers: バックエンドプロセスごとに作成される。CREATE TEMP TABLEで使う
  • WALファイル: 更新操作を記録するファイル。pg_walディレクトリ配下に格納。データベースの永続性保証やリカバリで重要な役割を果たす。max_wal_sizeに設定したサイズ程度が生成。

[基本編] 3章 各種設定ファイルと基本設定

  • postgresql.conf: PostgreSQL全体の動作を制御する
  • pg_hba.conf: クライアントからの接続を制御する
  • pg_ident.conf: ident認証およびGSSAPI認証で使用される
  • recovery.conf: アーカイブリカバリ用の設定ファイル
  • 同じ設定項目を複数記述した場合、後ろに記述されているほうが有効とみなされる
  • 設定項目と設定値は、SHOWコマンドで確認できる
# postgresql.confファイル
include 'memory.conf'
# memory.confファイル
# Memory Settings
shared_buffers = 512MB
work_mem = 64MB
  • ALTER SYSTEM
    • PostgreSQL 9.4以降で、postgresql.confの直接編集のほか、ALTER SYSTEMというSQLコマンドで設定内容を変更することが可能になった
    • ALTER SYSTEM のSET による設定変更で、postgresql.auto.confが更新される
    • 設定の再ロード(pg_ctl reload)や、サーバの再起動(pg_ctl restart)で反映される
  • ALTER SYSTEMとpostgresql.conf の変更が両方行われていたら、ALTER SYSTEMが優先される
  • pg_hba.conf
    • 接続認証ファイル
    • 設定の再ロード(pg_ctl reload)で反映
# pg_hba.confファイルの記述例
# local DATABASE USER METHOD [OPTIONS]
# host DATABASE USER ADDRESS METHOD [OPTIONS]
# hostssl DATABASE USER ADDRESS METHOD [OPTIONS]
# hostnossl DATABASE USER ADDRESS METHOD [OPTIONS]
local all postgres trust
host all postgres localhost trust
host db1,db2 admin 192.168.100.10 scram-sha-256
host db1 user1 192.168.100.0/24 scram-sha-256
host db2 user2 192.168.100.0/24 scram-sha-256
  • 接続要求時には上から順に評価されるので、先に範囲を狭めた緩い認証方式を記述する
# 適切な設定
local all all trust
host all all 192.168.100.10/32 trust
host all all 192.168.100.0/24 scram-sha-256
# 不適切な設定
host all all 192.168.100.0/24 scram-sha-256
host all all 192.168.100.10/32 trust
local all all trust
  • 接続方式: local (UNIXドメインソケット)、host (TCP/IP、SSL通信の有無は問わない)、hostssl (SSL通信のみ)、hostnossl (SSLを用いない通信)
  • SSL接続: OpenSSLがサーバーとクライアント両方にインストールされていること。ビルド時に、SSL接続を有効にするオプション (--with-openssl)を付与していること。postgresql.confで、sslパラメータをonにして起動していること
  • 認証方式: パスワード文字列のハッシュを送信する「scram-sha-256」が無難。「trust」は、外部から隔離されたネットワーク内で使用する