[ English | Indonesia | русский ]
Galera 集群维护¶
常规维护包括在不影响操作的情况下,优雅地添加或删除集群中的节点,以及在优雅地关闭所有节点后启动集群。
当创建集群、添加节点、服务未运行时,或者对 /etc/mysql/my.cnf 配置文件进行更改时,MariaDB 实例将被重启。
验证集群状态¶
将以下命令的输出与以下输出进行比较。它应该提供有关集群状态的信息。
# ansible galera_container -m shell -a "mariadb \
-e 'show status like \"%wsrep_cluster_%\";'"
node3_galera_container-3ea2cbd3 | FAILED | rc=1 >>
ERROR 2002 (HY000): Can't connect to local MySQL server
through socket '/var/run/mysqld/mysqld.sock' (2)
node2_galera_container-49a47d25 | FAILED | rc=1 >>
ERROR 2002 (HY000): Can't connect to local MySQL server
through socket '/var/run/mysqld/mysqld.sock' (2)
node4_galera_container-76275635 | success | rc=0 >>
Variable_name Value
wsrep_cluster_conf_id 7
wsrep_cluster_size 1
wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1
wsrep_cluster_status Primary
在本例中,只有一个节点响应。
在所有节点(除了一个)上优雅地关闭 MariaDB 服务,允许剩余的运行节点继续处理 SQL 请求。在优雅地关闭多个节点时,为了保持运行,请按顺序执行操作。
启动集群¶
优雅地关闭所有节点会破坏集群。从零节点启动或重启集群需要在其中一个节点上创建一个新集群。
在最先进的节点上启动一个新集群。切换到
playbooks目录,并检查所有节点上的grastate.dat文件中的seqno值# ansible galera_container -m shell -a "cat /var/lib/mysql/grastate.dat" node2_galera_container-49a47d25 | success | rc=0 >> # GALERA saved state version: 2.1 uuid: 338b06b0-2948-11e4-9d06-bef42f6c52f1 seqno: 31 cert_index: node3_galera_container-3ea2cbd3 | success | rc=0 >> # GALERA saved state version: 2.1 uuid: 338b06b0-2948-11e4-9d06-bef42f6c52f1 seqno: 31 cert_index: node4_galera_container-76275635 | success | rc=0 >> # GALERA saved state version: 2.1 uuid: 338b06b0-2948-11e4-9d06-bef42f6c52f1 seqno: 31 cert_index:
在本例中,集群中的所有节点都包含相同的正
seqno值,因为它们在优雅关闭之前刚刚同步。如果所有seqno值相等,则任何节点都可以启动新集群。## for init # /etc/init.d/mariadb start --wsrep-new-cluster ## for systemd # systemctl set-environment _WSREP_NEW_CLUSTER='--wsrep-new-cluster' # systemctl start mariadb # systemctl set-environment _WSREP_NEW_CLUSTER=''
请参阅 启动集群 了解更多信息。
也可以使用 Ansible 的 shell 模块来完成此操作
# ansible galera_container -m shell -a "/etc/init.d/mariadb start --wsrep-new-cluster" --limit galera_container[0]
此命令将创建一个包含单个节点的集群。
wsrep_cluster_size值显示集群中的节点数。node2_galera_container-49a47d25 | FAILED | rc=1 >> ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111) node3_galera_container-3ea2cbd3 | FAILED | rc=1 >> ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) node4_galera_container-76275635 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 1 wsrep_cluster_size 1 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary
在其他节点上重启 MariaDB(将之前 Ansible 命令中的 [0] 替换为 [1:]),并验证它们是否重新加入集群。
node2_galera_container-49a47d25 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 3 wsrep_cluster_size 3 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary node3_galera_container-3ea2cbd3 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 3 wsrep_cluster_size 3 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary node4_galera_container-76275635 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 3 wsrep_cluster_size 3 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary
Galera 集群恢复¶
使用 galera_force_bootstrap 变量运行 openstack.osa.galera_server playbook,以自动恢复节点或整个环境。
运行以下 Ansible 命令以显示失败的节点
# openstack-ansible openstack.osa.galera_server -e galera_force_bootstrap=true --tags galera_server-config
您还可以通过 galera_server_bootstrap_node 变量定义不同的引导节点,以防当前引导节点处于不同步/损坏状态。您可以使用此临时命令检查当前选择的引导节点
root@aio1:/opt/openstack-ansible# ansible -m debug -a var="groups['galera_all'][0]" localhost
完成此命令后,集群将恢复在线。如果失败,请查阅 Galera 文档中的 重启集群 和 恢复主组件,它们对于完整的集群恢复至关重要。
恢复单个节点故障¶
如果单个节点发生故障,其他节点将维持仲裁并继续处理 SQL 请求。
切换到
playbooks目录,并运行以下 Ansible 命令以确定失败的节点# ansible galera_container -m shell -a "mariadb \ -e 'show status like \"%wsrep_cluster_%\";'" node3_galera_container-3ea2cbd3 | FAILED | rc=1 >> ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111) node2_galera_container-49a47d25 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 17 wsrep_cluster_size 3 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary node4_galera_container-76275635 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 17 wsrep_cluster_size 3 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary
在本例中,节点 3 已发生故障。
重启失败节点上的 MariaDB,并验证它是否重新加入集群。
如果 MariaDB 无法启动,请运行
mariadbd命令并进一步分析输出。最后,重建该节点的容器。
恢复多节点故障¶
当除了一个节点之外的所有节点都发生故障时,剩余节点无法达到仲裁并停止处理 SQL 请求。在这种情况下,恢复的故障节点无法加入集群,因为集群不再存在。
运行以下 Ansible 命令以显示失败的节点
# ansible galera_container -m shell -a "mariadb \ -e 'show status like \"%wsrep_cluster_%\";'" node2_galera_container-49a47d25 | FAILED | rc=1 >> ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111) node3_galera_container-3ea2cbd3 | FAILED | rc=1 >> ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111) node4_galera_container-76275635 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 18446744073709551615 wsrep_cluster_size 1 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status non-Primary
在本例中,节点 2 和 3 已发生故障。剩余的运行服务器指示
non-Primary,因为它无法达到仲裁。运行以下命令以 重新引导 运行节点进入集群
# mariadb -e "SET GLOBAL wsrep_provider_options='pc.bootstrap=yes';" node4_galera_container-76275635 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 15 wsrep_cluster_size 1 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary node3_galera_container-3ea2cbd3 | FAILED | rc=1 >> ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111) node2_galera_container-49a47d25 | FAILED | rc=1 >> ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
剩余的运行节点成为主节点并开始处理 SQL 请求。
重启失败节点上的 MariaDB,并验证它们是否重新加入集群
# ansible galera_container -m shell -a "mariadb \ -e 'show status like \"%wsrep_cluster_%\";'" node3_galera_container-3ea2cbd3 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 17 wsrep_cluster_size 3 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary node2_galera_container-49a47d25 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 17 wsrep_cluster_size 3 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary node4_galera_container-76275635 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 17 wsrep_cluster_size 3 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary
如果 MariaDB 在任何失败节点上都无法启动,请运行
mariadbd命令并进一步分析输出。最后,重建该节点的容器。
恢复完整环境故障¶
如果 Galera 集群中的所有节点都发生故障(不要优雅关闭),请从备份恢复。切换到 playbook 目录,并运行以下命令以确定集群中的所有节点是否都已发生故障
# ansible galera_container -m shell -a "cat /var/lib/mysql/grastate.dat"
node3_galera_container-3ea2cbd3 | success | rc=0 >>
# GALERA saved state
version: 2.1
uuid: 338b06b0-2948-11e4-9d06-bef42f6c52f1
seqno: -1
cert_index:
node2_galera_container-49a47d25 | success | rc=0 >>
# GALERA saved state
version: 2.1
uuid: 338b06b0-2948-11e4-9d06-bef42f6c52f1
seqno: -1
cert_index:
node4_galera_container-76275635 | success | rc=0 >>
# GALERA saved state
version: 2.1
uuid: 338b06b0-2948-11e4-9d06-bef42f6c52f1
seqno: -1
cert_index:
如果 mariadbd 未在任何节点上运行,并且所有节点都包含 seqno 值为 -1,则所有节点都已发生故障。
如果任何单个节点具有正 seqno 值,则可以使用该节点来重启集群。但是,由于无法保证每个节点都具有相同的数据副本,因此我们不建议使用 --wsrep-new-cluster 命令在一个节点上重启集群。
重建容器¶
从某些故障中恢复需要重建一个或多个容器。
在负载均衡器上禁用失败的节点。
注意
不要依赖负载均衡器的健康检查来禁用节点。如果未禁用节点,负载均衡器会在它重新加入集群之前向其发送 SQL 请求,并导致数据不一致。
销毁容器并删除存储在容器外部的 MariaDB 数据
# openstack-ansible openstack.osa.containers_lxc_destroy \ -l node3_galera_container-3ea2cbd3
在本例中,节点 3 发生故障。
运行主机设置 playbook 以在节点 3 上重建容器
# openstack-ansible oopenstack.osa.containers_lxc_create -l node3 \ -l node3_galera_container-3ea2cbd3
该 playbook 会重启节点上的所有其他容器。
运行基础设施 playbook 以专门在节点 3 上配置容器
# openstack-ansible openstack.osa.setup_infrastructure \ --limit node3_galera_container-3ea2cbd3
警告
新的容器运行一个单节点 Galera 集群,这是一种危险的状态,因为环境包含多个具有潜在不同数据的活动数据库。
# ansible galera_container -m shell -a "mariadb \ -e 'show status like \"%wsrep_cluster_%\";'" node3_galera_container-3ea2cbd3 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 1 wsrep_cluster_size 1 wsrep_cluster_state_uuid da078d01-29e5-11e4-a051-03d896dbdb2d wsrep_cluster_status Primary node2_galera_container-49a47d25 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 4 wsrep_cluster_size 2 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary node4_galera_container-76275635 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 4 wsrep_cluster_size 2 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary
在新的容器中重启 MariaDB,并验证它是否重新加入集群。
注意
在较大的部署中,MariaDB 守护程序在新容器中启动可能需要一些时间。在此期间,它将从其他 MariaDB 服务器同步数据。您可以通过 tailing
journalctl -f -u mariadb日志文件来监控此过程中的状态。在同步过程中将出现以
WSREP_SST开头的行,如果同步成功,您应该看到带有WSREP: SST complete, seqno: <NUMBER>的行。# ansible galera_container -m shell -a "mariadb \ -e 'show status like \"%wsrep_cluster_%\";'" node2_galera_container-49a47d25 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 5 wsrep_cluster_size 3 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary node3_galera_container-3ea2cbd3 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 5 wsrep_cluster_size 3 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary node4_galera_container-76275635 | success | rc=0 >> Variable_name Value wsrep_cluster_conf_id 5 wsrep_cluster_size 3 wsrep_cluster_state_uuid 338b06b0-2948-11e4-9d06-bef42f6c52f1 wsrep_cluster_status Primary
在负载均衡器上启用先前失败的节点。