MySQL 5.7.17 でついにGAとなったMySQL Group Replication。
今までになかったマルチマスタ構成が可能となり、夢が広がるなあ… と感じています。
Group Replicationの検証をする中で何点か躓いた点があったので、メモしておきたいと思います。
1. START GROUP_REPLICATION実行時は、GTIDは空でないといけない
MySQL5.7をyumでインストールして、パスワード変更して、my.cnfを修正して、
さあ START GROUP_REPLICATION; と実行してみたら、以下のエラーが発生しました。
mysql> START GROUP_REPLICATION;
ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.
2017-02-01T05:23:37.398876Z 0 [ERROR] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: 818459df-e83d-11e6-894d-0800272020f4:1-3 > Group transactions: 84ac715e-e83d-11e6-89eb-0800272020f4:1-3,
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1'
2017-02-01T05:23:37.399075Z 0 [ERROR] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'
どうやら、GROUP_REPLICATIONを開始した時点ではGTIDは空でないといけないようです。
上記手順の「パスワード変更」が原因でした。yumインストールだと、
初期パスワード(ランダム)が設定されるため、無意識で変更していた・・・。
解決策としては、「RESET MASTER;」を実行すれば、問題なくSTARTできます。
2. ノード間はホスト名の名前解決が出来ないといけない
第1ノードを起動して、第2ノードをSTARTしたのですが、"RECOVERING"状態のまま
一向に"ONLINE"になってくれない。
エラーログを見てみたら、ノード間の通信でタイムアウトが発生していました。
mysql> SELECT * FROM performance_schema.replication_group_members\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
MEMBER_ID: 818459df-e83d-11e6-894d-0800272020f4
MEMBER_HOST: node2
MEMBER_PORT: 3306
MEMBER_STATE: RECOVERING
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
MEMBER_ID: 84ac715e-e83d-11e6-89eb-0800272020f4
MEMBER_HOST: node1
MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
2 rows in set (0.00 sec)
2017-02-01T05:29:04.578678Z 28 [ERROR] Slave I/O for channel 'group_replication_recovery': error connecting to master 'rpl_user@node1:3306' - retry-time: 60 retries: 1, Error_code: 2003
今回の環境はvagrantで構築したのですが、サーバ間で名前解決が出来ていませんでした(IPアドレスはOK)。
エラーログや「replication_group_members」の通り、ノード間の通信時にはIPアドレスではなく
ホスト名を使用するため、名前解決が出来ないと通信が出来ないようです。
解決策としては、「/etc/hosts」に各ノードの情報を記載したらオケオケオッケーです。
3. mysqldump の --single-transactionは使えない
既にいくつかのユーザから指摘されていますが、Group ReplicationではSavePointsが
サポートされていないため、mysqldumpの--single-transactionオプションが使えません。
そのため、バックアップを取得する場合はそれ用のスレーブなどを用意する必要があるかもしれません。
(メンテナンス時間とかがあれば別ですが・・・)
==============================
以上、悪い点ばかりを列挙してしまいましたが、Group Replication自体はしっかり
特徴や制限事項などを理解すれば、面白い機能だと思います。
今後も検証をして、気になる点などがあればメモをしていきたいと思います。
※ そもそも名前解決ができない環境なんて稀ですしね。。