オンラインで Group Replication の設定が変更できる3つの新機能
- Changing a Group’s Primary Member
- Changing a Group’s Mode
- Using Group Replication Group Write Consensus
今回は、1. Changing a Group’s Primary Member を検証してみたいと思います
Changing a Group’s Primary Member とは
シングル・プライマリモードで稼働している Group Replication の、プライマリ・メンバーを任意のメンバーに切り替えることができる機能です
環境
OS・MySQL バージョン
バージョン | |
---|---|
OS | Oracle Linux Server release 7.5 |
MySQL | 8.0.13 MySQL Community Server – GPL |
Group Replication 情報(MySQL InnoDB Cluster 環境で検証しています)
1 2 3 4 5 6 7 8 9 |
mysql> SELECT MEMBER_HOST, MEMBER_ID, MEMBER_ROLE FROM performance_schema.replication_group_members ORDER BY MEMBER_HOST; +-------------+--------------------------------------+-------------+ | MEMBER_HOST | MEMBER_ID | MEMBER_ROLE | +-------------+--------------------------------------+-------------+ | k-cluster01 | 4f3bbf53-dd76-11e8-a127-000c29e96070 | PRIMARY | | k-cluster02 | 4de92bb9-dd76-11e8-9ebc-000c297a6f76 | SECONDARY | | k-cluster03 | 4ee9addb-dd76-11e8-9be4-000c2968ee71 | SECONDARY | +-------------+--------------------------------------+-------------+ 3 rows in set (0.01 sec) |
現時点では、 k-cluster01
がプライマリ・メンバーとなっています
検証1
プライマリ・メンバーを “k-cluster02” にしてみます
1.group_replication_set_as_primary() を実行します
“k-cluster02″の mysql_server_uuid は、上記の MEMBER_ID より、 4de92bb9-dd76-11e8-9ebc-000c297a6f76
ということがわかりますので、group_replication_set_as_primary() は 4de92bb9-dd76-11e8-9ebc-000c297a6f76
を引数として実行します
1 2 3 4 5 6 7 |
mysql> SELECT group_replication_set_as_primary('4de92bb9-dd76-11e8-9ebc-000c297a6f76'); +--------------------------------------------------------------------------+ | group_replication_set_as_primary('4de92bb9-dd76-11e8-9ebc-000c297a6f76') | +--------------------------------------------------------------------------+ | Primary server switched to: 4de92bb9-dd76-11e8-9ebc-000c297a6f76 | +--------------------------------------------------------------------------+ 1 row in set (0.01 sec) |
2.確認してみます
1 2 3 4 5 6 7 8 9 |
mysql> SELECT MEMBER_HOST, MEMBER_ID, MEMBER_ROLE FROM performance_schema.replication_group_members ORDER BY MEMBER_HOST; +-------------+--------------------------------------+-------------+ | MEMBER_HOST | MEMBER_ID | MEMBER_ROLE | +-------------+--------------------------------------+-------------+ | k-cluster01 | 4f3bbf53-dd76-11e8-a127-000c29e96070 | SECONDARY | | k-cluster02 | 4de92bb9-dd76-11e8-9ebc-000c297a6f76 | PRIMARY | | k-cluster03 | 4ee9addb-dd76-11e8-9be4-000c2968ee71 | SECONDARY | +-------------+--------------------------------------+-------------+ 3 rows in set (0.00 sec) |
“k-cluster02” が プライマリ・メンバーとなり、切り替わっていることが確認できます
検証2
クライアント(MySQL Router)が接続中に、プライマリ・メンバーが切り替わった場合
1.Read/Writeの接続ポートである、 6446 ポートに接続し、接続したホスト名を確認します
1 2 3 4 5 6 7 |
mysql> SELECT @@HOSTNAME; +-------------+ | @@HOSTNAME | +-------------+ | k-cluster02 | +-------------+ 1 row in set (0.00 sec) |
2.プライマリ・メンバーを “k-cluster03” にしてみます
1 2 3 4 5 6 7 |
mysql> SELECT group_replication_set_as_primary('4ee9addb-dd76-11e8-9be4-000c2968ee71'); +--------------------------------------------------------------------------+ | group_replication_set_as_primary('4ee9addb-dd76-11e8-9be4-000c2968ee71') | +--------------------------------------------------------------------------+ | Primary server switched to: 4ee9addb-dd76-11e8-9be4-000c2968ee71 | +--------------------------------------------------------------------------+ 1 row in set (0.01 sec) |
3.クライアントの接続ホスト名を再確認してみます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mysql> SELECT @@HOSTNAME; ERROR 2013 (HY000): Lost connection to MySQL server during query mysql> SELECT @@HOSTNAME; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 3343 Current database: mydatabase +-------------+ | @@HOSTNAME | +-------------+ | k-cluster03 | +-------------+ 1 row in set (0.02 sec) |
接続先のメンバーが変更されているために、一度コネクションが切れますが、再コネクションすることで、新プライマリ・メンバーに接続していることがわかります
まとめ
hostnameやinstance_nameを指定して切り替えることができないのは、少し残念なところではありますが、非常に簡単にプライマリ・メンバーを切り替えることができました
これまでは、メンテナンス等でプライマリ・メンバーを切り替える際には、旧プライマリ・メンバーの MySQL を停止する必要がありましたが、この UDF を使用することにより、任意のメンバーに簡単に切り替えることが可能になります
また、記事中では確認処理を記載していないのですが、プライマリ・メンバーを切り替えると、read_only, super_read_only パラメータの値も、きちんと切り替わっていました