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

黄舟
リリース: 2017-03-17 13:39:08
オリジナル
1308 人が閲覧しました

この記事では、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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート