PostgreSQLのプロセスたち
Daily Blogging59日目
PostgreSQLって裏で色々動いてるんだなぁ
色々やってるプロセスたち
PostgreSQLに限った話じゃないが、RDBはクエリの実行以外にも色々制御が動いてる。
- 統計情報の収集
- バッファの管理
- ストレージへの書き込み制御
などなど
これらの制御にはそれぞれの担当プロセスが存在しているよ
PostgreSQLはいわゆるマルチプロセス方式なのだ
マスタサーバプロセス
PostgreSQLにはいくつかのプロセスが存在しているが、その子達は一つの親プロセスからforkされた子プロセスである。
その親となるのが、マスタサーバプロセス
ライタプロセス
postgreSQLはデータの更新をすぐにディスクに書き込みに行くわけじゃなく、shared buffersと呼ばれる領域に一時的に保存しておく。
そのデータをディスクにこまめに書き込みにいくのがライタプロセス
書き込むデータは、LRUアルゴリズムから算出したもの
WALライタプロセス
WAL = Write Ahead Logging
WALバッファに格納されているWALをWALファイルに書き込みに行くプロセスが、WALライタプロセス
PostgreSQLの場合、データの変更をディスクに書き込む前に先に更新履歴をログに書き込むようになっている。
ログに残しておくことで、仮にDBがクラッシュしてもそのログから変更を反映できる。
いわゆる持続性に関する機能である。
チェックポイントプロセス
ライタプロセスと同様、shared buffersにあるデータをディスクに書き込みにいく。
ライタプロセスと異なる点は2点ある。
- shared buffersにある変更データを全てディスクに書き込みに行く
- ここまでの変更は確定済みですよっていうチェックポイントを書き込む
ディスクにデータを書き込むことでそこまでの変更を確定させ、
仮にクラッシュした場合はここから先の変更を反映しなおしてねというセーブポイント的なものを記録してくれるのがチェックポイントプロセス
自動バキュームランチャと自動バキュームワーカプロセス
設定に従って、自動バキュームを実行するワーカーを起動するためのプロセスが自動バキュームランチャプロセス
自動バキュームワーカは、テーブルに対してバキュームとANALIZEを実行し、デッドタプルの回収と統計情報の更新を行う
ちなみに、バキューム処理は統計情報を参照して必要に応じて処理を行う
統計情報コレクタプロセス
一定間隔でDBの活動状況を集めるプロセスのこと
色々情報を収集するが、例えば
- インデックスの使用頻度
- テーブルの更新情報
- クエリの実行回数
などなど
収集した情報は、pg_stat_** というテーブルに格納されく
pg_stat_user_indexesとか
バックエンドプロセス
クライアントから接続要求をされた時に動くプロセス
SQLの実行はここのプロセスで行われる
まとめ
いつもこれだけのプロセスに支えられて動いてたんだね
感謝感謝
Discussion