VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
レプリケーションの仕組み
- ソースがトランザクションをコミットし、バイナリログに書き込みます。
- レプリカの I/O スレッドがソースに接続し、新しい binlog イベントを読み取り、ローカルのリレーログに書き込みます。
- レプリカの SQL スレッドがリレーログから読み取り、各イベントを実行します。
レプリカの構築
ソース側 —my.cnf でバイナリログを有効にし、一意のサーバー ID を設定します。
--source-data を付けた mysqldump で一貫性のあるスナップショットを取得します。
SOURCE_AUTO_POSITION = 1 は GTID ベースのレプリケーションを有効にします。GTID を使わない場合は、代わりに SOURCE_LOG_FILE と SOURCE_LOG_POS を指定します(値はスナップショットファイルのヘッダーにあります)。
GTID レプリケーション
グローバルトランザクション識別子(GTID)は、コミットされたすべてのトランザクションに一意の ID を割り当てます。これによりフェイルオーバーとレプリカの構築が簡単になります。binlog のファイル名と位置を追跡する代わりに、MySQL は各サーバーがどのトランザクションを適用済みかを追跡します。 ソースとレプリカの両方で 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 で包み、管理を容易にします。
group_replication プラグインで有効にします。設定はこのガイドの範囲外です。
レプリカによる読み取りのスケーリング
読み取りの多いクエリをレプリカに向けて、ソースの負荷を減らします。レプリケーションと代替手段の比較
レプリケーションは特定の問題をうまく解決しますが、他の問題には不適切なツールです。手を伸ばす前に、本当に合っているかを確認してください。
要約: 1 台のサーバーがすべての書き込みを処理し、読み取りのスケール、HA、またはウォームスタンバイが必要なとき、レプリケーションは正しい選択です。書き込みスループットがボトルネックなら、レプリケーションはその問題をすべてのレプリカにコピーします。シャーディングまたは分散データベースなら、問題を発生源で解決します。
レプリケーションの停止と開始
よくある質問
レプリケーションは MySQL のメジャーバージョンをまたいで機能しますか?
MySQL は古いソースから新しいレプリカへのレプリケーションをサポートしますが、その逆はサポートしません。常にソースより先にレプリカをアップグレードしてください。半同期レプリケーションと非同期レプリケーションの違いは何ですか?
非同期レプリケーション(デフォルト)では、ソースはどのレプリカの受信確認も待たずにコミットします。半同期レプリケーションでは、ソースはクライアントに応答を返す前に、少なくとも 1 つのレプリカがイベントの受信を確認するのを待ちます。半同期は、書き込みレイテンシがわずかに高くなる代わりに、ソース障害時のデータ損失のリスクを減らします。トラブルシューティング
関連項目
- MySQL のバイナリログ — レプリケーションがソースからレプリカへストリームするバイナリログ
- MySQL のバックアップ戦略 — 耐久性のためにレプリケーションを補完する戦略
- MySQL のリードレプリカ — このガイドで構築したレプリカの使い方