调试连接

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

最基本的工具包括 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. 进入 控制台中的“SQL 实例”页面 Google Cloud console。

    进入 Cloud SQL 实例页面

  2. 点击与您要调试的迁移作业关联的实例的名称。

  3. 向下滚动,直到显示连接到此实例 面板。在此面板中,系统会显示传出 IP 地址。

打开本地端口

如需验证主机是否正在监听您所认为的端口,请运行 ss -tunlp4 命令。这会告诉您哪些端口已打开并正在监听。例如,如果您正在运行 MySQL 数据库,则应该启动并监听端口 3306。对于 SSH,您应该会看到端口 22。

所有本地端口活动

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

使用 Telnet 连接到远程主机

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

例如,如果您的远程主机正在运行 MySQL 数据库,则您应该能够通过端口 3306 对其执行 Telnet 操作:telnet 35.193.198.159 3306。

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

Trying 35.193.198.159...

Connected to 35.193.198.159. 。

失败后,您会看到 telnet 停止响应,直到您强制关闭 尝试:

Trying 35.193.198.159...

^C. 。

Cloud Logging

Database Migration Service 和 Cloud SQL 使用 Cloud Logging。请参阅 Cloud Logging 文档 了解完整信息,并查看 Cloud SQL 示例查询。

查看日志

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

控制台

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

gcloud

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

gcloud logging read "projects/[PROJECT_ID]/logs/cloudsql.googleapis.com/mysql-general.log" --limit=10

专用 IP 地址

使用专用 IP 地址连接到 Cloud SQL 实例时会自动获得授权来使用 RFC 1918 地址范围。非 RFC 1918 地址范围必须在 Cloud SQL 中配置为已获授权的网络。您还需要将网络对等互连更新到 Cloud SQL,以导出所有非 RFC 1918 路由。例如:gcloud compute networks peerings update cloudsql-mysql-googleapis-com --network=NETWORK --export-subnet-routes-with-public-ip --project=PROJECT。

系统会预留 IP 范围 172.17.0.0/16 用于 Docker 桥接网络。您无法访问任何使用该范围内的 IP 地址创建的 Cloud SQL 实例,无法从该范围内的任何 IP 地址连接到使用专用 IP 地址的 Cloud SQL 实例。

VPN 问题排查

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

排查反向 SSH 隧道问题

SSH 隧道是一种在 SSH 连接之上转发某些通信的方法。借助反向 SSH 隧道,您可以设置 SSH 隧道,但要确保目标网络是发起隧道连接的网络。 如果您出于安全考虑而不希望在自己的网络中打开端口,则此方法非常有用。

您要实现的目标是设置以下内容: Cloud SQL DB ---> Compute Engine VM bastion ---> tunnel ---> source network bastion ---> source DB

假设:

  • Compute Engine VM bastion 可以访问 Cloud SQL DB。

  • source network bastion 可以访问 source DB(通过将 Cloud SQL 网络与 Compute Engine 虚拟机网络对等互连来实现)。

然后,您从 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] - 预计会看到 MySQL 密码提示(类似于 5.7.12-logPuN0%`D5G??f9nVS'Pmysql_native_passwordConnection)
    • [db_client] -h[source_db_host_or_ip] -P[source_db_port] - 预计会看到访问被拒(类似于 ERROR 1045 (28000): Access denied for user...)

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

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] - 预计会看到 MySQL 密码提示(类似于 5.7.12-logPuN0%`D5G??f9nVS'Pmysql_native_passwordConnection)
    • [db_client] -h127.0.0.1 -P[tunnel_port] - 预计会看到访问 被拒(类似于 ERROR 1045 (28000): Access denied for user...)

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

Cloud SQL DB ---> source DB

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

源数据库服务器的防火墙必须配置为允许为 VPC 网络(Cloud SQL 目标实例将用作其 ipConfiguration 设置的 privateNetwork 字段)的private service connection 分配的整个internal IP range 。

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

  1. 进入 控制台中的 VPC 网络页面。 Google Cloud

  2. 选择要使用的 VPC 网络。

  3. 依次选择专用服务访问通道 > 为服务分配的 IP 范围。

  4. 找到与 servicenetworking-googleapis-com 创建的连接关联的内部 IP 范围 。

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