レプリケーション れぷりけーしょん
可用性スタンバイプライマリフェイルオーバー冗長化読み取りスケール
レプリケーションについて教えて
簡単に言うとこんな感じ!
レプリケーションは「DBの分身をリアルタイムで作り続ける」仕組みだよ! 本番DBで何か起きても分身(レプリカ)に即切り替えられるし、読み取り専用クエリは分身に流して本番DBの負荷を下げることもできる。「コピーを常に持っておく」安心感の技術なんだ!
レプリケーションとは
レプリケーション(Replication)とは、あるDBサーバー(プライマリ / マスター)のデータ変更を、別のサーバー(レプリカ / スタンバイ / スレーブ)にリアルタイムまたは定期的に反映し続けることで、データの複製を維持する仕組みです。
主な目的は2つあります。1つ目は高可用性(HA):プライマリが障害を起こしたとき、レプリカへ自動切り替え(フェイルオーバー)することでサービス停止時間を最小化します。2つ目は読み取りスケールアウト:SELECT クエリをレプリカへ分散させることでプライマリの負荷を下げ、スループットを向上させます。
レプリケーションには同期レプリケーション(プライマリとレプリカ両方へのコミット確認後にOKを返す)と非同期レプリケーション(プライマリへのコミット後すぐOKを返し、レプリカへの反映は後で行う)があります。同期は安全だが遅く、非同期は速いが障害時にわずかなデータロストが起きる可能性があります。
レプリケーションの種類
| 種類 | 仕組み | 特徴 |
|---|---|---|
| ストリーミングレプリケーション | WAL(書き込みログ)をリアルタイムに転送 | PostgreSQLの標準方式。低遅延 |
| ロジカルレプリケーション | SQL操作レベルで変更を転送 | 特定テーブルのみ・バージョンをまたいだ複製が可能 |
| バイナリログレプリケーション | バイナリログをレプリカに転送 | MySQLの標準方式 |
| マルチプライマリ | 複数サーバーがすべて書き込み可能 | 可用性最高だが競合解決が複雑 |
歴史と背景
- 1990年代:Oracleがデータガード(Data Guard)として高度なレプリケーション機能を商用実装
- 2000年代初頭:MySQLのバイナリログレプリケーションがWebサービスの読み取りスケールアウトで広く普及
- 2004年:PostgreSQL 8.0 でウォームスタンバイ(ログシッピング)が実装
- 2010年:PostgreSQL 9.0 でストリーミングレプリケーション(WAL転送)が実装。大幅に使いやすくなる
- 2016年:PostgreSQL 10 でロジカルレプリケーションが実装
- 現在:クラウドDBサービス(RDS Multi-AZ・Aurora・Cloud SQL等)がレプリケーションを自動設定・管理するため、利用者はほとんど意識せずに高可用性を確保できる
関連する規格・RFC
| 規格 | 内容 |
|---|---|
| PostgreSQL WAL | Write-Ahead Loggingによるレプリケーション(ストリーミング・ロジカル) |
| MySQL Binlog | バイナリログによるレプリケーション仕様 |
関連用語
- シャーディング — データを複数DBに分散して書き込みも水平スケールする技術
- バックアップ・リストア — DBのデータを保護・復元する仕組み
- ポイントインタイムリカバリ — WALを活用した任意時点への復元技術
- ACID特性 — 同期/非同期レプリケーションの選択に関わる耐久性の考え方
- トランザクション — 一連のDB操作をひとまとめに扱う仕組み
- コネクションプール — プライマリ/レプリカへの接続振り分けにも活用される
- NoSQL — 水平スケールを得意とするNoSQLとのレプリケーション戦略の違い