この記事では、MySQL実践的なマスター/スレーブ レプリケーション - GTID ベースのレプリケーションを主に紹介します。GTID ベースのレプリケーションは、MySQL 5.6 以降の新しいレプリケーション方法です。興味のある方は詳細をご覧ください。
GTID ベースのレプリケーション
はじめに
GTID ベースのレプリケーションは、MySQL 5.6 以降の新しいレプリケーション方法です。
GTID (グローバル トランザクション識別子) はグローバル トランザクション ID であり、すべてのトランザクションがメインデータベース 送信されたトランザクションはクラスター内で一意の ID を持ちます。
元のログベースのレプリケーションでは、指定されたエラーが指定されている場合、スレーブ ライブラリはどのオフセットからデータを同期するかをマスター ライブラリに伝える必要があります。
GTID ベースのレプリケーションでは、スレーブ ライブラリは実行されたトランザクションの GTID 値をマスター ライブラリに通知し、マスター ライブラリはすべてのトランザクションの GTID のリストを返します。未実行のトランザクションをスレーブ ライブラリに送信し、同じトランザクションが指定されたスレーブ データベースで 1 回だけ実行されるようにすることができます
1. マスター データベースにレプリケーション アカウントを作成し、権限を付与します。 GTID に基づくレプリケーションでは、スレーブ データベースで実行されていないデータが自動的にコピーされます。 トランザクション リプレイが行われるため、他のスレーブ ライブラリに同じアカウントを作成しないでください。同じアカウントを作成すると、レプリケーション リンク エラーが発生する可能性があります。本番環境のパスワードは、特定のパスワード強度を達成するために関連仕様に準拠する必要があり、メイン ライブラリはスレーブ ライブラリの特定のネットワーク セグメントでのみアクセスできることが規定されています。
mysql> create user 'repl'@'172.%' identified by '123456';ユーザーを表示
mysql> grant replication slave on *.* to 'repl'@'172.%';権限を表示
mysql> select user, host from mysql.user; +-----------+-----------+ | user | host | +-----------+-----------+ | prontera | % | | root | % | | mysql.sys | localhost | | root | localhost | +-----------+-----------+ 4 rows in set (0.00 sec)
2. メイン ライブラリ サーバーを構成します
mysql> show grants for repl@'172.%'; +--------------------------------------------------+ | Grants for repl@172.% | +--------------------------------------------------+ | GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.%' | +--------------------------------------------------+ 1 row in set (0.00 sec)注: ログとデータを分離することは良い習慣です。ログを別のデータ パーティションに配置することをお勧めします enforce_gtid_consistency
GTID の一貫性を有効にすると、次のコマンドは使用できなくなりましたcreate table...select...
[mysqld] log_bin = /var/log/mysql/mysql-bin log_bin_index = /var/log/mysql/mysql-bin.index binlog_format = row server_id = 101 gtid_mode = ON enforce_gtid_consistency = ON #log_slave_updates = ON
実際には 2 つの独立した
event
mysql> create table dept select * from departments; ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.トランザクション内で一時テーブルを作成することはできません
create temporary table同じトランザクション内で
update
トランザクションテーブルと非トランザクションテーブル(MyISAM)mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> create temporary table dept(id int); ERROR 1787 (HY000): Statement violates GTID consistency: CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context. These statements are also not allowed in a function or trigger because functions and triggers are also considered to be multi-statement transactions.そのため、デフォルトのデータベースエンジンとしてInnodbを選択することをお勧めしますlog_slave_updatesこのオプションは、MySQL 5.6 バージョンの GTID ベースのレプリケーションに必要ですが、スレーブ サーバーの IO 負荷が増加します。MySQL 5.7 では、このオプションは不要になりました 3.リレーログ情報リポジトリMySQL 5.6.2 より前では、スレーブによって記録されたマスター情報とスレーブ アプリケーションの binlog 情報は、master.info およびリレー -log.info というファイルに保存されていました。バージョン 5.6.2 以降では、テーブルへのログインが許可されます。対応するテーブルは mysql.slave_master_info と mysql.slave_relay_log_info で、どちらのテーブルも innodb エンジン テーブルです。
mysql> CREATE TABLE `dept_innodb` (id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT); Query OK, 0 rows affected (0.04 sec) mysql> CREATE TABLE `dept_myisam` (id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE = `MyISAM`; Query OK, 0 rows affected (0.03 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into dept_innodb(id) value(1); Query OK, 1 row affected (0.00 sec) mysql> insert into dept_myisam(id) value(1); ERROR 1785 (HY000): Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.
4. スレーブ データベース データの初期化 - [オプション]
最初にマスター ライブラリのデータをバックアップします。コードは次のとおりです:[mysqld] log_bin = /var/log/mysql/mysql-bin log_bin_index = /var/log/mysql/mysql-bin.index server_id = 102 # slaves relay_log = /var/log/mysql/relay-bin relay_log_index = /var/log/mysql/relay-bin.index relay_log_info_file = /var/log/mysql/relay-bin.info enforce_gtid_consistency = ON log_slave_updates = ON read_only = ON master_info_repository = TABLE relay_log_info_repository = TABLE—master-data=2 このオプションは、現在のサーバーの binlog の場所とファイル名を出力ファイルに追加します (1 の場合、オフセットが結合されます)。 CHANGE MASTER コマンド。2 の場合、出力オフセット情報がコメント化されます。 --all-databases GTID ベースのレプリケーションはすべてのトランザクションを記録するため、完全なダンプを構築するにはこのオプションをお勧めします
一般的なエラー
ライブラリから SQL をインポートするときに発生します コードは次のとおりです :
mysqldump --single-transaction --master-data=2 --triggers --routines --all-databases --events -u root -p > backup.sqlこの時点で、スレーブ データベースの MySQL コマンド ラインに入り、reset master
5 を使用して、GTID ベースのレプリケーションを開始します
既存の master@172.20.0.2 と smile@172.20.0.3 を実行し、mysqldump Synchronize を渡します。データをスレーブデータベーススレーブに設定しますERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.レプリケーションを開始します
mysql> change master to master_host='master', master_user='repl', master_password='123456', master_auto_position=1; Query OK, 0 rows affected, 2 warnings (0.06 sec)正常に起動したら、スレーブの
ステータス
mysql> start slave;Slave_IO_Running、Slave_SQL_RunningがYES、、およびSlave_SQL_Running_Stateを確認します。スレーブがすべてのリレー ログを読み取り、さらなる更新を待機している場合、レプリケーション リンクが正常に構築されていることを意味します
6. 利点
ログ オフセットを手動で設定する必要がないため、エラーが発生します。転送は簡単に実行できます log_slave_updatesが有効になっている場合、スレーブライブラリはメインライブラリの変更を失いません
欠点
実行されるSQLには特定の制限があります
MySQL 5.6 以降のバージョンのみをサポートしており、以前の 5.6 バージョンの使用は推奨されません
以上がMySQL マスター/スレーブ レプリケーションの実践 - GTID ベースのレプリケーション コード共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。