MySQL Router2.1βがリリースされていたので、念の為にMySQL Group Replicationとの連携を確認しました。まだ、βなので機能が全部追加されている訳ではないので、今後のGAに期待したいと思います。
1: Group Replication基本設定と動作
2: MySQL Router2.1βの基本動作確認
3: Single Primaryモードの場合のFailOverの挙動確認
検証で利用したMySQLのバージョン
[root@replications gr]# /usr/local/mysql/bin/mysql -uroot -proot -S/home/mysql/gr/mysql1/my.sock -e "select @@version" mysql: [Warning] Using a password on the command line interface can be insecure. +-------------------------------------------+ | @@version | +-------------------------------------------+ | 5.7.17-enterprise-commercial-advanced-log | +-------------------------------------------+
グループレプリケーションメンバーのオプションファイル(my.cnf)の設定
[root@replications gr]# cat my1.cnf [mysqld] socket = /home/mysql/gr/mysql1/my.sock port = 63301 innodb_buffer_pool_size=32MB datadir = /home/mysql/gr/mysql1 user = mysql log_error = /home/mysql/gr/mysql1/error.log log-bin = master-bin server-id = 1 gtid-mode = on enforce-gtid-consistency = on log-slave-updates = on binlog-checksum = NONE binlog-format = row master-info-repository = TABLE relay-log-info-repository = TABLE slave_parallel_type=LOGICAL_CLOCK slave_preserve_commit_order=ON slave_parallel_workers=8 transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="00000000-1111-2222-3333-123456789ABC" loose-group_replication_start_on_boot=off loose-group_replication_local_address="127.0.0.1:63201" loose-group_replication_group_seeds="127.0.0.1:63201,127.0.0.1:63202,127.0.0.1:63203" loose-group_replication_bootstrap_group=off ### Option for Multi Master Mode #loose-group_replication_single_primary_mode=FALSE #loose-group_replication_enforce_update_everywhere_checks= TRUE #tx_isolation = READ-COMMITTED [root@replications gr]# cat my2.cnf [mysqld] socket = /home/mysql/gr/mysql2/my.sock port = 63302 innodb_buffer_pool_size=32MB datadir =/home/mysql/gr/mysql2 user = mysql log_error = /home/mysql/gr/mysql2/error.log log-bin = master-bin server-id = 2 gtid-mode = on enforce-gtid-consistency log-slave-updates binlog-checksum = NONE binlog-format = row master-info-repository = TABLE relay-log-info-repository = TABLE slave_parallel_type=LOGICAL_CLOCK slave_preserve_commit_order=ON slave_parallel_workers=8 transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="00000000-1111-2222-3333-123456789ABC" loose-group_replication_start_on_boot=off loose-group_replication_local_address="127.0.0.1:63202" loose-group_replication_group_seeds="127.0.0.1:63201,127.0.0.1:63202,127.0.0.1:63203" loose-group_replication_bootstrap_group=off ### Option for Multi Master Mode #loose-group_replication_single_primary_mode=FALSE #loose-group_replication_enforce_update_everywhere_checks= TRUE #tx_isolation = READ-COMMITTED [root@replications gr]# cat my3.cnf [mysqld] socket = /home/mysql/gr/mysql3/my.sock port = 63303 innodb_buffer_pool_size=32MB datadir = /home/mysql/gr/mysql3 user = mysql log_error = /home/mysql/gr/mysql3/error.log log-bin = master-bin binlog-format = row server-id = 3 gtid-mode = on enforce-gtid-consistency = on log-slave-updates = on binlog-checksum = NONE master-info-repository = TABLE relay-log-info-repository = TABLE slave_parallel_type=LOGICAL_CLOCK slave_preserve_commit_order=ON slave_parallel_workers=8 transaction_write_set_extraction=XXHASH64 loose-group_replication_group_name="00000000-1111-2222-3333-123456789ABC" loose-group_replication_start_on_boot=off loose-group_replication_local_address="127.0.0.1:63203" loose-group_replication_group_seeds="127.0.0.1:63201,127.0.0.1:63202,127.0.0.1:63203" loose-group_replication_bootstrap_group=off ### Option for Multi Master Mode #loose-group_replication_single_primary_mode=FALSE #loose-group_replication_enforce_update_everywhere_checks= TRUE #tx_isolation = READ-COMMITTED [root@replications gr]#
MySQLインスタンスの起動
/usr/local/mysql/bin/mysqld --defaults-file=/home/mysql/gr/my1.cnf & /usr/local/mysql/bin/mysqld --defaults-file=/home/mysql/gr/my2.cnf & /usr/local/mysql/bin/mysqld --defaults-file=/home/mysql/gr/my3.cnf &
MySQLインスタンスへのアクセス
/usr/local/mysql/bin/mysql -uroot -proot -S/home/mysql/gr/mysql1/my.sock /usr/local/mysql/bin/mysql -uroot -proot -S/home/mysql/gr/mysql2/my.sock /usr/local/mysql/bin/mysql -uroot -proot -S/home/mysql/gr/mysql3/my.sock
■ 全てのサーバーにプラグインインストールとアカウント作成
INSTALL PLUGIN group_replication SONAME 'group_replication.so'; SET SQL_LOG_BIN=0; CREATE USER gr_user@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO gr_user@'%'; SET SQL_LOG_BIN=1; CHANGE MASTER TO MASTER_USER='gr_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
■ マスターノードでグループ設定
SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;
■ セカンダリーノードをグループに参加させる
START GROUP_REPLICATION;
Group Replicationの状態確認
mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+--------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+--------------+-------------+--------------+ | group_replication_applier | 698f11c8-0397-11e7-aae1-080027d65c57 | replications | 63301 | ONLINE | | group_replication_applier | 713ad572-0397-11e7-aca3-080027d65c57 | replications | 63302 | ONLINE | | group_replication_applier | 78b1d98a-0397-11e7-aef2-080027d65c57 | replications | 63303 | ONLINE | +---------------------------+--------------------------------------+--------------+-------------+--------------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM performance_schema.replication_group_member_stats\G *************************** 1. row *************************** CHANNEL_NAME: group_replication_applier VIEW_ID: 14889395677991618:3 MEMBER_ID: 698f11c8-0397-11e7-aae1-080027d65c57 COUNT_TRANSACTIONS_IN_QUEUE: 0 COUNT_TRANSACTIONS_CHECKED: 0 COUNT_CONFLICTS_DETECTED: 0 COUNT_TRANSACTIONS_ROWS_VALIDATING: 0 TRANSACTIONS_COMMITTED_ALL_MEMBERS: 00000000-1111-2222-3333-123456789abc:1-3 LAST_CONFLICT_FREE_TRANSACTION: 1 row in set (0.00 sec) mysql> SHOW VARIABLES LIKE '%single_primary%'; +---------------------------------------+-------+ | Variable_name | Value | +---------------------------------------+-------+ | group_replication_single_primary_mode | ON | +---------------------------------------+-------+ 1 row in set (0.00 sec) mysql> SELECT * FROM performance_schema.global_status WHERE VARIABLE_NAME='group_replication_primary_member'; +----------------------------------+--------------------------------------+ | VARIABLE_NAME | VARIABLE_VALUE | +----------------------------------+--------------------------------------+ | group_replication_primary_member | 698f11c8-0397-11e7-aae1-080027d65c57 | +----------------------------------+--------------------------------------+ 1 row in set (0.00 sec) mysql>
メモ:シングルプライマリーモードのみで利用する場合は、auto_incrementの値がぶつかる事は無いので、以下の値は1に調整しても問題無い。
[root@replications gr]# /usr/local/mysql/bin/mysql -uroot -proot -S/home/mysql/gr/mysql1/my.sock -e "show variables like 'auto_inc%'" mysql: [Warning] Using a password on the command line interface can be insecure. +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 7 | | auto_increment_offset | 1 | +--------------------------+-------+ [root@replications gr]# /usr/local/mysql/bin/mysql -uroot -proot -S/home/mysql/gr/mysql2/my.sock -e "show variables like 'auto_inc%'" mysql: [Warning] Using a password on the command line interface can be insecure. +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 7 | | auto_increment_offset | 2 | +--------------------------+-------+ [root@replications gr]# /usr/local/mysql/bin/mysql -uroot -proot -S/home/mysql/gr/mysql3/my.sock -e "show variables like 'auto_inc%'" mysql: [Warning] Using a password on the command line interface can be insecure. +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 7 | | auto_increment_offset | 3 | +--------------------------+-------+ [root@replications gr]# [root@replications gr]# /usr/local/mysql/bin/mysql -uroot -proot -S/home/mysql/gr/mysql1/my.sock -e "show variables like 'group_replication_auto%';" mysql: [Warning] Using a password on the command line interface can be insecure. +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | group_replication_auto_increment_increment | 7 | +--------------------------------------------+-------+ [root@replications gr]#
シングルプライマリーモードでは以下のように、PRIMARYノードのみで書き込みが可能になっている。(SECONDARYは、read_only & super_read_only)
[root@replications gr]# /usr/local/mysql/bin/mysql -uroot -proot -S/home/mysql/gr/mysql1/my.sock -e "SHOW VARIABLES LIKE '%read_only'" mysql: [Warning] Using a password on the command line interface can be insecure. +------------------+-------+ | Variable_name | Value | +------------------+-------+ | innodb_read_only | OFF | | read_only | OFF | | super_read_only | OFF | | tx_read_only | OFF | +------------------+-------+ [root@replications gr]# /usr/local/mysql/bin/mysql -uroot -proot -S/home/mysql/gr/mysql2/my.sock -e "SHOW VARIABLES LIKE '%read_only'" mysql: [Warning] Using a password on the command line interface can be insecure. +------------------+-------+ | Variable_name | Value | +------------------+-------+ | innodb_read_only | OFF | | read_only | ON | | super_read_only | ON | | tx_read_only | OFF | +------------------+-------+ [root@replications gr]# /usr/local/mysql/bin/mysql -uroot -proot -S/home/mysql/gr/mysql3/my.sock -e "SHOW VARIABLES LIKE '%read_only'" mysql: [Warning] Using a password on the command line interface can be insecure. +------------------+-------+ | Variable_name | Value | +------------------+-------+ | innodb_read_only | OFF | | read_only | ON | | super_read_only | ON | | tx_read_only | OFF | +------------------+-------+ [root@replications gr]#
参考: http://mysqlhighavailability.com/gr/doc/getting_started.html
MySQL Router2.1(β)でInnoDB Clusterを利用しないで検証
MEMO: InnoDB Clusterを使わない場合は、GR内部にレプリケーション管理用のメタデータが出来ていない。
[root@replications bin]# ./mysqlrouter --version MySQL Router v2.1.2 on Linux (64-bit) (GPL community edition) [root@replications bin]# [root@replications mysql]# /home/mysql/mysqlrouter/bin/mysqlrouter --bootstrap 127.0.0.1:63301 --directory /home/mysql/mysqlrouter/tmp --conf-usePlease enter MySQL password for root: Error: The provided server does not seem to contain metadata for a MySQL InnoDB cluster [root@replications mysql]#
※ こちらは、別途確認します。
InnoDB Clusterに関しては、以前のブログ投稿を確認下さい。
http://variable.jp/2016/09/28/mysql-innodb-cluster%E6%A6%82%E8%A6%81/
以下、MySQL Routerの動作検証で利用した定義ファイル設定
シングルプライマリーモードの場合の設定は、以下のルールになっているので63302をFailOver先に設定。
In the event the primary member is removed from the group, then an election is performed and a new primary is chosen from the remaining servers in the group. This election is performed by looking at the new view, ordering the server UUIDs in lexicographical order and by picking the first one.
https://dev.mysql.com/doc/refman/5.7/en/group-replication-single-primary-mode.html
[root@replications gr]# cat /etc/mysqlrouter/mysqlrouter.conf [DEFAULT] logging_folder=/home/mysql/mysqlrouter/tmp [logger] level = INFO [routing:failover] bind_port = 7001 mode = read-write destinations = 127.0.0.1:63301,127.0.0.1:63302 [routing:balancing] bind_port = 7002 mode = read-only destinations = 127.0.0.1:63302,127.0.0.1:63303 #[metadata_cache] #bootstrap_server_addresses=mysql://127.0.0.1:63301,mysql://127.0.0.1:63302,mysql://127.0.0.1:63303 #user=mysql_innodb_cluster_reader #password=dtRSPqn #metadata_cluster=test #ttl=300 #metadata_replicaset=default #[routing:default_rw] #bind_port=6446 #destinations=metadata-cache:///default?role=PRIMARY #mode=read-write #[routing:default_ro] #bind_port=6447 #destinations=metadata-cache:///default?role=SECONDARY #mode=read-only [root@replications gr]#
MySQL Routerの起動
[root@replications bin]# ./mysqlrouter --config=/etc/mysqlrouter/mysqlrouter.conf & [1] 2449 [root@replications bin]#
read-writeはFailOverモード、read-Onlyはラウンドロビン
[admin@replications ~]$ /usr/local/mysql/bin/mysql -uroot -proot -h 127.0.0.1 -P 7001 -e "select @@port" mysql: [Warning] Using a password on the command line interface can be insecure. +--------+ | @@port | +--------+ | 63301 | +--------+ [admin@replications ~]$ /usr/local/mysql/bin/mysql -uroot -proot -h 127.0.0.1 -P 7001 -e "select @@port" mysql: [Warning] Using a password on the command line interface can be insecure. +--------+ | @@port | +--------+ | 63301 | +--------+ [admin@replications ~]$ /usr/local/mysql/bin/mysql -uroot -proot -h 127.0.0.1 -P 7002 -e "select @@port" mysql: [Warning] Using a password on the command line interface can be insecure. +--------+ | @@port | +--------+ | 63302 | +--------+ [admin@replications ~]$ /usr/local/mysql/bin/mysql -uroot -proot -h 127.0.0.1 -P 7002 -e "select @@port" mysql: [Warning] Using a password on the command line interface can be insecure. +--------+ | @@port | +--------+ | 63303 | +--------+ [admin@replications ~]$ /usr/local/mysql/bin/mysql -uroot -proot -h 127.0.0.1 -P 7002 -e "select @@port" mysql: [Warning] Using a password on the command line interface can be insecure. +--------+ | @@port | +--------+ | 63302 | +--------+ [admin@replications ~]$
PRIMARYをダウンさせた場合に、Single Primary Modeの仕様に従って、マスターが切り替わっている事が確認出来る。
[root@replications bin]# /usr/local/mysql/bin/mysql -uroot -proot -h 127.0.0.1 -P 7001 -e "select @@port" mysql: [Warning] Using a password on the command line interface can be insecure. +--------+ | @@port | +--------+ | 63301 | +--------+ [root@replications bin]# /usr/local/mysql/bin/mysql -uroot -proot -h 127.0.0.1 -P 7001 -e "select @@port" mysql: [Warning] Using a password on the command line interface can be insecure. +--------+ | @@port | +--------+ | 63301 | +--------+ [root@replications bin]# /usr/local/mysql/bin/mysql -uroot -proot -S/home/mysql/gr/mysql1/my.sock -e "shutdown" mysql: [Warning] Using a password on the command line interface can be insecure. [root@replications bin]# /usr/local/mysql/bin/mysql -uroot -proot -h 127.0.0.1 -P 7001 -e "select @@port" mysql: [Warning] Using a password on the command line interface can be insecure. +--------+ | @@port | +--------+ | 63302 | +--------+ [root@replications bin]# /usr/local/mysql/bin/mysql -uroot -proot -h 127.0.0.1 -P 7001 -e "select @@port" mysql: [Warning] Using a password on the command line interface can be insecure. +--------+ | @@port | +--------+ | 63302 | +--------+ [root@replications bin]# /usr/local/mysql/bin/mysql -uroot -proot -h 127.0.0.1 -P 7001 -e "SELECT * FROM performance_schema.global_status WHERE VARIABLE_NAME='group_replication_primary_member'" mysql: [Warning] Using a password on the command line interface can be insecure. +----------------------------------+--------------------------------------+ | VARIABLE_NAME | VARIABLE_VALUE | +----------------------------------+--------------------------------------+ | group_replication_primary_member | 713ad572-0397-11e7-aca3-080027d65c57 | +----------------------------------+--------------------------------------+ [root@replications bin]# /usr/local/mysql/bin/mysql -uroot -proot -S/home/mysql/gr/mysql2/my.sock -e "SHOW VARIABLES LIKE '%read_only'" mysql: [Warning] Using a password on the command line interface can be insecure. +------------------+-------+ | Variable_name | Value | +------------------+-------+ | innodb_read_only | OFF | | read_only | OFF | | super_read_only | OFF | | tx_read_only | OFF | +------------------+-------+ [root@replications bin]#
補足: 停止していた旧PRIMARYを起動すると、停止中に処理されたDDL、DMLも伝搬され復旧している事が確認出来る。
mysql> select @@port; +--------+ | @@port | +--------+ | 63301 | +--------+ 1 row in set (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> START GROUP_REPLICATION; Query OK, 0 rows affected (2.40 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | GR | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql>
MySQL Router2.1を利用する場合は、上記のようにGRのメタデータを参照しなくても利用出来ますが、
やはり状況によって運用でカバーしなければいけない事を考えると、MySQL Router2.1がInnoDB Clusterのメタデータ無しで利用出来るようになるのを待つか、
MySQL Router2.1がGAになったタイミングでMySQLShellも合わせてGAになるのを待って、InnoDB Clusterとして利用した方が良さそうです。
MySQL Routerマニュアル:
https://downloads.mysql.com/docs/mysql-router-2.1-en.a4.pdf
MySQL Router以外のHAアプリケーション (HAProxy, SQLProxy)
※ MySQL Router2.1がβが外れる前や、使い慣れている場合は以下のようなバランサーも良いかと思います。
http://lefred.be/content/ha-with-mysql-group-replication-and-proxysql/
http://lefred.be/content/mysql-group-replication-as-ha-solution/