レプリケーション 8.0.x | MySQL
レプリケーションとは
MySQL サーバ(ソース)のデータを別の MySQL サーバ(レプリカ)にコピーする。
レプリケーションの用途
用途はいくつかあるが代表的なものを記載する。
- 読み取り専用
- アップグレード
- フェイルオーバー
アップグレード
ここではアップグレードについて少し詳しく記載する。
- 既存 MySQL サーバーから mysqldump などを使って論理バックアップする
- アップグレード先 MySQL サーバーにリストアする
- 既存 MySQL サーバー(ソース)からアップグレード先 MySQL サーバー(レプリカ)にレプリケーションを組む
- レプリケーションが組まれるとソースの更新がアップグレード先であるレプリカに同期されるのでレプリカのデータを最新に保つことができる
- アップグレード先 MySQL (レプリカ)サーバーをソースに昇格
- 昇格したソースに書き込みを許可
- アプリケーションの接続先を昇格したソース(アップグレード先)に切り替える
レプリケーションのアーキテクチャ
- シングルスレッド方式
- MTA (マルチスレッドアプライアー)方式
基本的な仕組みはシングルスレッド方式 / MTA 方式でおおきな違いはない。
共通部分の説明をする。
- ソースで INSERT や UPDATE などのコミットが発生( ≒ イベントが発行される)
- 発行イベントは
バイナリログに書き込まれる(バイナリログをディスクに同期するかは sync_binlog 次第 ) - バイナリログの内容がレプリカのリレーログに書き込まれる
- リレーログの更新をレプリカに適用する
レプリケーションの種類
シングルスレッド方式、 MTA 方式によらずレプリケーションにはバイナリログのポジションを利用したレプリケーション(ポジションレプリケーション)と GTID を利用したレプリケーションの 2 種類がある。 どちらもレプリケーションを開始するに位置に関する機能。
バイナリログ
レプリケーション
前提
| 役割 | ホスト( Docker Composer Service ) | ポート | MySQL バージョン | 文字コード |
|---|---|---|---|---|
| ソース | db-source | 3306 | MySQL 8.0.36 | utf8mb4 |
| レプリカ | db-replica | 3306 | MySQL 8.0.36 | utf8mb4 |
作業
1. フルバックアップ(ソース)
ソースからフルバックアップを取得(ポジションレプリケーション)。
mysqldump -h db-source -P 3306 -u root -p --single-transaction --default-character-set=utf8mb4 --source-data=2 --routines --triggers --events --hex-blob --all-databases > source.dump
2. リストア(レプリカ
レプリカにリストア。
mysql -h db-replica -u root -p < source.dump
3. レプリケーション設定(レプリカ)
レプリカでレプリケーション設定する。
CHANGE REPLICATION SOURCE TO SOURCE_HOST='db-source', SOURCE_PORT=3306, SOURCE_USER='root', SOURCE_PASSWORD='password', SOURCE_LOG_FILE='binlog.000002', SOURCE_LOG_POS=157;
4. レプリケーション開始(レプリカ)
START REPLICA;
5. レプリケーション確認
SHOW REPLICA STATUS\G
カラム Replica_IO_Running, Replica_SQL_Running の両方が Yes ならレプリケーションが正常に稼働している。
用語
- トランザクションの ACID ref. 【データベース】ACIDについて改めてまとめてみる
- collation : 照合(順序) ref. 【MySQL】照合順序とは?