为 MySQL 集群使用 AWS 网络负载均衡器

为 MySQL 集群使用 AWS 网络负载均衡器

我问过这个问题堆栈溢出但我认为它可能更适合这个社区。

我有一个连接到 MySQL 集群(它是 Galera 集群)的 Web 服务器...该集群运行良好(如果我在 MySQL 的第一个实例上更新记录,它将自动在第二个实例上更新)。问题是我需要在 Web 服务器和 MySQL 实例之间安装一个负载平衡器...

所以我所做的是设置一个 AWS 网络负载均衡器(NLB 在网络层工作,在我的情况下是 TCP)...我已将 MySQL 的 2 个实例添加到 NLB 的目标组(它们的私有 IP)。

在此处输入图片描述

现在我继续更新 Web 服务器中的连接字符串以连接到 NLB:

<add name="MyDB" connectionString="Server=my-nlb-ap-southeast-2.amazonaws.com; Port=3306; Database=mydb; Uid=user1; Pwd=mypassword; Protocol=TCP" providerName="MySql.Data.MySqlClient"/>

但我收到以下错误:

[MySqlException (0x80004005): 无法连接到任何指定的 MySQL 主机。] MySql.Data.MySqlClient.NativeDriver.Open() +1734 MySql.Data.MySqlClient.Driver.Open() +60 MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder 设置) +309 MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection() +18 MySql.Data.MySqlClient.MySqlPool.GetPooledConnection() +290 MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() +151 MySql.Data.MySqlClient.MySqlPool.GetConnection() +60 MySql.Data.MySqlClient.MySqlConnection.Open() +1588 MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection 连接) +182 System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection 连接)

当我尝试从 Web 服务器连接到 MySQL 时,出现以下信息:

在此处输入图片描述

在此处输入图片描述

我相信这意味着 Web 服务器能够通过 NLB 访问 MySQL 实例,但我不知道为什么连接字符串不起作用。

我已经向所有 IP 开放了端口 3306,并且我可以从不在 VPC 中的本地计算机连接到 NLB:

在此处输入图片描述

但网络服务器仍然出现相同的错误......


我决定使用 AWS NLB 而不是 HAProxy 的原因是 NLB 具有高可用性...我相信,如果我想使用 HAProxy,那么我需要向我的 VPC 添加另外 2 台服务器作为 HAProxy(为了实现高可用性)...如果是 NLB,我只能使用 1 个高可用性负载均衡器,但我不确定是否可以将 AWS NLB 用于此目的?

答案1

有趣的是,连接字符串不起作用。您可以从 Web 服务器运行 mysql 客户端并验证它是否可以连接和验证吗?

C:\> mysql -hmy-nlb-ap-southeast-2.amazonaws.com -uuser1 -pmypassword

另外 - 你确定你确实需要 NLB 吗?使用 DNS 进行负载平衡怎么样?创建一个包含mydb.example.com两个地址的记录,每个数据库集群节点一个。

mydb.example.com. IN A 10.20.30.40  ; db node 1
                  IN A 10.20.40.50    ; db node 2

具有多个值的 DNS 记录返回循环赛订单,这意味着一些客户将得到节点 1IP 优先,而其他人将获得节点 2首先。如果他们的主节点发生故障,他们仍然可以使用其他 IP 进行故障转移。

在 NLB 上花费太多时间和金钱之前,我会先尝试这种 DNS 方法。

希望有帮助:)

相关内容