MySQL マスタースレーブレプリケーションの実践の詳細説明 - GTID ベースのレプリケーション

MySQL マスタースレーブレプリケーションの実践の詳細説明 - GTID ベースのレプリケーション

GTIDベースのレプリケーション

導入

GTID ベースのレプリケーションは、MySQL 5.6 以降に追加された新しいレプリケーション方法です。

GTID(グローバル トランザクション識別子)はグローバル トランザクション ID であり、マスター データベースで送信された各トランザクションがクラスター内で一意の ID を持つことを保証します。

オリジナルのログベースのレプリケーションでは、スレーブは増分同期に使用するオフセットをマスターに伝える必要があります。指定が間違っていると、データが失われ、データの不整合が発生します。

GTID ベースのレプリケーションでは、スレーブ データベースは実行されたトランザクションの GTID 値をマスター データベースに通知し、マスター データベースは実行されていないすべてのトランザクションの GTID のリストをスレーブ データベースに返します。また、指定されたスレーブ データベースで同じトランザクションが 1 回だけ実行されることが保証されます。

実際の戦闘

1. マスターデータベースにレプリケーションアカウントを作成し、権限を付与する

GTID ベースのレプリケーションでは、スレーブで実行されていないトランザクションが自動的に再生されるため、他のスレーブに同じアカウントを作成しないでください。同じアカウントを作成すると、レプリケーション リンクでエラーが発生する可能性があります。

mysql> '123456' で識別される 'repl'@'172.%' のユーザーを作成します。

運用中のパスワードは、一定のパスワード強度を達成するために関連する仕様を満たす必要があり、マスター データベースにはスレーブ データベース上の特定のネットワーク セグメントからのみアクセスできる必要があることに注意してください。

mysql> *.* のレプリケーションスレーブを 'repl'@'172.%' に付与します。

ユーザーを表示

mysql> mysql.user からユーザーとホストを選択します。
+-----------+------------+
| ユーザー | ホスト |
+-----------+------------+
| プロンテラ | % |
| ルート | % |
| mysql.sys | ローカルホスト |
| ルート | ローカルホスト |
+-----------+------------+
セット内の 4 行 (0.00 秒)

承認を表示

mysql> repl@'172.%' の権限を表示します。
+--------------------------------------------------+
| repl@172.% の助成金 |
+--------------------------------------------------+
| *.* のレプリケーションスレーブを 'repl'@'172.%' に付与 |
+--------------------------------------------------+
セット内の 1 行 (0.00 秒)

2. マスターデータベースサーバーを構成する

[mysqld]
log_bin = /var/log/mysql/mysql-bin
log_bin_index = /var/log/mysql/mysql-bin.index
binlog_format = 行
サーバーID = 101
gtid_mode = オン
強制GTID一貫性 = オン
#log_slave_updates = オン

注: ログをデータから分離し、できれば異なるデータ パーティションに分けることをお勧めします。

強制_gtid_consistencyはGTIDの一貫性を強制します。有効にすると、次のコマンドは使用できません。

テーブルを作成...選択...

mysql> テーブル dept を作成し、 departments から * を選択します。
エラー 1786 (HY000): ステートメントが GTID 一貫性に違反しています: CREATE TABLE ... SELECT。

これらは実際には2つの独立したイベントであるため、最初にテーブルを作成し、そのテーブルにデータを挿入するために分割することしかできません。

一時テーブルを作成する

一時テーブルはトランザクション内では作成できません

mysql> 開始します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> 一時テーブル dept(id int) を作成します。
エラー 1787 (HY000): ステートメントが GTID の一貫性に違反しています: CREATE TEMPORARY TABLE および DROP TEMPORARY TABLE は、トランザクション コンテキスト外でのみ実行できます。関数とトリガーも複数ステートメントのトランザクションと見なされるため、これらのステートメントは関数またはトリガーでも許可されません。

同じトランザクションでトランザクションテーブルと非トランザクションテーブルを更新する (MyISAM)

mysql> テーブル `dept_innodb` を作成します (id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT);
クエリは正常、影響を受けた行は 0 行 (0.04 秒)

mysql> テーブル `dept_myisam` を作成します (id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE = `MyISAM`;
クエリは正常、影響を受けた行は 0 行 (0.03 秒)

mysql> 開始します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> dept_innodb(id) 値(1) に挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> dept_myisam(id) に値(1) を挿入します。
エラー 1785 (HY000): ステートメントが GTID の一貫性に違反しています。非トランザクション テーブルへの更新は、自動コミット ステートメントまたは単一ステートメント トランザクションのいずれかでのみ実行でき、トランザクション テーブルへの更新と同じステートメントでは実行できません。

したがって、デフォルトのデータベース エンジンとして Innodb を選択することをお勧めします。

log_slave_updates このオプションは、MySQL 5.6 の GTID ベースのレプリケーションに必要ですが、スレーブ サーバーの IO 負荷が増加します。MySQL 5.7 では、このオプションは不要になりました。

3. スレーブサーバーを構成する

master_info_repository と relay_log_info_repository

MySQL 5.6.2 より前では、スレーブによって記録されたマスター情報とスレーブ アプリケーションの binlog の情報は、master.info と relay-log.info というファイルに保存されていました。バージョン 5.6.2 以降では、テーブルに記録できるようになりました。対応するテーブルは mysql.slave_master_info と mysql.slave_relay_log_info で、両方のテーブルは innodb エンジン テーブルです。

[mysqld]
log_bin = /var/log/mysql/mysql-bin
log_bin_index = /var/log/mysql/mysql-bin.index
サーバーID = 102
# 奴隷
リレーログ = /var/log/mysql/リレー-bin
リレーログインデックス = /var/log/mysql/リレー-bin.index
リレーログ情報ファイル = /var/log/mysql/リレービン.info
強制GTID一貫性 = オン
log_slave_updates = オン
読み取り専用 = オン
マスター情報リポジトリ = テーブル
リレーログ情報リポジトリ = テーブル

4. ライブラリデータから初期化する - [オプション]

まずプライマリデータベースのデータをバックアップする

次のようにコードをコピーします

mysqldump --single-transaction --master-data=2 --triggers --routines --all-databases --events -u root -p > backup.sql

--master-data=2 このオプションは、現在のサーバーのバイナリログの位置とファイル名を出力ファイル(マスターステータスを表示)に追加します。 1 の場合、オフセットは CHANGE MASTER コマンドにスプライスされます。 2 の場合、出力オフセット情報が注釈付けされます。

--all-databases GTID ベースのレプリケーションではすべてのトランザクションが記録されるため、完全なダンプを構築するにはこのオプションが推奨されます。

よくある間違い

ライブラリからSQLをインポートするときに表示されます

次のようにコードをコピーします

24 行目のエラー 1840 (HY000): @@GLOBAL.GTID_PURGED は、@@GLOBAL.GTID_EXECUTED が空の場合にのみ設定できます。

このとき、スレーブデータベースのMySQLコマンドラインを入力し、リセットマスターを使用します。

5. GTIDベースのレプリケーションを開始する

[email protected][email protected]があり、データはmysqldumpを通じてスレーブに同期されています。次に、スレーブサーバーでレプリケーションリンクを構成します。

mysql> マスターを、master_host='master'、master_user='repl'、master_password='123456'、master_auto_position=1 に変更します。
クエリは正常、影響を受けた行は 0 行、警告は 2 件 (0.06 秒)

レプリケーションを開始

mysql> スレーブを起動します。

起動が成功したら、スレーブのステータスを確認します

mysql>スレーブステータスを表示\G
************************** 1. 行 ****************************
    Slave_IO_State: マスターイベントをリレーログにキューイング
     マスターホスト: マスター
     マスターユーザー: repl
     マスターポート: 3306
    接続再試行: 60
    マスターログファイル:mysql-bin.000002
   読み取りマスターログ位置: 12793692
    リレーログファイル: リレーbin.000002
    リレーログ位置: 1027
  リレーマスターログファイル: mysql-bin.000002
    スレーブIO実行中: はい
   スレーブSQL実行中: はい
    レプリケート_Do_DB:
   レプリケート_無視_DB:
   テーブルの複製:
  無視テーブルを複製:
  Replicate_Wild_Do_Table:
 Replicate_Wild_Ignore_Table:
     最終エラー番号: 0
     最終エラー:
     スキップカウンタ: 0
   実行マスターログポジション: 814
    リレーログスペース: 12794106
    Until_Condition: なし
    ログファイルまで:
    ログ位置まで: 0
   マスターSSL許可: いいえ
   マスターSSLCAファイル:
   マスターSSLCAパス:
    マスターSSL証明書:
   マスターSSL暗号:
    マスターSSLキー:
  マスターより遅れている秒数: 5096
Master_SSL_Verify_Server_Cert: いいえ
    最終IOエラー番号: 0
    最後のIOエラー:
    最終SQLエラー番号: 0
    最後のSQLエラー:
 Replicate_Ignore_Server_Ids:
    マスターサーバーID: 101
     マスター_UUID: a9fd4765-ec70-11e6-b543-0242ac140002
    マスター情報ファイル: mysql.slave_master_info
     SQL_遅延: 0
   SQL_残り遅延: NULL
  Slave_SQL_Running_State: リレーログからイベントを読み取り中
   マスター再試行回数: 86400
     マスターバインド:
  最終IOエラータイムスタンプ:
  最終SQLエラータイムスタンプ:
    マスターSSL証明書:
   マスターSSLCrlパス:
   取得済み_Gtid_Set: a9fd4765-ec70-11e6-b543-0242ac140002:1-39
   実行されたGtidセット: a9fd4765-ec70-11e6-b543-0242ac140002:1-4
    自動位置: 1
   Replicate_Rewrite_DB:
     チャンネル名:
   マスター TLS バージョン:
セット内の 1 行 (0.00 秒)

Slave_IO_Running、Slave_SQL_RunningがYESの場合、

Slave_SQL_Running_State が Slave has read all relay log; wait for more update の場合、レプリケーション リンクは正常に確立されます。

6. まとめ

アドバンテージ

  1. ログオフセットを手動で設定する必要がないため、フェイルオーバーを簡単に実行できます。
  2. log_slave_updatesが有効になっている場合、スレーブはマスターで行われた変更を失うことはありません。

欠点

  1. 実行されるSQLには一定の制限がある
  2. MySQL 5.6以降のバージョンのみがサポートされており、5.6より前のバージョンは推奨されません。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL マスタースレーブレプリケーションの GTID モードの詳細な紹介
  • MYSQL データベース GTID はマスタースレーブレプリケーションを実現します (超便利)
  • MySQL5.6 GTIDモードで同期レプリケーションエラーをスキップできない問題の解決方法
  • MySQL 5.7 で業務を停止せずに従来のレプリケーションを GTID レプリケーションに変更する例
  • GTID に基づく MySQL 5.6 マスタースレーブ レプリケーション
  • MySQL での GTID レプリケーション プロトコルと停止プロトコルの使用に関するチュートリアル
  • MySQL レプリケーションにおける GTID レプリケーションの具体的な使用法

<<:  友達やグループを見つけるためのJavaScriptのLayim

>>:  Win10の組み込み仮想マシンHyper-Vを使用してCentOS7をインストールする方法の詳細な説明

推薦する

CSS の複雑なセレクターと CSS のフォントスタイルと色属性の詳細な説明

これまでに CSS の基本的なセレクターをいくつか学習しましたが、今日は CSS の複雑なセレクター...

vue3ソースコード解析の簡単な実装方法

目次序文🍹準備🍲vue3 の使い方🍖 実装要約する序文最近、私の最初の公式 vue3 + ts プロ...

Vueのレスポンシブシステムの原理の詳細な説明

目次Vueのレスポンシブシステムの基本原則1. Object.definePropertyの使い方を...

WeChatアプレットは記録機能を実装します

この記事では、WeChatアプレットのレコード機能を実装するための具体的なコードを参考までに紹介しま...

MyCat を使用して Linux で MySQL マスター/スレーブの読み取り/書き込み分離を実装する方法

目次Linux - MyCat を使用して MySQL マスター スレーブの読み取り書き込み分離を実...

Nginx 502 Bad Gateway エラーの原因と解決策

Nginx 502 Bad Gateway エラーに何度か遭遇しました。ここでメモしておこうと思いま...

Linux インストール Redis 実装プロセスとエラー解決

今日、redis をインストールしたところ、今までになかったいくつかのエラーが発生しました。ここで記...

webpackのモバイル適応ソリューションの概要

目次レムフォルクスワーゲンサードパーティのUIフレームワークに適応する結論モバイル開発における最も一...

Ajax リクエストにおけるクロスドメイン問題の原因と解決策

目次1. クロスドメインはどのように形成されるのでしょうか? 2. クロスドメインの根本的な原因3....

QTとJavaScript間のインタラクティブデータの実装

1. QTからJSへのデータフロー1. QTはJS関数を呼び出し、JSはパラメータを通じてQTの値を...

入力ボックスのプレースホルダーアニメーションと入力検証を実現する純粋なCSS

さらに興味深いコンテンツについては、https://github.com/abc-club/free...

docker ベースの redis-sentinel クラスターの構築例

1. 概要Redis Cluster は、Redis ノードのグループ間での高可用性とシャーディング...

nginxで静的リソースを公開する方法

ステップ準備した静的リソースファイルを指定されたフォルダに配置しますnginx 設定ファイルを変更す...

mysql 8.0.15 winx64 解凍バージョン グラフィック インストール チュートリアル

システムをインストールした後、毎回いくつかのソフトウェアを再インストールする必要があります。ソフトウ...

この記事ではSQL CASE WHENの使い方を詳しく説明します

目次シンプルな CASEWHEN 関数:これは、CASEWHEN 条件式関数を使用するのと同じです。...