5.3. Galera クラスターに関するトラブルシューティング
復元手順の一部として Galera クラスターが復元されない場合は、Galera を手動で復元する必要があります。
以下の手順では、1 つのコントローラーノードでいくつかのステップを実施する必要があります。手順の実施と同じコントローラーノードで、これらのステップを実施するようにしてください。
手順
Controller-0 で、Galera クラスターの仮想 IP を取得します。
$ sudo hiera -c /etc/puppet/hiera.yaml mysql_vip
すべてのコントローラーノードで、仮想 IP を通じたデータベース接続を無効にします。
$ sudo iptables -I INPUT -p tcp --destination-port 3306 -d $MYSQL_VIP -j DROP
Controller-0 で MySQL の root パスワードを取得します。
$ sudo hiera -c /etc/puppet/hiera.yaml mysql::server::root_password
Controller-0 で、Galera リソースを
unmanaged
モードに設定します。$ sudo pcs resource unmanage galera-bundle
すべてのコントローラーノードで、MySQL コンテナーを停止します。
$ sudo docker container stop $(sudo docker container ls --all --format “{{.Names}}” --filter=name=galera-bundle)
すべてのコントローラーノードで、現在のディレクトリーを移動します。
$ sudo mv /var/lib/mysql /var/lib/mysql-save
すべてのコントローラーノードで、新規ディレクトリー
/var/lib/mysq
を作成します。$ sudo mkdir /var/lib/mysql $ sudo chown 42434:42434 /var/lib/mysql $ sudo chcon -t container_file_t /var/lib/mysql $ sudo chmod 0755 /var/lib/mysql $ sudo chcon -r object_r /var/lib/mysql $ sudo chcon -u system_u /var/lib/mysql
すべてのコントローラーノードで、MySQL コンテナーを起動します。
$ sudo docker container start $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)
すべてのコントローラーノードで、MySQL データベースを作成します。
$ sudo docker exec -i $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql_install_db --datadir=/var/lib/mysql --user=mysql"
すべてのコントローラーノードで、データベースを起動します。
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysqld_safe --skip-networking --wsrep-on=OFF" &
すべてのコントローラーノードで、
.my.cnf
Galera 設定ファイルを移動します。$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mv /root/.my.cnf /root/.my.cnf.bck"
すべてのコントローラーノードで、Galera root パスワードをリセットします。
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql -uroot -e'use mysql;update user set password=PASSWORD(\"$ROOTPASSWORD\")where User=\"root\";flush privileges;'"
すべてのコントローラーノード上の Galera コンテナー内で、
.my.cnf
Galera 設定ファイルを復元します。$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mv /root/.my.cnf.bck /root/.my.cnf"
Controller-0 で、バックアップデータベースファイルを
/var/lib/MySQL
にコピーします。$ sudo cp $BACKUP_FILE /var/lib/mysql $ sudo cp $BACKUP_GRANT_FILE /var/lib/mysql
注記これらのファイルへのパスは /home/heat-admin/ です。
Controller-0 で、MySQL データベースを復元します。
$ sudo docker exec $(docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql -u root -p$ROOT_PASSWORD < \"/var/lib/mysql/$BACKUP_FILE \" " $ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql -u root -p$ROOT_PASSWORD < \"/var/lib/mysql/$BACKUP_GRANT_FILE \" "
すべてのコントローラーノードで、データベースをシャットダウンします。
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysqladmin shutdown"
Controller-0 で、ブートストラップノードを起動します。
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle) \ /usr/bin/mysqld_safe --pid-file=/var/run/mysql/mysqld.pid --socket=/var/lib/mysql/mysql.sock --datadir=/var/lib/mysql \ --log-error=/var/log/mysql_cluster.log --user=mysql --open-files-limit=16384 \ --wsrep-cluster-address=gcomm:// &
検証: Controller-0 で、クラスターのステータスを確認します。
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "clustercheck"
Galera cluster node is synced のメッセージが表示されるのを確認してください。表示されない場合は、ノードを再作成する必要があります。
Controller-0 で、設定からクラスターアドレスを取得します。
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "grep wsrep_cluster_address /etc/my.cnf.d/galera.cnf" | awk '{print $3}'
残りの各コントローラーノードでデータベースを起動し、クラスターを検証します。
データベースを起動します。
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) /usr/bin/mysqld_safe --pid-file=/var/run/mysql/mysqld.pid --socket=/var/lib/mysql/mysql.sock \ --datadir=/var/lib/mysql --log-error=/var/log/mysql_cluster.log --user=mysql --open-files-limit=16384 \ --wsrep-cluster-address=$CLUSTER_ADDRESS &
MYSQL クラスターのステータスを確認します。
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "clustercheck"
Galera cluster node is synced のメッセージが表示されるのを確認してください。表示されない場合は、ノードを再作成する必要があります。
すべてのコントローラーノードで MySQL コンテナーを停止します。
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle) \ /usr/bin/mysqladmin -u root shutdown
すべてのコントローラーノードで以下のファイアウォールルールを削除して、仮想 IP アドレス経由のデータベース接続を許可します。
$ sudo iptables -D INPUT -p tcp --destination-port 3306 -d $MYSQL_VIP -j DROP
すべてのコントローラーノードで MySQL コンテナーを再起動します。
$ sudo docker container restart $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)
すべてのコントローラーノードで
clustercheck
コンテナーを再起動します。$ sudo docker container restart $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=clustercheck)
Controller-0 で、Galera リソースを
managed
モードに設定します。$ sudo pcs resource manage galera-bundle