返回

MariaDB Galera 集群设置故障排除指南

mysql

MariaDB Galera 集群设置问题分析与解决

MariaDB Galera 集群的配置问题较为常见,主要原因通常与网络配置、节点配置以及 Galera 本身的同步机制相关。 遇到此类问题,可按以下步骤逐步排查。

节点无法加入集群

当第一个节点启动后,后续节点无法成功加入集群是常见故障点。从日志可以分析到,第二节点在启动时出现 “Connection timed out” 错误,表明该节点未能与现有集群节点建立连接。

原因分析:

  • 网络连通性问题: 虽然节点之间可以互相 ping 通,但防火墙或其他网络策略可能会阻止 MariaDB 实例之间的端口通信。
  • 集群地址配置错误: wsrep_cluster_address 配置错误,导致节点尝试连接到错误的地址或端口。
  • SST(State Snapshot Transfer)方法问题: 使用 rsync 作为 SST 方法,当数据量较大时,可能超时或失败。

解决方案:

  1. 检查防火墙配置: 确保端口 4567(Galera 复制),4568(IST/SST)和 3306(MySQL 客户端连接) 在所有集群节点之间都是可用的。可以尝试临时禁用防火墙进行测试,以确认是否为防火墙导致。
    # 临时关闭防火墙(仅用于测试,请谨慎使用!)
    sudo systemctl stop firewalld  # 对于使用firewalld的系统
    sudo service iptables stop     # 对于使用iptables的系统
    

如果关闭防火墙可以加入,则需要配置规则开放相应端口。

```bash
# 使用firewall开放端口示例:
sudo firewall-cmd --permanent --add-port=4567/tcp
sudo firewall-cmd --permanent --add-port=4568/tcp
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload

# 使用iptables开放端口示例:
sudo iptables -A INPUT -p tcp --dport 4567 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 4568 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
sudo service iptables save
```
  1. 核实集群地址配置: 确保每个节点的 wsrep_cluster_address 准确无误,列出所有集群节点的 IP 地址,并以逗号分隔。节点配置中的地址,需要包含该节点自身以及集群内的所有其他节点。
    错误示例 (Server 1): wsrep_cluster_address=gcomm://192.168.211.133 (仅包含 Server 2 地址)。
    错误示例 (Server 2): wsrep_cluster_address=gcomm://192.168.211.132 (仅包含 Server 1 地址)。

    正确示例(Server 1): wsrep_cluster_address=gcomm://192.168.211.132,192.168.211.133
    正确示例(Server 2): wsrep_cluster_address=gcomm://192.168.211.132,192.168.211.133

    #  在 `/etc/my.cnf` 或 `/etc/mysql/my.cnf` 配置文件中修改 `wsrep_cluster_address`。修改完成后需要重启 `mariadb` 服务。
    sudo systemctl restart mariadb  #  或 sudo service mysql restart
    
  2. 调整 SST 方法: 如果 rsync 在特定环境下速度较慢,可以尝试使用更快的 mariabackup 作为 SST 方法,尤其当数据量庞大时。这可以在一定程度上缓解由于SST超时导致的加入失败。 mariabackup 需要额外安装(一般使用yum install mariadb-backup命令)和一些额外配置,请确保节点上正确配置并支持使用该sst方法。

     #修改 `wsrep_sst_method` 设置
     wsrep_sst_method=mariabackup
    
  3. 检查节点地址配置: 确保 wsrep_node_address 配置与当前节点的 IP 地址一致。虽然节点通过 wsrep_cluster_address发现对方, wsrep_node_address 定义当前节点向集群宣告自身的地址。 wsrep_node_address 如果没有指定具体接口的 IP,则会导致一些潜在的问题,通常直接定义具体的IP地址即可,例如wsrep_node_address='192.168.211.132'wsrep_node_address='192.168.211.133'

    #  在 `/etc/my.cnf` 或 `/etc/mysql/my.cnf` 配置文件中修改 `wsrep_node_address`。修改完成后需要重启 `mariadb` 服务。
    sudo systemctl restart mariadb # 或 sudo service mysql restart
    

Galera 集群状态排查

配置修改完成后, 可以通过 SHOW STATUS LIKE 'wsrep_%' 查看集群运行状态。其中重要的状态包括 wsrep_cluster_size (集群节点数量), wsrep_ready (是否就绪), wsrep_connected (是否连接), 以及 wsrep_local_state_comment (本地状态)。

如果发现 wsrep_cluster_size 并非期望的集群大小或状态不是 "Synched" 或 "Joined", 说明集群同步存在问题。

-- 在mysql客户端中运行
SHOW STATUS LIKE 'wsrep_%';

正常的集群状态中,wsrep_local_state_comment的值应该是 "Synced",wsrep_readywsrep_connected的值均为 ONYES, wsrep_cluster_size 则应该对应期望的集群节点数量。

数据不一致或同步问题

如果节点加入集群但出现数据同步不一致,应排查是否设置了正确的 binlog_format 。Galera 推荐使用 ROW 格式来确保数据的可靠复制。 可以使用以下方式配置binlog_format

# 编辑 /etc/my.cnf 或 /etc/mysql/my.cnf
binlog_format=ROW

修改完后,重启 mariadb 服务,确保配置生效。

另外, 检查每个节点上的 Galera 日志(/var/log/mariadb.log) 以获取更详细的错误信息或警告信息也是排查集群问题的一个有效方式。

安全建议

除了上述排查之外,在配置和管理 Galera 集群时还应考虑安全因素:

  • 限制 MariaDB 访问 : 确保数据库只接受来自必要IP地址的连接。这可以使用 bind-address 或防火墙实现。
  • 使用强密码 : 为 root 用户和其他用户配置足够强的密码。
  • 定期备份 : 定期备份集群数据, 以防数据丢失或意外发生。
  • 定期更新 : 更新 MariaDB Galera 版本可以带来新的功能和安全性修复,降低潜在风险。

这些措施可以增强系统的安全性和可靠性,提高生产环境下的容错能力。