#背景
Mysql設定変更じなどメンテナンス作業時クラスタを完全に再起動したい場合があるかと思います。
クラスタを完全停止した場合は、サービス起動⇒Groupreplicationを起動するだけでクラスタを起動できません。
と言ってクラスタを作り直したり、memberをjoinし直したりするのもよろしくなかったので
試行錯誤で以下の方法にたどり着いたんですが、もっといい方法があれば教えていただければと思います。
#環境
instance1: primary
instance2: secondary
instance3: secondary
OS: Centos7.3
mysql: mysql-community-server-8.0.16
#サービス停止
普通に全インスタンスでsystemctl stop mysqld
を実行すればよいですが、
single primary
モードでFailover
させたく無い場合は、secondaryから停止する必要があります。
#サービス起動
新規にクラスタを作るのではなく、既存クラスタをiteractive:off
で再起動する方法を紹介(既にご存じ?)します。
###mysqld起動
systemctl start mysqld
###Group Replication停止
#/bin/mysqlsh user@ip:port --sql -e 'stop group_replication;'
・group_replication_start_on_boot=onの場合はサービス起動時に
start group_replication
を起動してくれ、
クラスタが既に起動している場合のみ自動参加されますが、クラスタ自体は起動してくれません。(なので少なくともprimaryは停止する必要があります。)
・user@ip:portはmyloginに設定しておけば、パスワード聞かれずに実行可能です。
###Group Replication開始(primary)
#/bin/mysqlsh user@ip:port --py -e 'dba.reboot_cluster_from_complete_outage("cluster_name", {"removeInstances": [],"rejoinInstances": [], "clearReadOnly": True})'
reboot_cluster_from_complete_outage で既存のクラスタを再起動します。
removeInstances: 言葉の通り、クラスタ起動時に消したいメンバーを書きます。聞かれたくないので[]を指定します。
rejoinInstances: 言葉の通り、クラスタ起動時にJoinしたいメンバーを書きます。すぐsecondaryのgroup_replicationを起動する場合は、指定しなく([]にする)てもよいです。
clearReadOnly: replication_groupを離れる場合のオプションによって、readonlyになる可能性があるため、念のためTrueにします。
なお、reboot_cluster_from_complete_outageを実行することによってgroup_replication_start_on_boot=on
に設定されます。mysqld-auto.cnf
で確認できます。offにしたい場合は
#/bin/mysqlsh user@ip:port --sql -e 'set persist group_replication_start_on_boot=off'
###primaryが起動されていることを確認
sql>select MEMBER_ID,MEMBER_HOST,MEMBER_STATE,MEMBER_ROLE from performance_schema.replication_group_members;
MEMBER_ID MEMBER_HOST MEMBER_STATE MEMBER_ROLE
0cffd742-98b6-11e9-b857-fa163e0290da instance1 ONLINE PRIMARY
###Group Replication開始(secondary)※起動されている場合は不要
#/bin/mysqlsh user@ip:port --sql -e 'stop group_replication;'
###secondaryが起動されていることを確認
sql>select MEMBER_ID,MEMBER_HOST,MEMBER_STATE,MEMBER_ROLE from performance_schema.replication_group_members;
MEMBER_ID MEMBER_HOST MEMBER_STATE MEMBER_ROLE
0cffd742-98b6-11e9-b857-fa163e0290da instance1 ONLINE PRIMARY
4e9c38f8-98b6-11e9-a435-fa163e020899 instance2 ONLINE SECONDARY
4ead6a0f-98b6-11e9-ac78-fa163e02119d instance3 ONLINE SECONDARY
#終わり