サービスが成長するに従って、既存のクラスタにリードレプリカを追加する必要性は必ず生じる。そのときどうやって新しいリードレプリカにリーダーのデータを複製するか?
単にデータファイルをコピーするだけでは、コピー中に生じる差分を吸収できない。かといってコピー中に書き込みをブロックするのは、可用性を犠牲とすることとなるのでスマートな解決策とはいいがたい。
これについてはこうあるべきという合意された答えがある。それをそのまま紹介する。こういうことになる。
- リーダーのスナップショットを作成する
- スナップショットからリードレプリカを作成する
- 作成完了したリードレプリカは運用開始前にリーダーノードに接続する
- リードレプリカはスナップショット作成時点から現在まで生じたレプリケーションログをリクエストする
- レプリケーションログから最新のデータ状態を構築し終え次第、リードレプリカは通常の運用を開始する