【実務・中級編】 LSN(ログシーケンス番号) – PostgreSQL

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が懸命に整合性を守っているんだな」と少しだけ愛着を持ってやってくれ。

また何か気になったら聞いてくれ。データベースという広大な森の歩き方を、いつでも教えるよ。

コメント

タイトルとURLをコピーしました