Haproxy 与 MySQL 集群设置

Haproxy 与 MySQL 集群设置

我有 2 台 MySQL 服务器,它们之间有主主复制。复制工作正常。

我需要在它们之间配置高可用性,以便如果其中任何一个出现故障,另一个就可以接管。

我正在关注这个教程 https://towardsdatascience.com/high-availability-mysql-cluster-with-load-balancing-using-haproxy-and-heartbeat-40a16e134691

当我尝试添加用户时,问题就开始了,HAProxy 将使用用户来检查 MySQL 服务器的健康状态 server1# mysql -u root -p mysql> CREATE USER 'haproxy_check'@'%';

我在这里收到密码策略错误。由于这是托管医疗数据的生产服务器,出于 HIPAA 合规性考虑,我不能在 MySQL 数据库服务器中拥有没有密码的用户。有什么替代方法可以解决此问题吗?

答案1

我不建议使用该教程中描述的架构或系统。Heartbeat 已经停产近十年了,双节点主-主集群只有在采用高效隔离的情况下才有希望实现弹性(因为两个节点无法达到法定人数),而该教程中甚至没有涉及这一点。

此外,在两个节点上建立高度活跃的集群意义不大——目标是能够丢失一个节点,因此如果系统在两个读/写副本之间实现“平衡”,则两个系统都应强制执行最大 40% 的负载利用率。使用描述单个主要读/写副本的主动/被动系统更为合理,开销也更小,因为只读副本处于待命状态,可以进行升级。

建立比完全缺乏隔离或仲裁更强大的集群稳定性保证也很重要。与其用 Heartbeat 来表达这一点,不如用 Pacemaker 和 Corosync 来表达。可以使用第三个(非常小的)节点来建立仲裁 - 要么使用 Galera,要么通过 Corosync。我建议两者兼而有之。

作为 Galera 的替代方案,复制底层存储并仅运行一个 SQL 服务器实例是一种非常快速、低开销的选项。这可以通过 DRBD、Pacemaker 和 Corosync 实现。在 Pacemaker 中管理 MySQL 集群是十多年来一直被解决的问题,并且运行非常可靠。

答案2

您的选择至少包括:

  1. 仅检查 MySQL 是否正在侦听 TCP 端口。换句话说,option mysql-check从 HAProxy 配置中删除。TCP 检查将告诉 HAProxy MySQL 是否正在侦听端口 3306(这意味着它正在运行),但不会告诉 HAProxy 是否可以成功登录。
  2. 在每个 MySQL 服务器上,运行xinetd并编写一个处理本地计算机登录的脚本。这相当简单。类似以下内容,但请注意,这并非旨在按原样使用;MySQL 命令应进行自定义,密码应以某种安全的方式存储等。这本质上是脚本在 Percona XtraDB 中执行的操作的简化版本。HAProxy将在暴露的端口上clustercheck执行操作并查看响应代码。http-checkxinetd
#!/bin/sh
SEC=`mysql -u haproxy_check -pxxxxx -e "show slave status\G" 2>/dev/null | grep "Seconds_Behind_Master" | awk '{print $2}'`
if [ "${SEC}" == "" ] || [ ${SEC} -gt XX ]; then
  echo -en "HTTP/1.1 503 Service Unavailable\r\n"
  echo -en "Content-Type: text/plain\r\n"
  echo -en "Connection: close\r\n"
  echo -en "\r\n"
  echo -en "Unavailable.\r\n"
  sleep 0.1
  exit 1
else
  echo -en "HTTP/1.1 200 OK\r\n"
  echo -en "Content-Type: text/plain\r\n"
  echo -en "Connection: close\r\n"
  echo -en "\r\n"
  echo -en "Available.\r\n"
  sleep 0.1
  exit 1
fi
  1. 使用带有 Galera 的完整集群(3 个节点)并使用脚本clustercheck
  2. 接受检查用户没有密码。

答案3

只需尝试“CREATE USER‘sammy’@‘localhost’IDENTIFIED WITH mysql_native_password BY‘password’;”

相关内容