メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
MySQL レプリケーションは、1 台のサーバー(ソース)から 1 台以上のサーバー(レプリカ)へ変更をコピーします。ソースはすべての変更をバイナリログに書き込み、各レプリカはそのログを読んで変更を再生します。レプリケーションは、読み取りのスケーリング、高可用性、および地理的分散の土台です。

レプリケーションの仕組み

  1. ソースがトランザクションをコミットし、バイナリログに書き込みます。
  2. レプリカの I/O スレッドがソースに接続し、新しい binlog イベントを読み取り、ローカルのリレーログに書き込みます。
  3. レプリカの SQL スレッドがリレーログから読み取り、各イベントを実行します。
これはデフォルトで非同期です。ソースはレプリカが受信を確認するのを待ちません。レプリカはソースより遅れることがあります。

レプリカの構築

ソース側 — my.cnf でバイナリログを有効にし、一意のサーバー ID を設定します。
レプリケーションユーザーを作成します。
--source-data を付けた mysqldump で一貫性のあるスナップショットを取得します。
レプリカ側 — 異なるサーバー ID を設定します。
スナップショットを復元し、レプリケーションを開始します。
SOURCE_AUTO_POSITION = 1 は GTID ベースのレプリケーションを有効にします。GTID を使わない場合は、代わりに SOURCE_LOG_FILE と SOURCE_LOG_POS を指定します(値はスナップショットファイルのヘッダーにあります)。

GTID レプリケーション

グローバルトランザクション識別子(GTID)は、コミットされたすべてのトランザクションに一意の ID を割り当てます。これによりフェイルオーバーとレプリカの構築が簡単になります。binlog のファイル名と位置を追跡する代わりに、MySQL は各サーバーがどのトランザクションを適用済みかを追跡します。 ソースとレプリカの両方で GTID を有効にします。
GTID が有効なら、必要なのは SOURCE_AUTO_POSITION = 1 だけです。MySQL はレプリカに欠けているトランザクションを割り出し、自動的に再生します。

レプリケーションの監視

注目すべき主なフィールドは次のとおりです。 レプリケーションが機能しているためには、Replica_IO_Running と Replica_SQL_Running の両方が Yes でなければなりません。

レプリケーションラグ

レプリケーションラグは、レプリカの SQL スレッドがソースの書き込み速度に追いつけないときに発生します。よくある原因は次のとおりです。
  • アプライヤの並列度: MySQL 8.4 はデフォルトですでにイベントを並列に適用します。replica_parallel_workers は 4、replica_parallel_type は LOGICAL_CLOCK です。それでもレプリカが遅れる場合はワーカー数を増やします。
  • レプリカ上の長時間実行クエリ: 行をロックするクエリは SQL スレッドをブロックします。
  • ネットワークレイテンシ: I/O スレッドが遅いと、SQL スレッドの仕事がなくなります。
  • レプリカのディスク I/O: リレーログまたはデータファイルの同期がボトルネックです。

レプリケーションのアーキテクチャ

デフォルトの構成、つまり 1 つのソースと 1 つ以上の非同期レプリカは、唯一の選択肢ではありません。MySQL は、一貫性と可用性のトレードオフが異なるいくつかのレプリケーションアーキテクチャを提供します。 それぞれを使う場面:
  • 非同期レプリケーション — 多少のラグが許容できる、読み取りのスケーリングと災害復旧用レプリカのための正しいデフォルトです。
  • 半同期 — ソース障害に対する耐久性の保険が必要だが、グループレプリケーションの運用上の複雑さは許容できない場合です。書き込みコミットごとに約 1 回のネットワーク往復が加わります。
  • グループレプリケーション / InnoDB Cluster — 自動フェイルオーバーが必要で、書き込みレイテンシの増加を許容できる場合です。InnoDB Cluster はグループレプリケーションを MySQL Router と MySQL Shell で包み、管理を容易にします。
注: グループレプリケーションでは、すべてのテーブルが InnoDB を使い、主キーを持つ必要があります。group_replication プラグインで有効にします。設定はこのガイドの範囲外です。

レプリカによる読み取りのスケーリング

読み取りの多いクエリをレプリカに向けて、ソースの負荷を減らします。
アプリケーションはレプリケーションラグを許容しなければなりません。レプリカには、数ミリ秒前にソースで挿入された行がまだないことがあります。最新の書き込みを反映しなければならない読み取りは、ソースに接続します。

レプリケーションと代替手段の比較

レプリケーションは特定の問題をうまく解決しますが、他の問題には不適切なツールです。手を伸ばす前に、本当に合っているかを確認してください。 要約: 1 台のサーバーがすべての書き込みを処理し、読み取りのスケール、HA、またはウォームスタンバイが必要なとき、レプリケーションは正しい選択です。書き込みスループットがボトルネックなら、レプリケーションはその問題をすべてのレプリカにコピーします。シャーディングまたは分散データベースなら、問題を発生源で解決します。

レプリケーションの停止と開始

失敗した 1 つのイベントをスキップするには(慎重に使ってください。イベントのスキップはレプリカの乖離を引き起こします):

よくある質問

レプリケーションは MySQL のメジャーバージョンをまたいで機能しますか?

MySQL は古いソースから新しいレプリカへのレプリケーションをサポートしますが、その逆はサポートしません。常にソースより先にレプリカをアップグレードしてください。

半同期レプリケーションと非同期レプリケーションの違いは何ですか?

非同期レプリケーション(デフォルト)では、ソースはどのレプリカの受信確認も待たずにコミットします。半同期レプリケーションでは、ソースはクライアントに応答を返す前に、少なくとも 1 つのレプリカがイベントの受信を確認するのを待ちます。半同期は、書き込みレイテンシがわずかに高くなる代わりに、ソース障害時のデータ損失のリスクを減らします。

トラブルシューティング

関連項目