我问过这个问题堆栈溢出但我认为它可能更适合这个社区。
我有一个连接到 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 方法。
希望有帮助:)