EC2 上的负载均衡器 + 自动缩放 + Mysql

Posted

技术标签:

【中文标题】EC2 上的负载均衡器 + 自动缩放 + Mysql【英文标题】:Load Balancer + Autoscaling + Mysql on EC2 【发布时间】:2016-11-03 19:15:57 【问题描述】:

我们有一个 EC2 实例,它是一个网站,它使用 mysql 数据库,该数据库位于同一区域的另一个 EC2 实例上。在 mysql 中,我们提供了基于服务器弹性 IP 的受限访问,以防止入侵。 现在,我们决定在这台服务器上安装 ELB。 ELB 部分实际上工作正常,但是当自动缩放启动一个新实例时,它有一个随机的公共 IP 地址,因此不能添加到 mysql 的异常中。 我尝试将 ELB dns(A Name) 添加到 mysql 以提供访问权限,但它仍然无法正常工作。 ELB 工作,Auto Scaling 启动一个新实例,但由于未连接到数据库,网站显示错误。

我该如何纠正这个问题?

【问题讨论】:

这个问题和软件开发无关,纯操作的东西。 DBA 或系统管理员比软件开发人员更能回答这个问题。 为什么不让他们与用户名、密码连接,该用户名在授权中有一个条目为 host 通配符 % ?还是 EC2 安全组问题(防火墙)。查看select user,host from mysql.user 将了解您的主服务器是如何连接的。大概是通过localhost 【参考方案1】:

使用安全组,而不是限制通过 IP 地址的访问:

创建一个安全组(例如App-SG)并将其与允许与 MySQL 服务器通信的任何实例关联 为 MySQL 实例创建一个安全组(例如,将其命名为SQL-SG)并允许来自App-SG入站 连接

这样,只有App-SG 的机器才能与 MySQL 实例通信。当 Auto Scaling 启动与 App-SG 关联的新实例时,它们也将能够与 MySQL 通信。

您应该尽可能避免使用硬编码的 IP 地址(例如......永远不要使用它们!)。

【讨论】:

谢谢!这似乎是个好主意。但是现在我们遇到了一个问题,我们已经在不同位置的代码中使用了数据库实例的公共 IP,并且更正这将是一个容易出错的任务。由于安全组只允许访问私人 ip 或公共 dns,我们不知道该怎么做。 如果您的数据库与应用服务器位于同一 VPC 中,则应用服务器应该通过公共 IP 地址访问数据库。这会导致流量流出 VPC(通过 Internet 网关),然后再次返回,这会产生 1c/GB 的流量成本。相反,您应该通过解析为数据库私有 IP 的 DNS 名称来引用数据库。如上所述使用安全组,还允许您更改数据库的私有 IP 地址,以防您需要在另一个实例(例如,在不同的 AZ/子网)上启动它。【参考方案2】:

与其通过 IP 限制您的数据库访问,不如考虑通过子网进行限制。

您将拥有一个公共子实体(有网络服务器和 ELB)和一个私有子实体(有数据库服务器) 公共子网中的计算机可供 Internet 中的每个人访问,私有子网中的计算机仅对公共子网中的计算机可用。

有关此类配置的更多信息在这里: http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Scenario2.html

为了管理您的数据库服务器,您可以设置一个堡垒主机: http://blogs.aws.amazon.com/security/post/Tx2ZWDW1QA6D62Y/Controlling-Network-Access-to-EC2-Instances-Using-a-Bastion-Server

【讨论】:

我已经尝试过子网,就像我之前想到的那样。但问题是现在实例已经在运行,我找不到任何方法来更改这些实例的子网。否则这是一个很好的解决方案。

以上是关于EC2 上的负载均衡器 + 自动缩放 + Mysql的主要内容,如果未能解决你的问题,请参考以下文章

使用 ECS 的 Docker 级别负载均衡

AWS EC2 自动扩展理念

AWS 中的 Kubernetes 自动缩放

网络负载均衡器目标组中的 AWS Auto Scaling 目标

创建自动缩放网络服务器组添加到现有 elb

如何在每个带有 codedeploy 的代码中更改 AMI 以实现自动缩放?