[ 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 请求。在优雅地关闭多个节点时,为了保持运行,请按顺序执行操作。

启动集群

优雅地关闭所有节点会破坏集群。从零节点启动或重启集群需要在其中一个节点上创建一个新集群。

  1. 在最先进的节点上启动一个新集群。切换到 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
    
  2. 在其他节点上重启 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,以自动恢复节点或整个环境。

  1. 运行以下 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 请求。

  1. 切换到 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 已发生故障。

  2. 重启失败节点上的 MariaDB,并验证它是否重新加入集群。

  3. 如果 MariaDB 无法启动,请运行 mariadbd 命令并进一步分析输出。最后,重建该节点的容器。

恢复多节点故障

当除了一个节点之外的所有节点都发生故障时,剩余节点无法达到仲裁并停止处理 SQL 请求。在这种情况下,恢复的故障节点无法加入集群,因为集群不再存在。

  1. 运行以下 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,因为它无法达到仲裁。

  2. 运行以下命令以 重新引导 运行节点进入集群

    # 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 请求。

  3. 重启失败节点上的 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
    
  4. 如果 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 命令在一个节点上重启集群。

重建容器

从某些故障中恢复需要重建一个或多个容器。

  1. 在负载均衡器上禁用失败的节点。

    注意

    不要依赖负载均衡器的健康检查来禁用节点。如果未禁用节点,负载均衡器会在它重新加入集群之前向其发送 SQL 请求,并导致数据不一致。

  2. 销毁容器并删除存储在容器外部的 MariaDB 数据

    # openstack-ansible openstack.osa.containers_lxc_destroy \
    -l node3_galera_container-3ea2cbd3
    

    在本例中,节点 3 发生故障。

  3. 运行主机设置 playbook 以在节点 3 上重建容器

    # openstack-ansible oopenstack.osa.containers_lxc_create -l node3 \
    -l node3_galera_container-3ea2cbd3
    

    该 playbook 会重启节点上的所有其他容器。

  4. 运行基础设施 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
    
  5. 在新的容器中重启 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
    
  6. 在负载均衡器上启用先前失败的节点。