MySQL道普請便り

第24回 GTIDを使用したレプリケーション構成を作成する[1]

この記事を読むのに必要な時間:およそ 4 分

従来のMySQLのレプリケーションでは,新規にスレーブを追加する際にマスターのバイナリログファイル名とバイナリログファイルのポジションを指定する必要がありました。

MySQL 5.6.5から追加された機能であるグローバルトランザクション識別子(GTID)を使用することで,マスターのバイナリログファイル名とバイナリログファイルのポジションを指定することなく,容易にレプリケーションを構成・開始できるようになります。今回はGTIDを使用したレプリケーション構成について紹介いたします。

環境構築

第22回 特定のSQL文が原因で発生したレプリケーション遅延の調査方法で紹介した方法にて,MySQLのインストールまで環境構築します。今回のMySQLのバージョンはMySQL5.6.31です。

構成は以下のようになっています。

IPMySQL PORTmaster/slave
172.17.0.13306master
172.17.0.33306slave

GTIDを使用したレプリケーションの設定

MySQL5.6にてGTIDを有効にするためには,マスターとスレーブ共にMySQLが完全停止している状態でなければ有効化できません。MySQL5.7からは従来のレプリケーション構成で運用している状態からでもGTIDの有効化が可能となっています。その設定方法は次回紹介します。

my.cnfの設定

まず,第22回で説明したレプリケーションを構成するための必須なサーバ変数は以下となります。

  • log-bin(バイナリログの有効化)
  • server-id=NO. ⁠マスターとスレーブで異なる値を記述すること)

そして,GTIDを有効にするためのサーバ変数は以下になります。

  • gtid-mode=ON(GTIDの有効化)
  • enforce-gtid-consistency=true(GTIDの一貫性を有効化)
  • log-slave-updates(スレーブでもバイナリログを記述する設定)
# vim /etc/my.cnf

log-bin
server-id=1
log-slave-updates
gtid-mode=ON
enforce-gtid-consistency=true

gtid-mode=ONの場合はenforce-gtid-consistency=falseだとMySQLが起動できません。また,MySQL5.6においてはマスターとスレーブともにlog-slave-updatesが必須となり,記述されていないとMySQLが起動できません。

そして,マスターとスレーブ共にMySQLを起動します。

# /etc/init.d/mysqld start
Starting mysqld:                                           [  OK  ]

マスターの設定

レプリケーション用のユーザと権限を設定します(ユーザ名:repl,パスワード:replication)⁠

mysql> CREATE USER  'repl'@'172.17.0.3' IDENTIFIED BY 'replication';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.17.0.3';

スレーブの設定

従来のレプリケーションであればCHANGE MASTER構文に現在のマスターのバイナリログの情報を記述する必要がありましたが,GTIDを使用している場合は記述する必要はありません。バイナリログファイル名とバイナリログのポジションを指定する代わりに,MASTER_AUTO_POSITION = 1と記述し実行します。

MASTER_AUTO_POSITION = 1とすることで,GTIDを使用してログのポジションを自動的に識別し,スレーブに必要な更新データからレプリケーションを開始することができます。

mysql> CHANGE MASTER TO
MASTER_HOST = '172.17.0.1',
MASTER_PORT = 3306,
MASTER_USER =  'repl',
MASTER_PASSWORD =  'replication',
MASTER_AUTO_POSITION = 1;

そして,レプリケーションを開始します。

mysql> start slave;

これでGTIDを使用したレプリケーション構成は完了です。

GTIDについて

GTIDはコミット済みのトランザクション単位に与えられる一意識別子です。server_uuid :(コロン) transaction_idで表現されます。

  • server_uuid …サーバを識別するUUIDとなります。
  • transaction_id …コミットされたトランザクション順のシーケンス番号です。

たとえば,321e231b-3ce3-11e6-9fe5-0242ac110001:2のような表示になります。321e231b-3ce3-11e6-9fe5-0242ac110001がサーバーを識別するUUIDを示し,2が2番目に実行されたトランザクションとなります。

では,GTIDを使用したレプリケーションを開始してSHOW MASTER INFOでマスターのステータスを確認します。

mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 |      678 |              |                  | 321e231b-3ce3-11e6-9fe5-0242ac110001:1-7 |
+------------------+----------+--------------+------------------+------------------------------------------+

この例ではExecuted_Gtid_Set321e231b-3ce3-11e6-9fe5-0242ac110001:1-7という値が入っています。321e231b-3ce3-11e6-9fe5-0242ac110001はマスター自身のserver_uuidです。transaction_idは1-7という値になっています。これはtransaction_idセットといい,このケースは1番目から7番目までのトランザクションを表します。マスターでこれらのトランザクションが実行されたということです。

続いて,SHOW SLAVE STATUSでスレーブのステータスを確認します(一部表示は割愛しています)⁠

mysql> show slave status\G
 :
 :
Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
 :
 :
Retrieved_Gtid_Set: 321e231b-3ce3-11e6-9fe5-0242ac110001:1-7
 Executed_Gtid_Set: 321e231b-3ce3-11e6-9fe5-0242ac110001:1-7
     Auto_Position: 1

Retrieved_Gtid_Setの内容はserver_uuidはマスターを指し,1-7は1番目から7番目までのトランザクションをマスターから受け取ったということです。Executed_Gtid_Setの内容はこちらも同じくserver_uuidはマスターを指します。1-7はスレーブで実行されたトランザクションの情報を指しています。よって,この例でのレプリケーションはマスターでの更新は,すべてスレーブで反映されていることがわかります。

著者プロフィール

北川健太郎(きたがわけんたろう)

LINE株式会社所属のデータベースエンジニア。担当はMySQLとOracle Database。好きなMySQLの機能はレプリケーションで,好きなOracleDatabaseの機能はログオントリガー。

Twitter:@keny_lala

コメント

コメントの記入