Skip to content

Read Replica

駆け出しの頃、MySQLのリードレプリカから読み取るコードを書いてバグを出した。

ユーザーがコメントを投稿した直後に画面をリロードする。書き込みはプライマリに行った。読み取りはレプリカに飛んだ。レプリケーションが追いついていない。自分が書いたコメントが見えない。「投稿できてない?」と問い合わせが来る。できている。レプリカが追いついていないだけだ。同期遅延の考慮が完全に抜けていた。

書き込みはプライマリに、読み取りはレプリカに分散する。Webのトラフィックは大半が参照系だから、レプリカを並べるだけでかなりスケールする。

あのバグを踏んでから、注意を払うようになった。INSERTした直後にレプリカで見つからなければプライマリに読みに行く。更新の即時反映が必要なら、そもそもレプリカから読まない。泥臭いが確実だった。Seconds_Behind_Source(昔は別の名前だった)を監視する習慣も身についた。

ちなみにMySQL 8.0ではPerformance Schemaでコミットのタイムスタンプを直接比較できるようになっている。マルチスレッドレプリケーションではSeconds_Behind_Sourceが不正確になることがあり、いまはそちらが推奨だ。名前が変わり、計測の方法が変わり、それでもやっていることは同じだ。レプリカがどれだけ遅れているかを計測している。

分散すればするほど整合性が遠くなる。CAPの定理がそう言っている。読むのは簡単だ。どこから読むかが難しい。

そしていつ読むかは、もっと難しい。