连接概览

本页面简要介绍了用于连接到 Cloud SQL 实例的多个选项。

概览

为了连接到您的 Cloud SQL 实例,您需要注意两个事项:

  • 如何连接 - 您使用哪条网络路径访问您的实例;您可以使用可访问互联网的外部(公共)IP 地址,也可以使用只能访问 VPC 的内部(专用)IP 地址。
  • 如何进行身份验证 - 哪些连接已获授权且可以连接到您的 Cloud SQL 实例。

请使用以下信息来确定哪些连接和身份验证选项最适合您。

连接选项

专用 IP

专用 IP 是可在 Virtual Private Cloud (VPC) 上访问的 IPv4 或 IPv6 地址。您可以使用此地址从能够访问 VPC 的其他资源进行连接;通过专用 IP 地址建立的连接通常可缩短延迟时间并限制攻击途径,因为它们不需要遍历互联网。

使用专用 IP 地址连接到 Cloud SQL 实例时会自动获得授权来使用 RFC 1918 地址范围。因此,所有专用客户端都可以在不经过代理的情况下访问数据库。非 RFC 1918 地址范围必须配置为已获授权的网络

或者,可以要求所有连接都使用 Cloud SQL 代理自行管理的 SSL 证书

从可访问 VPC 的资源上的客户端连接时,最好使用专用 IP。如需详细了解哪些资源可以使用专用 IP,请参阅专用 IP 的要求。如需了解如何向实例添加专用 IP 地址,请参阅配置专用 IP 连接

公共 IP 地址

公共 IP 地址是可在外部的公共互联网使用的 IPv4 或 IPv6 地址。此类地址可以接收来自 Google 网络内部和外部设备的连接,包括来自您家中或办公室等位置的连接。

为了帮助确保实例的安全性,必须使用 Cloud SQL 代理已授权的网络对使用公共 IP 与 Cloud SQL 实例建立的所有连接进行授权。

从不符合 VPC 要求的客户端进行连接时,最好使用公共 IP。

如需了解如何向实例添加公共 IP 地址,请参阅配置公共 IP 连接

身份验证选项

Cloud SQL 代理

Cloud SQL 代理允许您使用 Identity and Access Management (IAM) 权限来验证和保护连接。该代理通过以下方式验证连接:使用用户或服务帐号的凭据,并将连接封装在针对 Cloud SQL 实例授权的 SSL/TLS 层中。如需详细了解 Cloud SQL 代理的工作原理,请参阅 Cloud SQL 代理简介

若要对 Cloud SQL 实例的连接进行身份验证,建议使用 Cloud SQL 代理,因为这是最安全的方法。

客户端代理是一个作为可执行二进制文件分发的开源库。客户端代理充当中间服务器,负责侦听传入连接,将其封装在 SSL/TLS 中,然后将其传递到 Cloud SQL 实例。

要开始将 Cloud SQL 代理用作二进制文件,请参阅使用 Cloud SQL 代理进行授权

此外,某些语言允许您选择使用客户端库。您可以直接在语言环境中使用这些库;它们提供与该代理相同的身份验证功能,而无需外部进程。如需开始使用此功能,请参阅以下页面:

最后,一些环境(例如 Cloud Run、Cloud Functions 和 App Engine)提供了一种使用 Cloud SQL 代理进行连接的机制。如需了解如何使用这些环境进行连接,请参阅以下内容之一:

自行管理的 SSL/TLS 证书

您可以设置特定于 Cloud SQL 实例的客户端/服务器 SSL/TLS 证书,而无需使用 Cloud SQL 代理来加密连接。这些证书用于客户端和服务器之间的相互验证,同时加密它们之间的连接。

不使用 Cloud SQL 代理时,强烈建议使用自行管理的 SSL/TLS 证书来提供加密。否则,您的数据会以不安全的方式传输,并且可能被第三方拦截或查看。

如需开始使用自行管理的 SSL/TLS 证书,请参阅使用 SSL/TLS 证书进行授权

已获授权的网络

除非使用 Cloud SQL 代理,否则只有当连接来自已获授权的网络时,才允许前往实例的公共 IP 地址的连接。已获授权的网络是用户已指定有连接权限的 IP 地址或范围。

如需开始使用已获授权的网络,请参阅使用已获授权的网络进行授权

问题排查

点击表中的链接可查看详细信息:

针对此问题… 可能的原因… 请尝试以下操作…
SSL error: invalid padding 服务器证书错误。 创建新的服务器证书轮替
您想知道是谁处于连接状态。 不适用 请参阅可以尝试的操作
Unauthorized to connect 错误。 可能存在多个根本原因 请参阅可以尝试的操作
网络关联失败。 未在项目中启用 Service Networking API 在项目中启用 Service Networking API
Remaining connection slots are reserved 已达到连接数上限。 增加 max_connections 标志
Set Service Networking service account as servicenetworking.serviceAgent role on consumer project 服务帐号的网络权限缺失或不正确。 停用 Service Networking API 并重新启用
error x509: certificate is not valid for any names, but wanted to match project-name:db-name 已知问题:Cloud SQL Proxy Dialer 目前与 Go 1.15 不兼容。 在问题获得修复之前,请参阅 GitHub 上的这一讨论,其中包括了解决方法。

连接被取消

您看到错误消息 Got an error reading communication packetsAborted connection xxx to db: DB_NAME

可能的问题

  • 网络不稳定。
  • 没有对 TCP keep-alive 命令的响应(客户端或服务器无响应,可能超载)。
  • 超出了数据库引擎的连接生命周期,服务器终止了该连接。

可以尝试的操作

应用必须能够容忍网络故障并遵循最佳做法,例如连接池和重试。大多数连接池程序会尽可能捕获这些错误。否则,应用必须正常重试或失败。

对于连接重试,我们建议使用以下方法:

  1. 指数退避算法。以指数方式增加每次重试之间的时间间隔。
  2. 另外,增加随机退避时间。
结合使用这些方法有助于减少限制。


SSL 错误:填充无效

尝试使用 SSL 连接到 PostgreSQL 实例时,您看到错误消息 SSL error: invalid padding

可能的问题

服务器 CA 证书可能存在问题。

可以尝试的操作

创建新的服务器 CA 证书轮替服务器证书。


想知道是谁处于连接状态

您想知道是谁处于连接状态及连接了多长时间。

可能的问题

不适用

可以尝试的操作

登录到数据库并运行以下命令:SELECT datname, usename, application_name as appname, client_addr, state, now() - backend_start as conn_age, now() - state_change as last_activity_age FROM pg_stat_activity WHERE backend_type = 'client backend' ORDER BY 6 DESC LIMIT 20</code>


没有连接权限

您看到错误消息 Unauthorized to connect

可能的问题

由于在多个级层进行授权,因此可能存在多个原因。

  • 在数据库级层,数据库用户必须存在且其密码必须一致。
  • 在项目级,用户可能缺少正确的 IAM 权限。
  • 在 Cloud SQL 级层,根本原因可能取决于您连接到实例的方式。如果您要通过公共 IP 直接连接到实例,则连接的来源 IP 必须在实例已获授权的网络中。

    默认允许专用 IP 连接,除非您从非 RFC 1918 地址进行连接。非 RFC 1918 客户端地址必须配置为已获授权的网络

    默认情况下,Cloud SQL 不会从 VPC 中获知非 RFC 1918 子网路由。您需要将网络对等互连更新到 Cloud SQL,以导出所有非 RFC 1918 路由。例如:

    gcloud compute networks peerings update cloudsql-postgres-googleapis-com --network=NETWORK --export-subnet-routes-with-public-ip --project=PROJECT
    

    如果您要通过 Cloud SQL 代理进行连接,请确保正确设置了 IAM 权限

  • 在网络级层,如果 Cloud SQL 实例使用公共 IP 地址,则连接的来源 IP 地址必须在已获授权的网络中。

可以尝试的操作

  • 检查用户名和密码。
  • 检查用户的 IAM 角色和权限。
  • 如果使用公共 IP,请确保来源在已获授权的网络中。

网络关联失败

您看到错误消息 Error: Network association failed due to the following error:在使用方项目中将 Service Networking 服务帐号设置为 servicenetworking.serviceAgent 角色。

可能的问题

未在项目中启用 Service Networking API

可以尝试的操作

在您的项目中启用 Service Networking API。如果您在尝试为 Cloud SQL 实例分配专用 IP 地址时看到此错误并且您使用共享 VPC,则还需要为宿主项目启用 Service Networking API


剩余连接槽已预留

您看到错误消息 FATAL: remaining connection slots are reserved for non-replication superuser connections

可能的问题

已达到连接数上限。

可以尝试的操作

修改 max_connections 标志的值。如果将 max_connections 增加到超过特定值,则可能会导致失去服务等级协议 (SLA) 支持


在使用方项目中将 Service Networking 服务帐号设置为 servicenetworking.serviceAgent 角色

您看到错误消息 set Service Networking service account as servicenetworking.serviceAgent role on consumer project.

可能的问题

用户或服务帐号权限不正确。自动设置脚本(例如 Terraform 配置脚本)中可能会发生这种情况。

可以尝试的操作

如需修复服务权限,请停用 Service Networking API,等待五分钟,然后重新启用。

您还可以尝试使用这些 gcloud 命令为项目分配角色

gcloud beta services identity create --service=servicenetworking.googleapis.com --project=project-id
gcloud projects add-iam-policy-binding project-id --member="service-account-prefix@service-networking.iam.gserviceaccount.com" --role="roles/servicenetworking.serviceAgent"

错误 x509:证书对任何名称均无效

您看到错误消息 error x509: certificate is not valid for any names, but wanted to match project-name:db-name

可能的问题…

已知问题:Cloud SQL Proxy Dialer 目前与 Go 1.15 不兼容。

可以尝试的操作

在错误获得修复之前,请参阅 GitHub 上的这一讨论,其中包括了解决方法。


后续步骤