Postgresの「心臓の鼓動」を理解する:LSN(ログシーケンス番号)を味方につける話
やあ。データベースの深淵を覗き込んでいる君へ。
PostgreSQLを触っていると、たまに「LSN」という言葉を耳にしないか? `pg_wal` の中身を見たり、レプリケーションのラグを監視したりしていると、必ずと言っていいほどこの64ビットの数字と遭遇するはずだ。
正直に言おう。最初はただの「やたら長い16進数の羅列」に見えるかもしれない。でも、このLSNこそがPostgresというデータベースが「データの整合性を死守するための魂」なんだ。今日は、教科書的な説明はさらっと流して、実務でどう付き合っていくべきか、現場の視点で語らせてもらうよ。
—
LSNとは何か?―WALの「現在地」を指し示す指針
一言で言うと、LSNは 「WAL(Write Ahead Log)における位置情報」 だ。
Postgresはデータを更新する際、いきなりデータファイル(ヒープ)を書き換えるような無茶はしない。まずはWALというログに「何をしたか」を書き込み、その後でゆっくりとデータファイルを更新する(チェックポイントのタイミングでね)。
このとき、「WALのどこまで書き込んだか?」を管理しているのがLSNだ。
- 64ビットの整数値:単調増加する値。
- 役割:これが指し示す場所を基準にして、「どこまでリカバリが済んでいるか」「レプリカはどこまで追いついているか」を判定する。
もしPostgresが突然の停電でクラッシュしても、再起動した瞬間にPostgresは「最後に書き込んだLSN」と「データファイル上のLSN」を比較して、矛盾がないかを確認するんだ。これがWALリカバリの基本ルールさ。
—
実務でLSNを眺める瞬間
普段の運用で、僕たちがLSNを意識するのは大体この3つのシーンだ。
1. レプリケーションのラグ確認
マスターとスレーブの同期状態を見るとき、`pg_stat_replication` を見るよね。あそこに出てくる `replay_lsn` や `flush_lsn` を見て、「お、こいつはまだ20MB分くらい遅延してるな」と判断する。これができないと、障害対応時に「今切り替えて大丈夫か?」という重大な判断が下せない。
2. バックアップとリカバリ
「特定の時点(PITR: Point-in-Time Recovery)」まで戻したいとき、実は内部的にはこのLSNが基準になって動作している。バックアップツール(pgBackRestとかBarmanなど)は、このLSNを頼りに、どのWALファイルをどこまで適用するかを計算しているんだ。
3. データの不整合調査
たまに発生する「データが壊れた!」という緊急時。データページのヘッダーには、そのページが「いつ、どのLSNで最後に更新されたか」が刻まれている。WALとデータファイルを照らし合わせて、このLSNが一致しない場所を探すのが、トラブルシューティングの最終手段になる。
—
コードで触ってみる:今のLSNを知る方法
実際に、今君が触っているDBのLSNを見てみようか。以下のSQLを叩いてみてくれ。
— 現在のWAL挿入地点(最後に書き込んだ場所)
SELECT pg_current_wal_lsn();
— 特定のテーブルのデータページに含まれるLSNを確認する
— ※pageinspect拡張が必要だよ
CREATE EXTENSION IF NOT EXISTS pageinspect;
SELECT page_lsn
FROM page_header(get_raw_page(‘your_table_name’, 0));
この `page_lsn` がWALの最新のLSNより未来を指していたら……そう、それが「データ破損」のサインだ。逆にWALより過去なら、これからWALを適用して整合性を取らなきゃいけないんだな、と直感的に理解できるはずだ。
—
先輩からのアドバイス:LSNは「距離感」で捉えろ
後輩によく言うんだが、LSNをただの数字として見るな。「データベースの現在地から、どれだけ離れているか」という距離感として捉えるんだ。
- プライマリとの差分:これは「データ損失のリスク」に直結する。
- チェックポイントとの差分:これは「リカバリにかかる時間」を意味する。
LSNを理解しているエンジニアは、障害が起きたときに「あと何分で復旧するか」「どれくらいのデータが戻るか」を、勘ではなく数字に基づいて語れるようになる。これが「プロ」と「ただのオペレーター」の分かれ道だ。
—
最後に
LSNは難解そうに見えて、実は非常にロジカルで美しい仕組みなんだ。Postgresがなぜこれほどまでに信頼されているのか、その答えの一部がこの64ビットの数字に隠されている。
もし今度、監視ツールで `wal_lsn` のグラフが跳ね上がっているのを見たら、「今日もPostgresが懸命に整合性を守っているんだな」と少しだけ愛着を持ってやってくれ。
また何か気になったら聞いてくれ。データベースという広大な森の歩き方を、いつでも教えるよ。
コメント