目前,我们在异地数据中心运行多个 MySQL 服务器,这些服务器接收来自多个 Web 服务器的连接,以及来自家中 20 到 30 个用户的连接,这些用户都安装了本地应用程序。
数据库服务器在自己的私有网络中运行,该网络具有单个外部 IP 地址和单个防火墙。所有服务器都在同一个 MySQL 端口上运行,通过端口映射,防火墙将正确的端口路由到正确的服务器,连接到 external-ip:2001 会转到数据库服务器 1,连接到 external-ip:2002 会连接到数据库服务器 2。
现在我们想迁移到 Google Cloud Platform。我一直在尝试不同的设置,但我找不到像现在这样设置的方法。我可以看到每个单独的 SQL 实例的防火墙设置,但这不是我想要的方式。有了 8 个不同的服务器,其中一些有多个副本,管理所有防火墙规则很快就会成为一场噩梦。如上所述,我们有 30 多个用户,但并非所有用户都有完全静态的 IP 地址。
配置此设置的最佳方法是什么?
答案1
Cloud SQL 是一种托管数据库服务,访问它的方式可能与您通常在本地服务器上的方式不同。您可以通过两种方式访问 Cloud SQL 实例。如果您从外部应用程序连接,请执行以下操作之一:
- 为每个实例的每个客户端 IP 地址授权。
- 使用云端 SQL 代理。
请注意,这里没有提到配置防火墙。第一个选项听起来不太好,因为您有许多用户,并且他们的 IP 地址不是完全静态的。这些问题可以通过使用 Cloud SQL 代理来解决。通过使用第二种方法,您必须在用户端配置代理才能连接到实例。
Cloud SQL Proxy 的工作原理是在本地环境中运行一个本地客户端(称为代理)。您的应用程序使用数据库使用的标准数据库协议与代理进行通信。代理使用安全隧道与服务器上运行的配套进程进行通信。
虽然代理可以监听任何端口,但它只会在端口 3307 上创建到 Cloud SQL 实例的传出连接。如果您有出站防火墙策略,请确保它允许连接到 Cloud SQL 实例 IP 上的端口 3307。
要了解如何使用代理,请参阅此文档:https://cloud.google.com/sql/docs/mysql/connect-admin-proxy
答案2
有一种方法可以帮助您获得所需的架构。
我将列出可执行此操作的步骤。
基本上,您想要的是从一个可公开访问的 IP 到多个不公开可用的 IP 的端口转发,通过该 IP 您可以连接到 Cloud SQL 后端服务器。
要做到这一点 -
创建两个 MySQL 类型的 Cloud SQL 实例,并将其配置为仅使用私有 IP 地址。要了解如何配置私有 IP,请按照以下步骤操作这个文件。
使用 Ubuntu 16.04 LTS 映像创建一个 Compute Engine 实例,并在创建时启用 IP 转发。您可以关注这个文件知道如何做到这一点。
通过 SSH 进入 Compute Engine 实例
gcloud compute ssh FIRST_COMPUTE_ENGINE_INSTANCE_NAME
运行以下命令编辑 /etc/sysctl.conf 文件。
sudo nano /etc/sysctl.conf
现在取消注释该行以启用 IP 转发
#uncomment the below line
net.ipv4.ip_forward=1
现在运行以下命令,如果未设置,则将 ip_forward 设置为 1。
sudo su
echo 1 >| /proc/sys/net/ipv4/ip_forward
exit
现在我们必须配置 IP 表。运行以下命令
sudo iptables -F
上述命令将刷新或删除所有当前存在的 IP 规则。
sudo iptables -F -t nat
上述命令将刷新或删除所有类型网络地址转换(NAT)的 IP 规则。
sudo iptables -t nat -A PREROUTING -p tcp -d INTERNAL_IP_OF_COMPUTE_ENGINE --d port 4479 -j DNAT --to-destination PRIVATE_IP_OF_FIRST_SQL_INSTANCE:3306
sudo iptables -t nat -A PREROUTING -p tcp -d INTERNAL_IP_OF_COMPUTE_ENGINE --d port 4480 -j DNAT --to-destination PRIVATE_IP_OF_SECOND_SQL_INSTANCE:3306
上述命令将请求从 Compute Engine 路由到 Cloud SQL 实例。由于我有两个 SQL 实例,因此我必须使用不同的端口(即 4479 和 4480)运行两次该命令。您可以根据要连接的 Cloud SQL 实例数量指定不同的端口多次运行上述命令。请注意,我们必须添加防火墙规则以允许在我们的虚拟专用网络 (VPC) 中连接这些端口号。3306 端口与 MySQL 数据库一致,因为 Cloud SQL 实例是 MySQL 类型。
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
上述命令将掩盖/屏蔽试图连接数据库的 IP。
sudo iptables -L -t nat
上述命令将列出 NAT 类型的 iptables。
上述步骤将配置通过单个 IP 连接到多个 Cloud SQL 实例,这些实例将可供公众访问。现在,要测试它是否真的有效,您可以在 Compute Engine 中创建一个测试实例并连接到数据库。
欲了解更多详情,请关注本文。
或者,您也可以探索 这个文件了解 Compute Engine 实例中的协议转发,这可能会对您的用例有所帮助。