2016年12月30日金曜日

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 ロックの挙動に続く・・・(予定)

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。