5.3. Galera 集群故障排除
如果 Galera 集群没有作为恢复过程的一部分恢复,您必须手动恢复 Galera。
在这一流程中,您必须在一个 Controller 节点上执行一些步骤。确保您在完成流程相同的 Controller 节点上执行这些步骤。
流程
在 Controller-0 上,检索 Galera 集群虚拟 IP:
sudo hiera -c /etc/puppet/hiera.yaml mysql_vip
$ sudo hiera -c /etc/puppet/hiera.yaml mysql_vip
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过所有 Controller 节点上的虚拟 IP 禁用数据库连接:
sudo iptables -I INPUT -p tcp --destination-port 3306 -d $MYSQL_VIP -j DROP
$ sudo iptables -I INPUT -p tcp --destination-port 3306 -d $MYSQL_VIP -j DROP
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Controller-0 上,检索 MySQL root 密码:
sudo hiera -c /etc/puppet/hiera.yaml mysql::server::root_password
$ sudo hiera -c /etc/puppet/hiera.yaml mysql::server::root_password
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Controller-0 上,将 Galera 资源设置为
非受管
模式:sudo pcs resource unmanage galera-bundle
$ sudo pcs resource unmanage galera-bundle
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 停止所有 Controller 节点上的 MySQL 容器:
sudo docker container stop $(sudo docker container ls --all --format “{{.Names}}” --filter=name=galera-bundle)
$ sudo docker container stop $(sudo docker container ls --all --format “{{.Names}}” --filter=name=galera-bundle)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 Controller 节点上移动当前目录:
sudo mv /var/lib/mysql /var/lib/mysql-save
$ sudo mv /var/lib/mysql /var/lib/mysql-save
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 Controller 节点上创建新目录
/var/lib/mysq
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动所有 Controller 节点上的 MySQL 容器:
sudo docker container start $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)
$ sudo docker container start $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 Controller 节点上创建 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 -i $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysql_install_db --datadir=/var/lib/mysql --user=mysql"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动所有 Controller 节点上的数据库:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysqld_safe --skip-networking --wsrep-on=OFF" &
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysqld_safe --skip-networking --wsrep-on=OFF" &
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 Controller 节点上移动
.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"
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mv /root/.my.cnf /root/.my.cnf.bck"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重置所有 Controller 节点上的 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;'"
$ 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;'"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 恢复所有 Controller 节点上的 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"
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mv /root/.my.cnf.bck /root/.my.cnf"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Controller-0 上,将备份数据库文件复制到
/var/lib/MySQL
:sudo cp $BACKUP_FILE /var/lib/mysql sudo cp $BACKUP_GRANT_FILE /var/lib/mysql
$ sudo cp $BACKUP_FILE /var/lib/mysql $ sudo cp $BACKUP_GRANT_FILE /var/lib/mysql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意这些文件的路径为 /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 $(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 \" "
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 关闭所有 Controller 节点上的数据库:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysqladmin shutdown"
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "mysqladmin shutdown"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Controller-0 上,启动 bootstrap 节点:
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:// &
$ 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:// &
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证:在 Controller-0 上,检查集群的状态:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "clustercheck"
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "clustercheck"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保显示以下信息:"Galera 集群节点同步",否则您必须重新创建该节点。
在 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) bash -c "grep wsrep_cluster_address /etc/my.cnf.d/galera.cnf" | awk '{print $3}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在每个剩余的 Controller 节点上,启动数据库并验证集群:
启动数据库:
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 &
$ 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 &
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查 MYSQL 集群的状态:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "clustercheck"
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" \ --filter=name=galera-bundle) bash -c "clustercheck"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保显示以下信息:"Galera 集群节点同步",否则您必须重新创建该节点。
停止所有 Controller 节点上的 MySQL 容器:
sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle) \ /usr/bin/mysqladmin -u root shutdown
$ sudo docker exec $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle) \ /usr/bin/mysqladmin -u root shutdown
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 Controller 节点上,删除以下防火墙规则,以允许通过虚拟 IP 地址进行数据库连接:
sudo iptables -D INPUT -p tcp --destination-port 3306 -d $MYSQL_VIP -j DROP
$ sudo iptables -D INPUT -p tcp --destination-port 3306 -d $MYSQL_VIP -j DROP
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在所有 Controller 节点上重启 MySQL 容器:
sudo docker container restart $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)
$ sudo docker container restart $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=galera-bundle)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启所有 Controller 节点上的
clustercheck
容器:sudo docker container restart $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=clustercheck)
$ sudo docker container restart $(sudo docker container ls --all --format "{{ .Names }}" --filter=name=clustercheck)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Controller-0 上,将 Galera 资源设置为
受管
模式:sudo pcs resource manage galera-bundle
$ sudo pcs resource manage galera-bundle
Copy to Clipboard Copied! Toggle word wrap Toggle overflow