初めに
僕が初めて実務の中でPostgreSQLに触れたときに、WAL(Write-Ahead Logging)という単語を知りました。
調べてドキュメントを読むもいまいち理解ができません。
同じような人に理解ができるようにまとめていきます。
この記事で得られること
この記事を読み終えることで以下のメリットがあります。
- WALについて理解が深まる
- PostgreSQLを触ってみたくなる
課題
WALとは何か?
データベースシステムにおける重要な概念で、データの整合性と回復性を保つためのメカニズム。と言われてもよくわかりません。でも重要ということなので理解をしておいた方がいいのは間違い無いです。
WALとは?
ドキュメントには下記のように書かれています。
ログ先行書き込み(WAL)はデータの一貫性を確実にするための標準的な手法です。
何を言っているのかよくわかりませんね
WALとはどういう概念?食べれるの?みたいな感じの疑問はやまないです。
WALを理解するのにはRDBMSのログについて理解を深める必要がありました。
データベースでの「ログ」
そもそもログとは?
語源は「丸太」を船の船首から海に流して、船尾まで流れる時間を砂時計や初期の機械式時計で計測し、船の速さを測ったことからその記録をログと呼ぶようになった。
ログについてはわかりました。
データベースでのログはとても重要な役割を担っています。
これまで自分は以下のようなイメージで更新が行われていると考えてました。
ただ、これだとデータベースとしての性能がガタ落ち
高速化させるためにメモリを活用していました。
ただ、メモリ上で更新されたとしても万が一、commitした後にディスクに書き込むまでの間でトラブルがあればデータは消えるし、commitのたびにディスクへの書き込みが大量に発生すると性能も劣化します。
ここで使われるのがログ
トランザクションの開始・終了とデータの変更情報のログを先にディスクへ記録することで、ディスクへの書き込み時間を減らして高速化を図ることができます。
トランザクションの開始・終了とデータの変更情報のログを先にディスクへ記録すること
これがWALです。
トランザクションが開始、データの変更が行われるとWALバッファに書き込まれます。
commit(他のタイミングもあり)されるとWALバッファからWALファイルへ書き出しが行われます。
同時に実際のデータファイルも更新が反映されます。
まとめ
WALについて理解できたでしょうか?
他にもWALを使った機能(ストリーミングレプリケーションなど)があるのでそれについては別途まとめていきます。
今回は前段階としてWALそのものの理解を深めました。
参考