![连接 galera 集群的最佳实践?](https://linux22.com/image/671626/%E8%BF%9E%E6%8E%A5%20galera%20%E9%9B%86%E7%BE%A4%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%EF%BC%9F.png)
如果我有 7 台服务器,有 7 个 IP,那么连接它们的最佳方式是什么?
我想到过:1.)通过一个 IP 指向我的所有查询 2.)使用 rand() 随机选择一个 IP 并连接到它,将所有查询分布在服务器上
答案1
在 galera 集群前使用 HAProxy 或任何其他智能负载均衡器。利用 galera 集群的最佳方式是将所有查询分布在所有活跃且健康的服务器上。
如何检测服务器是否活跃且健康?
这很简单。据我所知,HAProxy 没有类似 mysql 的检查功能,因此它无法自行执行此操作。但 HAProxy 具有 HTTP 健康检查功能。因此,您可以在每个 galera 节点上运行一些小型 http 服务器(nginx 非常适合此操作),并且会有脚本连接到本地节点,执行某些操作并返回取决于 galera 响应的状态代码。您应该尝试执行所有常见类型的查询(INSERT、SELECT、UPDATE 和 DELETE)以确保节点健康,但当 WSREP 失败时,此节点上的每个查询都会失败,即使是像这样简单的查询select now();
。HAProxy 将定期运行此脚本并对返回的状态代码做出反应。
如何简单避免HAProxy SPOF?
在每个应用服务器上安装它!HAProxy 是相当小的软件,因此您可以将其与您的应用一起运行。这种方法的好处是您的应用程序会将所有数据库查询指向本地主机,并且不会涉及集群,因此您可以根据需要扩展它,只需更新 HAProxy 配置(可以使用套接字 API 即时完成)。
为什么指向一个 IP 或 rand() 是个坏主意?
Rand() 无法对数据库服务器的中断做出反应。而且正如我在集群中看到的那样,galera 并不是一项稳定的技术。
使用一个 IP 指向所有查询是不好的,因为您浪费了另外 6 个节点的资源。而且您必须准备健康检查脚本以跨集群移动 VIP。