调试连接
您已在源数据库和目标数据库之间建立连接,但如何知道它们已连接?如果它们之间无法通信,您如何找出问题所在?
最基本的工具包括 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 地址),请完成以下步骤:
前往 Google Cloud 控制台中的“SQL 实例”页面。
点击与您要调试的迁移作业关联的实例的名称。
向下滚动,直到看到连接到此实例窗格。此窗格中会显示传出 IP 地址。
打开本地端口
如需验证主机是否正在侦听您所认为的端口,请运行 ss -tunlp4
命令。这会告诉您哪些端口已打开并正在侦听。
例如,如果您正在运行 PostgreSQL 数据库,则应该启动并监听端口 5432。对于 SSH,您应该会看到端口 22。
所有本地端口活动
使用 netstat
命令可查看所有本地端口活动。例如,netstat -lt
会显示当前所有活跃端口。
使用 telnet 连接到远程主机
如需验证您是否可以使用 TCP
连接到远程主机,请运行 telnet
命令。Telnet 会尝试连接到您指定的 IP 地址和端口。
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
文件的复制连接部分,以接受来自 Cloud SQL VPC 的 IP 地址范围的连接。
Cloud Logging
Database Migration Service 和 Cloud SQL 使用 Cloud Logging。如需了解完整信息,请参阅 Cloud Logging 文档并查看 Cloud SQL 示例查询。查看日志
您可以查看 Cloud SQL 实例和其他 Google Cloud项目(例如 Cloud VPN 或 Compute Engine 实例)的日志。如需查看 Cloud SQL 实例日志条目的日志,请按如下所述操作:控制台
- 转到日志浏览器
- 在页面顶部选择一个现有 Cloud SQL 项目。
- 在查询构建器中,添加以下内容:
- 资源:选择 Cloud SQL 数据库。在该对话框中,选择一个 Cloud SQL 实例。
- 日志名称:滚动到 Cloud SQL 部分,并为您的实例选择相应的日志文件。例如:
- cloudsql.googleapis.com/postgres.log
- 严重程度:选择一个日志级别。
- 时间范围:选择预设范围或创建自定义范围。
gcloud
使用 gcloud logging
命令查看日志条目。在下面的示例中,替换 PROJECT_ID
。
limit
标志是一个可选参数,用于指示要返回的最大条目数。
gcloud logging read "projects/[PROJECT_ID]/logs/cloudsql.googleapis.com/postgres.log" --limit=10
专用 IP 地址
使用专用 IP 地址连接到 Cloud SQL 实例时会自动获得授权来使用 RFC 1918 地址范围。非 RFC 1918 地址范围必须在 Cloud SQL 中配置为已获授权的网络。您还需要将网络对等互连更新到 Cloud SQL,以导出所有非 RFC 1918 路由。例如:gcloud compute networks peerings update cloudsql-postgres-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
- 使用 SSH 连接到 source network bastion,或者通过终端连接到本地机器。
- 使用以下方法之一测试与源数据库的连接:
telnet [source_db_host_or_ip] [source_db_port]
- 预计会看到以Connected to x.x.x.x
结尾的 telnet 连接字符串。[db_client] -h[source_db_host_or_ip] -P[source_db_port]
- 预计会看到“访问权限被拒”
如果失败,您需要验证是否已启用从此堡垒到源数据库的访问权限。
Compute Engine VM bastion ---> source DB
- 通过 SSH 连接到 Compute Engine VM bastion(使用
gcloud compute ssh VM_INSTANCE_NAME
) - 使用以下方法之一测试与源数据库的连接:
telnet 127.0.0.1 [tunnel_port]
- 预计会看到以Connected to x.x.x.x
结尾的 telnet 连接字符串。[db_client] -h127.0.0.1 -P[tunnel_port]
- 预计会看到访问权限被拒
如果失败,您需要验证隧道是否正常启动并运行。运行 sudo netstat -tupln
会显示此虚拟机上的所有监听进程,您应该会看到 sshd listening on the tunnel_port
。
Cloud SQL DB ---> source DB
最好使用 Database Migration Service 中的 testing the migration job
进行测试。如果失败,则表示 Cloud SQL 网络与 Compute Engine VM bastion 网络之间的 VPC 对等互连或路由存在问题。
源数据库服务器的防火墙必须配置为允许为 VPC 网络(Cloud SQL 目标实例将其用作 ipConfiguration 设置的 privateNetwork 字段)的专用服务连接分配的整个内部 IP 地址范围。
如要在控制台中查找内部 IP 范围,请执行以下操作:
在 Google Cloud 控制台中,前往“VPC 网络”页面。
选择要使用的 VPC 网络。
选择专用服务连接标签页。
您还可以在 Cloud VPN gateway
项目的 Cloud Logging 控制台中查看 Cloud SQL 实例与 Compute Engine 虚拟机实例之间的流量。在 Compute Engine 虚拟机日志中,查找来自 Cloud SQL 实例的流量。在 Cloud SQL 实例的日志中,查找来自 Compute Engine 虚拟机的流量。