我有一个 Web 应用程序,它由一个由 Web 托管公司管理的 Web 服务器、一组 Amazon 云中的 EC2 实例和一个 MySQL 数据库(托管在 Web 服务器上)组成。MySQL 位于防火墙后面,并设置为允许从 Localhost 和单个 IP 地址(即连接到我迄今为止运行的 EC2 实例的 Amazon Elastic IP 地址)进行访问。
问题是我想查看我的 EC2 实例的扩展和负载平衡策略。为此,我一直在研究 Amazon 提供的弹性负载均衡器和自动缩放工具,并已成功设置好它们,但还有一件事 - 连接到在我的 Web 服务器上运行的 MySQL 数据库。我意识到(感谢 Serverfault 上的答案)我需要检查防火墙设置并添加负载均衡器的 IP 地址,但是弹性负载均衡器为您提供的是 DNS 名称,而不是 IP 地址,事实上 IP 地址会随着时间而变化,所以这行不通。托管数据库的公司告诉我,防火墙的工作方式是查找 DNS 名称的 IP 地址并存储 IP 而不是 DNS 名称。所以基本上这行不通,允许访问的唯一方法是打开 SQL 端口以允许任何人访问!
这是一个可行的想法吗?我是否应该考虑将数据库移至云中?服务器公司是否可以使用其他防火墙?我是否应该找到另一种负载平衡方法(如果是,该怎么办?)
有点棘手吧?任何帮助都值得感激!
答案1
EC2 实例有自己的 IP,无论它们是否位于 Elastic Load Balancer 后面。您无法将 Elastic Load Balancer IP 添加到防火墙以允许从 EC2 实例进行访问,因为 EC2 的传出 IP 不是 Load Balancer 的 IP,而是实例本身的 IP。
如果您计划拥有多个 EC2 实例,那么您肯定需要一种方法来允许 MySQL 服务器防火墙上有多个 IP。因为每个 EC2 实例都有自己的传出 IP。
永远不要向任何人开放你的 MySQL 端口。
您的问题不是负载平衡器,而是 MySQL 服务器。如果您可以将数据库移至云端,那将是最好的方法。
答案2
有几种方法可以解决这个问题:
设置一个脚本,每隔约 30 秒检查一次,确保防火墙规则设置正确,并在您的应用程序中编写一些针对失败连接的错误处理代码(不可取)。
使用 Apache 服务器作为负载均衡器(或使用多个 DNS 循环指向,这样只需监控几个 IP 地址)。Apache 具有相当成熟的负载均衡功能,您可以利用这些功能来代替 ELB。
答案3
这是 EC2 的问题之一,解决此问题的一种方法是从 EC2 实例到您的 DB 服务器创建一个自动 VPN 隧道(使用 stunnel、ssh 或 ipsec,您自己选择),如果您有足够的带宽,它应该可以很好地解决您的问题。我个人会选择 stunnel。
被动式防火墙的问题在于它总会在某种程度上造成一些破坏。