调试连接

调试连接

您已在源数据库和目标数据库之间建立连接,但如何知道它们是否已连接?当它们之间的通信失败时,您如何找出问题所在以及问题发生的位置?

最基本的工具包括 ping 和 traceroute。

Ping

Ping 会执行基本测试,以确定是否可以从来源访问目标(“远程主机”)。Ping 会向远程主机发送 ICMP Echo Request 数据包,并期望收到 ICMP Echo Reply 作为响应。如果 ping 失败,则表示没有从来源到目的地的路由。但是,成功并不意味着您的数据包可以到达,而只是意味着通常可以访问远程主机。

虽然 ping 可以确定主机处于活跃状态并做出响应,但不能保证可靠。为安全起见,部分网络提供商会屏蔽 ICMP,这可能会使连接调试更加困难。

Traceroute

Traceroute 测试完整路由网络数据包是否从一个主机传送到另一个主机。它会显示数据包在此过程中执行的所有步骤(“跃点”)以及每个步骤所花费的时间。如果数据包没有一直到达目的地,则 traceroute 不会完成,但会以一系列星号结尾。在这种情况下,请查找在此过程中成功访问的最后一个 IP 地址。这是连接中断的位置。

Traceroute 可能超时。如果未正确配置沿途的网关,无法将数据包传递给下一个跃点,则其会失败。

如果 traceroute 无法完成,您或许可以找出其停止位置。找到 traceroute 输出中列出的最后一个 IP 地址,然后通过浏览器搜索 who owns [IP_ADDRESS]。结果不一定会显示地址所有者,但值得一试。

mtr

mtr 工具是一种 traceroute 形式,可保持活跃并持续更新,这类似于 top 命令在本地进程的工作方式。

查找本地 IP 地址

如果您不知道主机的本地地址,请运行 ip -br address show 命令。在 Linux 上,系统会显示网络接口、接口状态、本地 IP 地址和 MAC 地址。例如:eth0 UP 10.128.0.7/32 fe80::4001:aff:fe80:7/64。

或者,您也可以运行 ipconfig 或 ifconfig 来查看网络接口的状态。

查找传出 IP 地址

如果您不知道源数据库和目标数据库用于相互通信的 IP 地址(传出 IP 地址),请完成以下步骤:

  1. 前往 Google Cloud 控制台中的集群页面:

    前往 AlloyDB for PostgreSQL 集群

  2. 找到与您要调试的迁移作业关联的 AlloyDB for PostgreSQL 集群。
  3. 这两个出站公共 IP 地址都会显示在集群主实例的详细信息中。

打开本地端口

如需验证主机是否正在监听您所认为的端口,请运行 ss -tunlp4 命令。这会告诉您哪些端口已打开并正在监听。

例如,如果您正在运行 PostgreSQL 数据库,则应该启动并监听端口 5432。对于 SSH,您应该会看到端口 22。

所有本地端口活动

使用 netstat 命令可查看所有本地端口活动。例如,netstat -lt 会显示当前所有活跃端口。

使用 telnet 连接到远程主机

如需验证您是否可以使用 TCP 连接到远程主机,请运行 telnet 命令。Telnet 会尝试连接到您指定的 IP 地址和端口。

例如,如果您的远程主机正在运行 PostgreSQL 数据库,那么您应该能够通过端口 5432 远程登录到该主机:telnet 35.193.198.159 5432。

成功后,您会看到以下内容:

Trying 35.193.198.159...
Connected to 35.193.198.159.

失败时,您会看到 telnet 停止响应,直至您强行关闭尝试:

Trying 35.193.198.159...
^C

客户端身份验证

客户端身份验证由名为 pg_hba.conf 的配置文件控制(HBA 表示基于主机的身份验证)。

确保源数据库上 pg_hba.conf 文件的复制连接部分已更新,以接受来自 AlloyDB for PostgreSQL VPC 的 IP 地址范围的连接。

Cloud Logging

Database Migration Service 和 AlloyDB for PostgreSQL 使用 Cloud Logging。请参阅 Cloud Logging 文档了解完整信息。

查看日志

您可以查看 AlloyDB for PostgreSQL 实例和其他 Google Cloud项目(例如 Cloud VPN 或 Compute Engine 实例)的日志。如需查看 AlloyDB for PostgreSQL 实例日志条目的日志,请按如下所述操作:

控制台

  1. 前往 Logs Explorer
  2. 在页面顶部选择您的 AlloyDB for PostgreSQL 项目。
  3. 在查询构建器中,添加以下内容:
    • 资源:选择 AlloyDB for PostgreSQL 实例。在对话框中,选择您的 AlloyDB for PostgreSQL 实例。
    • 日志名称:滚动到 AlloyDB for PostgreSQL 部分,并为您的实例选择相应的日志文件。例如:
      • alloydb.googleapis.com/postgres.log
    • 严重程度:选择一个日志级别。
    • 时间范围:选择预设范围或创建自定义范围。

gcloud

使用 gcloud logging 命令查看日志条目。在下面的示例中,替换 PROJECT_ID。 limit 标志是一个可选参数,用于指示要返回的最大条目数。

gcloud logging read "projects/PROJECT_ID/logs/alloydb.googleapis.com%2Fpostgres.log" --limit=10

专用 IP 地址

使用专用 IP 地址连接到 AlloyDB for PostgreSQL 集群时会获得授权来使用 RFC 1918 地址范围。如果您的网络使用非 RFC 1918 地址范围,则需要更新网络对等互连,以导出所有非 RFC 1918 路由。例如:gcloud compute networks peerings update servicenetworking-googleapis-com --network=NETWORK --export-subnet-routes-with-public-ip --project=PROJECT

系统会预留 IP 范围 172.17.0.0/16 用于 Docker 桥接网络。也无法从该范围内的任何 IP 地址连接到使用专用 IP 地址的 AlloyDB for PostgreSQL 集群。

VPN 问题排查

请参阅 Google Cloud Cloud VPN 问题排查页面。

排查 TCP 代理错误

TCP 代理的设置方式也可能会导致错误。如需排查 TCP 代理错误,请参阅以下问题示例及其解决方法:

启动虚拟机 (VM) 失败

在 Compute Engine 中启动虚拟机实例时,您会看到以下消息:

You do not currently have an active account selected.

可尝试的操作

运行以下任一命令,配置活跃账号:

  • 如需获取新凭证,请运行以下命令:

    gcloud auth login
    
  • 如需选择已通过身份验证的账号,请运行以下命令:

    gcloud config set account <var>ACCOUNT</var>
    

    将 ACCOUNT 替换为您要配置的账号的名称。

未能连接到源数据库实例

测试迁移作业时,您会看到以下出错提示:

Failure connecting to the source database. Make sure the connectivity information on the connection profile is correct and the source database is reachable.

可尝试的操作

请反复执行以下步骤,了解问题可能出在哪里:

  1. 检查托管 TCP 代理容器的虚拟机是否正在运行:
    1. 在 Google Cloud 控制台中,前往 Compute Engine 虚拟机实例页面。

      转到“虚拟机实例”

    2. 搜索在代理设置过程中创建的虚拟机。如果未列出或未运行,请从头开始配置 TCP 代理,并使用正确的 IP 地址更新迁移作业中的来源连接配置文件设置。
  2. 如果虚拟机正在运行,请验证下载 TCP 代理容器映像时是否没有错误:
    1. 选择在 TCP 代理设置过程中创建的虚拟机。在日志下,点击串行端口 1(控制台)。
    2. 如果您在日志中看不到 Launching user container 'gcr.io/dms-images/tcp-proxy' 条目,则问题可能是您的实例无法从 Container Registry 中拉取映像。如需验证是否属于这种情况,请连接到虚拟机,然后尝试使用以下命令从 Container Registry 手动拉取映像:
      docker pull gcr.io/dms-images/tcp-proxy

      如果您看到以下错误:Error response from daemon: Get "https://gcr.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers),则表示您的虚拟机无法连接到 Container Registry。如果您的虚拟机只有专用 IP 地址,则必须在该 IP 地址所属的子网上启用专用 Google 访问通道;否则,该虚拟机将无法访问 Google Enterprise API(例如 Container Registry)。

  3. 验证容器是否可以连接到源实例:
    1. 选择在代理设置过程中创建的虚拟机。在日志下,点击 Cloud Logging。
    2. 如果您看到以下消息:Connection refused, please verify that the machine you are using to run the script can connect to the source database at,则表示 TCP 代理容器无法连接到源数据库实例。导致这种情况的原因可能有多种:
      • 来源实例的 IP 地址不正确。
      • 存在拒绝从 TCP 代理到源实例的连接的防火墙政策。
      • 源实例与托管 TCP 代理的虚拟机位于不同的虚拟私有云 (VPC) 网络中。

    您可以使用 Google Cloud的连接测试来调试连接问题,以确保托管 TCP 代理的虚拟机与源数据库之间存在连接:

    1. 在 Google Cloud 控制台中,前往 Connectivity Tests 页面。

      Connectivity Tests

    2. 点击创建 Connectivity Tests 测试。
    3. 输入测试的名称。
    4. 选择 TCP 作为协议。
    5. 从来源端点列表中选择 IP 地址。如果可以使用公共 IP 地址访问源数据库,请输入新创建的 TCP 代理的公共 IP 地址;否则,请输入 TCP 代理的专用 IP 地址。
    6. 从目标端点列表中选择 IP 地址,然后输入源数据库的 IP 地址。
    7. 在目标端口字段中,输入用于连接到源数据库的端口号。
    8. 点击创建。

    运行连接测试,并解决出现的任何连接问题。解决连接问题后,请验证 TCP 代理是否可以连接到源实例:

    1. 前往 Compute Engine 中的虚拟机实例。

      转到“虚拟机实例”

    2. 选择在代理设置过程中创建的虚拟机。在日志下,点击 Cloud Logging。
    3. 如果您看到 Connection to source DB verified 日志条目,则表示 TCP 代理现在可以连接到源实例。
  4. 验证迁移测试是否因连接问题而失败。

未能连接到目标数据库集群

如果 TCP 代理容器可以连接到源实例,但迁移测试仍然因连接问题而失败,则问题可能是目标 AlloyDB for PostgreSQL 集群与托管 TCP 代理容器的虚拟机之间的连接。

调试问题

如需调试此问题,您可以使用 Google Cloud Connectivity Tests 确保目标 AlloyDB for PostgreSQL 集群与托管 TCP 代理的虚拟机之间存在连接:

  1. 在 Google Cloud 控制台中,前往 Connectivity Tests 页面。

    Connectivity Tests

  2. 点击创建 Connectivity Tests 测试。
  3. 为测试设置以下参数:
    1. 输入测试的名称。
    2. 选择 TCP 作为协议。
    3. 从来源端点列表中选择 IP 地址,然后输入新创建的 AlloyDB for PostgreSQL 集群的 IP 地址。
    4. 从目标端点列表中选择 IP 地址,然后输入 TCP 代理的专用 IP 地址。
    5. 在目标端口字段中输入 5432。
  4. 点击创建。
  5. 运行连接测试,并解决出现的任何连接问题。

可能的原因

存在一条防火墙规则,该规则会拒绝目标集群与 TCP 代理虚拟机之间的通信。

可尝试的操作

添加一条防火墙规则,允许目标集群使用端口 5432 与 TCP 代理进行通信。

可能的原因

目标集群与运行 TCP 代理容器的虚拟机之间存在 VPC 不匹配。

可尝试的操作

为目标集群选择相同的 VPC。

排查反向 SSH 隧道问题

SSH 隧道是一种通过 SSH 连接转发部分通信的方法。反向 SSH 隧道允许设置 SSH 隧道,同时保持目标网络是发起隧道连接的网络。如果您出于安全考虑不想在自己的网络中打开端口,此功能会非常有用。

您要实现的目标是设置以下内容:

AlloyDB for PostgreSQL cluster ---> Compute Engine VM bastion ---> tunnel ---> source network bastion ---> source DB

假设:

  • AlloyDB for PostgreSQL cluster 可以访问 Compute Engine VM bastion(这是通过将 AlloyDB for PostgreSQL 网络与 Compute Engine 虚拟机网络对等互连来实现的)。

  • source network bastion 可以访问 source DB。

然后,您需要设置从 source network bastion 到 Compute Engine VM bastion 的 SSH 隧道,该隧道会将 Compute Engine VM bastion 上某个端口的所有传入连接通过隧道路由到 source DB。

上述场景中的每个环节都可能设置不当,从而导致整个流程无法正常运行。逐一排查每个链接的问题:

source network bastion ---> source DB

  1. 使用 SSH 连接到 source network bastion,如果是本地机器,则从终端连接。
  2. 使用以下方法之一测试与源数据库的连接:
    • telnet [source_db_host_or_ip] [source_db_port] - 预计会看到 telnet 连接字符串,以 Connected to x.x.x.x 结尾。
    • psql -h [source_db_host_or_ip] -p [source_db_port] -U [username] -d [database_name] - 预计会看到密码提示或访问遭拒。

如果此操作失败,则您需要验证是否已启用从此堡垒到源数据库的访问权限。

Compute Engine VM bastion ---> source DB

  1. 通过 SSH 连接到 Compute Engine VM bastion(使用 gcloud compute ssh VM_INSTANCE_NAME)。
  2. 使用以下方法之一测试与源数据库的连接:
    • telnet 127.0.0.1 [tunnel_port] - 预计会看到 telnet 连接字符串,以 Connected to x.x.x.x 结尾。
    • psql -h 127.0.0.1 -p [tunnel_port] -U [username] -d [database_name] - 预计会看到密码提示或访问遭拒。

如果此操作失败,则需要验证隧道是否已启动并正常运行。 运行 sudo netstat -tupln 会显示此虚拟机上的所有监听进程,您应该会看到 sshd listening on the tunnel_port。

AlloyDB for PostgreSQL cluster ---> source DB

最好使用 Database Migration Service 中的 testing the migration job 进行测试。如果此操作失败,则表示 AlloyDB for PostgreSQL 网络与 Compute Engine VM bastion 网络之间的 VPC 对等互连或路由存在一些问题。

源数据库服务器的防火墙必须配置为允许为 AlloyDB for PostgreSQL 目标集群使用的 VPC 网络的专用服务连接分配的整个内部 IP 地址范围。

如要在控制台中查找内部 IP 范围,请执行以下操作:

  1. 前往 Google Cloud 控制台中的 VPC 网络页面。
  2. 选择要使用的 VPC 网络。
  3. 依次选择专用服务访问通道 > 为服务分配的 IP 范围。
  4. 找到与 servicenetworking-googleapis-com 创建的连接关联的内部 IP 范围。

您还可以在 Cloud VPN gateway 项目的 Cloud Logging 控制台中查看 AlloyDB for PostgreSQL 集群与 Compute Engine 虚拟机实例之间的流量。在 Compute Engine 虚拟机日志中,查找来自 AlloyDB for PostgreSQL 集群的流量。在 AlloyDB for PostgreSQL 集群的日志中,查找来自 Compute Engine 虚拟机的流量。