
PostgreSQL Architecture - 4. 動作原理
https://blog.ex-em.com/1657
本稿では、PostgreSQL Architecture全般で扱った内容をもとに、コネクションの生成及びユーザー要請の処理、バックグラウンドProcessの動作方式などについて解説します。
コネクション作成プロセス
まず、ユーザーがPostgreSQLとコネクションを結び、リクエストを処理/返信する過程を確認してみましょう。
- postmasterプロセスはListenerの役割を果たし、クライアントからの新しい接続要請を待ちます。
- postmasterプロセスは、新しいクライアント接続要求に対する認証を行い、postgresプロセスを生成します。 この時、それぞれのプロセスにはwork_memのようなLocal Memoryが個別に割り当てられます。
- postgresプロセスがClientと接続されると、postmasterプロセスはClientとの接続を解除し、ClientはpostgresプロセスにSQL(Query string)を送信します。
- postgresプロセスは、受け取ったQueryを実行した後、クライアントに結果を返します。
📌 Clientとの接続が解除されたpostmaster プロセスは、他のClientからの新たな接続要求を待ちます。
新しい接続要請が来たら、その接続に対してpostgresプロセスを生成し、クライアントとの接続を解除することを繰り返します。
ユーザーリクエスト処理プロセス
postgres(Backend)プロセスは、データの読み書き時にDatabase BufferまたはRAMを使用します。 使用するメモリサイズは、postgresql.confのshared_buffersパラメータによって決定され、サーバ起動時に割り当てられます。
ユーザーの要求は、大きく単純読み取り作業(SELECT)および変更作業(DML)に分類できます。 どちらのリクエストも共通して下記の3段階の過程を経て、変更作業はさらに内部的に追加過程(4段階)を経ることになります。
- postgresプロセスは、DatabaseのShared Buffersで必要なData Blockを使用できるか確認します。
- Shared Buffersで見つからない場合は、OSに要請します。 OS Cacheに該当ブロックが存在する場合、該当ブロックをShared Buffersへ読み込む可能性があります。
- OS CacheにもDataがない場合、ディスク(Data ファイル)から希望するブロックをShared Buffersにキャッシュします。 この時、物理的なI/Oが発生します。
- ユーザーの要請が変更作業の場合、変更は共有バッファ内で行われ、変更データ(Dirty Data)及び変更ログは、今後の一定条件によってデータファイル及びWALファイルに同期されます。
プロセス動作過程
変更データの保存
先ほど、ユーザーの要請により変更されたデータはすべて共有バッファに適用されると話しました。 このような変更データは、いつかはDisk上に適用されなければなりません。このような役割を担うプロセスがBG WriterとCheckpointerです。
この二つのBackgroundプロセスは、Dirty状態のBlockをDataファイルに書き込む同期化作業を行います。それぞれのプロセスは以下のような条件を満たす場合、同期化作業を行います。
- BG Writer プロセスは、定期的に一定量のDirty BlockをData FilesにWriteします。
- Checkpointer プロセスは、チェックポイントが発生すると、すべてのDirty BlockをData FilesにWriteします。
📌 OracleのCKPTプロセスは、DBWnプロセスがDirty BufferをDataファイルに書き込むように命令する役割だけを遂行しますが、PostgreSQLのCheckpointerプロセスは、Dirty Blockを直接書き込む役割まで遂行します。
Transaction Logの管理
Checkpointer
前述のとおり、Checkpointerプロセスはチェックポイント発生時にDirty BlockをDataファイルに書き込む役割だけでなく、該当時点までのチェックポイントレコードをファイルに記録する役割も果たします。
- チェックポイント終了時点でWAL Bufferに、チェックポイント開始時点のLSN(Log Sequence Number)を含むWALレコードを追加します。
- 最後に完了したチェックポイントの表示を$PGDATA/global/pg_controlファイルにアップデートします。
システムダウンのような問題が発生した場合、pg_controlファイルでチェックポイントの開始位置を確認し、該当位置からWALファイルを読み取って復旧作業を行います。 復旧作業完了後、Checkpointerプロセスは復旧された状態を保護するためにチェックポイントを直ちに実行します。
WAL Writer & Archiver
WAL Writer
WAL Writer プロセスは、トランザクション Commit の時点、またはWAL Buffers がいっぱいになる時点で、WAL Buffers の内容をディスクに書き込み(フラッシュ)します。 該当WALファイルはDatabaseを復旧するために使用されます。
Archiver
Archiverプロセスは、WAL Segmentが切り替わる際に、該当のData(WALファイル)をキャプチャしてArchive領域にコピー(Archiveファイル)します。 Archiveファイルを利用してDatabase全体のバックアップとバックアップを行った後、特定時点(PITR:Point-In-Time-Recovery)で復旧することができます。