mita2 database life

主にMySQLに関するメモです

Group Replication を試す(1) 導入編

MySQL 8.0 で入ると噂されていた、Group ReplicationがMySQL 5.7.17 でリリースされました。
5.7 GAとは何だったのか。。。 とはいえ、早く使えるようになったのは、うれしいです。
※ Group Replication は追加プラグインとして提供されているため、明示的に使わない限り影響を及ぼすことはありません。

-bash-4.1$ ls /usr/lib64/mysql/plugin/group_replication.so
/usr/lib64/mysql/plugin/group_replication.so

Group Replication とは

MySQLのマスターサーバの冗長化を目的とした機能です。

  • マルチマスター(マルチライター)のレプリケーション構成がとれる
  • 複数サーバに同時に書き込みが可能。HAProxy などで分散。
  • 冗長化の仕組みがMySQL本体に組み込まれており、簡単に扱える


相互にデータはレプリケーションされるため、1台あたりの更新量はサーバ台数を増やしても変化しない点に注意
(更新性能をスケールさせるためのソリューションではない。


http://mysqlhighavailability.com/mysql-group-replication-transaction-life-cycle-explained/
より引用

Group Replication 構成のマスターにスレーブをぶら下げることも可能です。

 

Group Replication を設定してみる

今回は3台構成のGroup Replication を設定してみました。

 

1. レプリケーションユーザの作成

全DBサーバで、root のパスワード設定と、レプリケーション用ユーザを作成しておきます。 この時点ではbinlogは無効化しておく必要があります。

mysql> ALTER USER root@'localhost' identified by 'Pass_1234';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER rpl_user IDENTIFIED BY 'rpl_Pass1234';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'rpl_user'@'%';
Query OK, 0 rows affected (0.00 sec)

2. 最初の1台の設定

以下の内容をmy.cnf に追加する。Group Replication を利用するにはGTIDが必須になります。

server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

# Group Replication の設定
transaction_write_set_extraction=XXHASH64

# SELECT UUID() で生成した任意のUUIDを指定
loose-group_replication_group_name="87e5ed8c-cd83-11e6-bc3c-fa163e83e8e7"
loose-group_replication_start_on_boot=off

# 自分のIPアドレス
loose-group_replication_local_address= "172.21.134.26:24901"

# すべてのサーバを並べる
loose-group_replication_group_seeds= "172.21.134.26:24901,172.21.134.27:24901,172.21.134.28:24901"

loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode=FALSE
loose-group_replication_enforce_update_everywhere_checks= TRUE

# サーバ間の通信に利用するネットワークを許可する
loose-group_replication_ip_whitelist = 172.21.134.0/23

MySQLを再起動し、CHANGE MASTER を実行。Group Replication 用の group_replication_recovery チャンネルに先ほど作成したユーザを指定する。

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_Pass1234' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.02 sec)

Group Replication プラグインの有効化

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0,01 sec)

mysql> SHOW PLUGINS;
| group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL |
| validate_password | ACTIVE | VALIDATE PASSWORD | validate_password.so | GPL |
+----------------------------+----------+--------------------+----------------------+---------+
46 rows in set (0.01 sec)

プラグインをインストールすると、Group Replication 用のユーザが自動で作成される。 このアカウントはアカウントロックされているため、例えパスワードがわかっても利用することはできない。 Group Replication Plugin 内部でこのユーザを使ってSQLを実行している模様。

mysql> SHOW GRANTS FOR _gr_user@'localhost';
+------------------------------------------------------------------------------------------------+
| Grants for _gr_user@localhost |
+------------------------------------------------------------------------------------------------+
| GRANT SUPER ON *.* TO '_gr_user'@'localhost' |
| GRANT SELECT ON `performance_schema`.`replication_connection_status` TO '_gr_user'@'localhost' |
+------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> SHOW CREATE USER _gr_user@'localhost';
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER for _gr_user@localhost |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER '_gr_user'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*7CF5CA9067EC647187EB99FCC27548FBE4839AE3' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT LOCK |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

次に、Group Replication を開始。最初の1台のみ group_replication_bootstrap_group を有効にした状態でSTART GROUP REPLICATION を実行する必要がある。

mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (1.76 sec)

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)

ステータス確認。MEMBER_STATEがONLINEになれば成功。

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------------------------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------------------------------+-------------+--------------+
| group_replication_applier | 1edf2e1d-cd83-11e6-961b-fa163e83e8e7 | gr01 | 3306 | ONLINE |
+---------------------------+--------------------------------------+---------------------------------------+-------------+--------------+
1 row in set (0.00 sec)

3. 2台目以降

server-id、group_replication_local_address をサーバにあわせたものにし、my.cnf に設定を追記して、再起動後、1台目と同じような流れで進める。

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_Pass1234' FOR CHANNEL 'group_replication_recovery';

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.01 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (1.76 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------------------------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+---------------------------------------+-------------+--------------+
| group_replication_applier | 0cdd0b6a-cd84-11e6-b223-fa163e0b2b7c | gr02 | 3306 | ONLINE |
| group_replication_applier | 1edf2e1d-cd83-11e6-961b-fa163e83e8e7 | gr01 | 3306 | ONLINE |
+---------------------------+--------------------------------------+---------------------------------------+-------------+--------------+
2 rows in set (0.00 sec)

Group Replication ロックの挙動に続く・・・

mita2db.hateblo.jp