Google compute engine 多区域的云sql

Google compute engine 多区域的云sql,google-compute-engine,google-cloud-sql,Google Compute Engine,Google Cloud Sql,我正在创建一个谷歌云设置,在多个区域中有多个实例组(3)。它们都在同一个专有网络中 区域: 美国中央银行 欧洲-北方1 东亚1 所有三个实例组都有2个VM。它是一个HTTP(s)负载平衡器,当我访问负载平衡器的公共IP地址时,我会看到apache欢迎页面(apache安装在虚拟机上)。所以这是可行的 我还有一个云SQL(PostgreSQL)数据库。我想通过它的私有IP访问这个数据库。我已经将虚拟机使用的VPC网络与云SQL实例的私有IP相关联。此实例在us-central1区域运行 现在,

我正在创建一个谷歌云设置,在多个区域中有多个实例组(3)。它们都在同一个专有网络中

区域:

  • 美国中央银行
  • 欧洲-北方1
  • 东亚1
所有三个实例组都有2个VM。它是一个HTTP(s)负载平衡器,当我访问负载平衡器的公共IP地址时,我会看到apache欢迎页面(apache安装在虚拟机上)。所以这是可行的

我还有一个云SQL(PostgreSQL)数据库。我想通过它的私有IP访问这个数据库。我已经将虚拟机使用的VPC网络与云SQL实例的私有IP相关联。此实例在us-central1区域运行

现在,问题是:它不起作用我在文档中做了一些研究,发现:

您必须选择要使用的专有网络。您将用于连接到云SQL实例(计算引擎实例[VMs]或Google Kubernetes引擎实例)的Google云资源必须使用此VPC网络才能连接这些资源还必须与您的云SQL实例位于同一区域。

资料来源:

为了测试,我在us-central1区域(不与实例组关联)和正确的VPC中添加了一个新VM。当我在这个虚拟机上安装postgresql客户端时,我可以连接到数据库。但是,当我在欧洲地区创建另一个VM-north1(也不与实例组关联)并使用正确的VPC时,我无法连接到数据库。因此,文档是(出人意料地)正确的:与云SQL实例运行的区域不同的区域中的实例无法通过私有IP连接到云SQL

我现在的问题是:解决此问题的最佳方法是什么,以便不同实例组中的所有VM都可以连接到同一个数据库。我是否应该在不同区域创建多个云SQL实例,并在插入/更新/删除某些数据时复制每个数据库?对我来说,这似乎是很多不必要的流量和负载

另一个选择是(我认为)使用云扳手。我刚刚发现了这个选项,目前正在阅读文档。这是路吗

编辑:云扳手似乎很有前途,但我知道它也很贵。具有1GB存储的1个节点大约为每月650美元

另一种选择是通过公共IP访问云SQL数据库。问题是:我应该将每个虚拟机IP地址都列为白名单,因为我使用自动缩放,所以虚拟机在运行中(使用新的IP地址)。我如何解决这个问题,使新的虚拟机自动被列入数据库的白名单

编辑:根据Gabe Weiss的回答,我创建了一个新的(测试)VM,并安装了云SQL代理和postgresql客户端。它可以工作,当我建立连接或进行查询时,一切都很好

现在,问题是:它在我的nodejs应用程序中不起作用。我正在使用node postgres(),我的连接配置如下:

const db = new Pool({
    host: '127.0.0.1',
    port: 5432,
    user: 'postgres',
    password: 'postgres',
    database: 'postgres'
})
我还尝试将“127.0.0.1”替换为localhost,我删除了端口。。。什么都不管用。凭据是正确的

编辑2:当我在后台运行cloud\u sql\u代理,同时运行我的nodejs应用程序,并导航到时,我会在控制台中看到一个日志:

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\u connection\u name,但也没有结果

const db = new Pool({
    host: '/cloudsql/[project-id]:[region]:[instance-name]',
    port: 5432,
    user: 'postgres',
    password: 'postgres',
    database: 'postgres'
})

Panner绝对是一个选项,因为与跨区域连接到云SQL相比,使用Panner进行全局一致性设置可能会获得更好的延迟

另一个选择是查看VPC对等: 我认为你可以跨地区做,虽然我还没有玩过它,但那可能只是“工作”与私人IP

或者,如果您对应用程序中的一些延迟没有意见,那么通过公共IP连接到云SQL是一个不错的选择,但不要使用允许的网络(白名单)。尽可能使用代理,或者设置SSL连接(这有点痛苦,但绝对值得)


我在这里有一篇关于使用公共IP+云SQL代理的详细博客:,这是一种相对简单的从虚拟机出发的方式。

使用扳手肯定是一种选择,因为使用扳手进行全局一致性设置可能比跨区域连接云SQL获得更好的延迟

另一个选择是查看VPC对等: 我认为你可以跨地区做,虽然我还没有玩过它,但那可能只是“工作”与私人IP

或者,如果您对应用程序中的一些延迟没有意见,那么通过公共IP连接到云SQL是一个不错的选择,但不要使用允许的网络(白名单)。尽可能使用代理,或者设置SSL连接(这有点痛苦,但绝对值得)


我在这里有一个关于使用公共IP+云SQL代理的详细博客:,这是一种相对简单的从虚拟机出发的方法。

解决方案


因此,解决方案非常简单:它与一些配置无关,而是与我的nodejs代码有关。我忘记了postgresql查询是一种承诺,所以我必须等待结果返回。添加async/await解决了问题。

解决方案


因此,解决方案非常简单:它与一些配置无关,而是与我的nodejs代码有关。我忘记了postgresql查询是一种承诺,所以我必须等待结果返回。添加async/await解决了问题。

谢谢!我让它部分工作。它在使用postgresql客户端的终端中工作,但我也希望它在我的nodejs应用程序中工作。我已经编辑了我的问题。谢谢!我让它部分工作。它在使用postgresql客户端的终端中工作,但我也希望它在我的nodejs应用程序中工作。我已经编辑了我的问题。