ホームページ  >  記事  >  データベース  >  MySQL マスター/スレーブ レプリケーションの実践 - GTID ベースのレプリケーション コード共有

MySQL マスター/スレーブ レプリケーションの実践 - GTID ベースのレプリケーション コード共有

黄舟
黄舟オリジナル
2017-03-17 13:39:081302ブラウズ

この記事では、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. スレーブ サーバーを設定します

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が有効になっている場合、スレーブライブラリはメインライブラリの変更を失いません

欠点

  1. 実行されるSQLには特定の制限があります

  2. MySQL 5.6 以降のバージョンのみをサポートしており、以前の 5.6 バージョンの使用は推奨されません

以上がMySQL マスター/スレーブ レプリケーションの実践 - GTID ベースのレプリケーション コード共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。