多个区域的云 sql
cloud sql for multiple regions
我正在创建一个 google 云设置,其中包含多个区域中的多个实例组 (3)。他们都在同一个VPC中。
地区:
- us-central1
- 欧洲北部1
- 亚洲东部1
所有三个实例组都有 2 个虚拟机。它是一个 HTTP(S) 负载平衡器,当我访问负载平衡器的 public IP 地址时,我看到了 apache 欢迎页面(apache 安装在 VM 上)。所以这有效。
我还有一个 Cloud SQL (PostgreSQL) 数据库。我想通过它的私有 IP 访问这个数据库。我已将 VM 使用的 VPC 网络与 Cloud SQL 实例的私有 IP 相关联。此实例 运行s 在 us-central1 区域。
现在,问题是:它不工作。 :) 我在文档中做了一些研究,我发现了这个:
You must choose a VPC network to use. The Google Cloud resources you will use to connect to your Cloud SQL instance (either Compute Engine instances [VMs] or Google Kubernetes Engine instances) must use this VPC network in order to be able to connect. These resources must also be in the same region as your Cloud SQL instance.
来源:https://cloud.google.com/sql/docs/postgres/configure-private-ip
为了测试,我在 us-central1 区域(未与实例组关联)和正确的 VPC 添加了一个新 VM。当我在此 VM 上安装 postgresql-client 时,我可以连接到数据库。但是,当我在 europe-north1 区域(也未与实例组关联)并使用正确的 VPC 创建另一个 VM 时,我无法连接到数据库。所以文档是(令人惊讶的)正确的:与云 SQL 实例所在区域不同的区域中的实例 运行ning,无法通过私有 IP 连接到云 SQL。
我现在的问题是:解决这个问题的最佳方法是什么,以便不同实例组中的所有虚拟机都可以连接到同一个数据库。我是否应该在不同区域创建多个 Cloud SQL 实例并在某些数据为 inserted/updated/deleted 时复制每个数据库?对我来说,这似乎是很多不必要的流量和负载。
另一种选择是(我认为)是使用 Cloud Spanner。我刚刚发现了这个选项,目前正在阅读文档。这是要走的路吗?
编辑: Cloud Spanner 似乎很有前途,但我认为它也非常昂贵。具有 1 GB 存储空间的 1 个节点约为 650 美元/月。
另一种选择是通过 public IP 访问云 SQL 数据库。问题是:我应该将每个 VM IP 地址列入白名单,并且因为我使用自动缩放,所以 VM 是在移动中创建的(使用新的 IP 地址)。我该如何解决这个问题,以便新的 VM 自动列入数据库白名单?
编辑: 根据 Gabe Weiss 的回答,我创建了一个新的(测试)VM,并安装了云 SQL 代理和 postgresql 客户端。它有效,当我建立连接或进行查询时,一切都很好。
现在,问题是:它在我的 nodejs-app 中不起作用。我正在使用 node-postgres (https://node-postgres.com/),我的连接配置是这样的:
const db = new Pool({
host: '127.0.0.1',
port: 5432,
user: 'postgres',
password: 'postgres',
database: 'postgres'
})
我也尝试将“127.0.0.1”替换为本地主机,我删除了端口,...没有任何效果。凭据正确。
编辑 2: 当我 运行 在后台运行 cloud_sql_proxy 时,我 运行 我的 nodejs 应用程序也是如此,而且我导航至 http://external_ip_address:8000/node,我在控制台中看到一条日志:
2020/01/22 17:55:20 New connection for "project-id:region:instance-name"
但是 10 秒后,我得到了这个:
2020/01/22 17:57:00 Client closed local connection on 127.0.0.1:5432
编辑 3:
我也试过把主机改成/cloudsql/instance_connection_name,也没结果。
const db = new Pool({
host: '/cloudsql/[project-id]:[region]:[instance-name]',
port: 5432,
user: 'postgres',
password: 'postgres',
database: 'postgres'
})
Spanner 绝对是一个选项,因为与连接到 Cloud SQL 跨区域相比,使用 Spanner 进行全局一致的设置可能会获得更好的延迟。
另一种选择是查看 VPC 对等互连:https://cloud.google.com/vpc/docs/vpc-peering
我认为你可以跨区域,虽然我还没有玩过它来确定,但那可能只是 "work" 使用私有 IP。
或者,如果您可以接受应用程序中的一些延迟,通过 public IP 连接到云 SQL 是一个不错的选择,但不要使用允许的网络(白名单)。尽可能使用代理,或设置 SSL 连接(这有点痛苦,但绝对值得)..
我在此处有一篇关于使用 public IP + 云 SQL 代理的详细博客:https://medium.com/@GabeWeiss/connecting-cloud-sql-public-ip-sql-proxy-5513f59e5a9e,这是从您的 VM 开始的相对简单的方法。
解决方案
所以解决方案非常简单:它与某些配置无关,而是与我的 nodejs 代码有关。我忘记了 postgresql 查询是一个承诺,所以我必须等待结果 return。添加 async/await 解决了问题。
我正在创建一个 google 云设置,其中包含多个区域中的多个实例组 (3)。他们都在同一个VPC中。
地区:
- us-central1
- 欧洲北部1
- 亚洲东部1
所有三个实例组都有 2 个虚拟机。它是一个 HTTP(S) 负载平衡器,当我访问负载平衡器的 public IP 地址时,我看到了 apache 欢迎页面(apache 安装在 VM 上)。所以这有效。
我还有一个 Cloud SQL (PostgreSQL) 数据库。我想通过它的私有 IP 访问这个数据库。我已将 VM 使用的 VPC 网络与 Cloud SQL 实例的私有 IP 相关联。此实例 运行s 在 us-central1 区域。
现在,问题是:它不工作。 :) 我在文档中做了一些研究,我发现了这个:
You must choose a VPC network to use. The Google Cloud resources you will use to connect to your Cloud SQL instance (either Compute Engine instances [VMs] or Google Kubernetes Engine instances) must use this VPC network in order to be able to connect. These resources must also be in the same region as your Cloud SQL instance.
来源:https://cloud.google.com/sql/docs/postgres/configure-private-ip
为了测试,我在 us-central1 区域(未与实例组关联)和正确的 VPC 添加了一个新 VM。当我在此 VM 上安装 postgresql-client 时,我可以连接到数据库。但是,当我在 europe-north1 区域(也未与实例组关联)并使用正确的 VPC 创建另一个 VM 时,我无法连接到数据库。所以文档是(令人惊讶的)正确的:与云 SQL 实例所在区域不同的区域中的实例 运行ning,无法通过私有 IP 连接到云 SQL。
我现在的问题是:解决这个问题的最佳方法是什么,以便不同实例组中的所有虚拟机都可以连接到同一个数据库。我是否应该在不同区域创建多个 Cloud SQL 实例并在某些数据为 inserted/updated/deleted 时复制每个数据库?对我来说,这似乎是很多不必要的流量和负载。
另一种选择是(我认为)是使用 Cloud Spanner。我刚刚发现了这个选项,目前正在阅读文档。这是要走的路吗?
编辑: Cloud Spanner 似乎很有前途,但我认为它也非常昂贵。具有 1 GB 存储空间的 1 个节点约为 650 美元/月。
另一种选择是通过 public IP 访问云 SQL 数据库。问题是:我应该将每个 VM IP 地址列入白名单,并且因为我使用自动缩放,所以 VM 是在移动中创建的(使用新的 IP 地址)。我该如何解决这个问题,以便新的 VM 自动列入数据库白名单?
编辑: 根据 Gabe Weiss 的回答,我创建了一个新的(测试)VM,并安装了云 SQL 代理和 postgresql 客户端。它有效,当我建立连接或进行查询时,一切都很好。
现在,问题是:它在我的 nodejs-app 中不起作用。我正在使用 node-postgres (https://node-postgres.com/),我的连接配置是这样的:
const db = new Pool({
host: '127.0.0.1',
port: 5432,
user: 'postgres',
password: 'postgres',
database: 'postgres'
})
我也尝试将“127.0.0.1”替换为本地主机,我删除了端口,...没有任何效果。凭据正确。
编辑 2: 当我 运行 在后台运行 cloud_sql_proxy 时,我 运行 我的 nodejs 应用程序也是如此,而且我导航至 http://external_ip_address:8000/node,我在控制台中看到一条日志:
2020/01/22 17:55:20 New connection for "project-id:region:instance-name"
但是 10 秒后,我得到了这个:
2020/01/22 17:57:00 Client closed local connection on 127.0.0.1:5432
编辑 3:
我也试过把主机改成/cloudsql/instance_connection_name,也没结果。
const db = new Pool({
host: '/cloudsql/[project-id]:[region]:[instance-name]',
port: 5432,
user: 'postgres',
password: 'postgres',
database: 'postgres'
})
Spanner 绝对是一个选项,因为与连接到 Cloud SQL 跨区域相比,使用 Spanner 进行全局一致的设置可能会获得更好的延迟。
另一种选择是查看 VPC 对等互连:https://cloud.google.com/vpc/docs/vpc-peering 我认为你可以跨区域,虽然我还没有玩过它来确定,但那可能只是 "work" 使用私有 IP。
或者,如果您可以接受应用程序中的一些延迟,通过 public IP 连接到云 SQL 是一个不错的选择,但不要使用允许的网络(白名单)。尽可能使用代理,或设置 SSL 连接(这有点痛苦,但绝对值得)..
我在此处有一篇关于使用 public IP + 云 SQL 代理的详细博客:https://medium.com/@GabeWeiss/connecting-cloud-sql-public-ip-sql-proxy-5513f59e5a9e,这是从您的 VM 开始的相对简单的方法。
解决方案
所以解决方案非常简单:它与某些配置无关,而是与我的 nodejs 代码有关。我忘记了 postgresql 查询是一个承诺,所以我必须等待结果 return。添加 async/await 解决了问题。