调试连接
您已在源数据库和目标数据库之间建立连接,但如何知道它们已连接?如果它们之间无法通信,您如何找出问题所在?
最基本的工具包括 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 控制台中的 AlloyDB 集群页面。
找到与您要调试的迁移作业关联的集群。
出站 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
文件的复制连接部分,以接受来自 AlloyDB VPC 的 IP 地址范围的连接。
Cloud Logging
Database Migration Service 和 AlloyDB 使用 Cloud Logging。如需了解完整信息,请参阅 Cloud Logging 文档并查看 Cloud SQL 示例查询。查看日志
您可以查看 AlloyDB 实例和其他 Google Cloud项目(如 Cloud VPN 或 Compute Engine 实例)的日志。如需查看 AlloyDB 实例日志条目的日志,请按如下所述操作:控制台
- 转到日志浏览器
- 在页面顶部选择一个现有的 AlloyDB 项目。
- 在查询构建器中,添加以下内容:
- 资源:选择 AlloyDB 数据库。在该对话框中,选择一个 AlloyDB 实例。
- 日志名称:滚动到 AlloyDB 部分,并为您的实例选择相应的日志文件。例如:
- alloydb.googlapis.com/postgres.log
- 严重程度:选择一个日志级别。
- 时间范围:选择预设范围或创建自定义范围。
gcloud
使用 gcloud logging
命令查看日志条目。在下面的示例中,替换 PROJECT_ID
。
limit
标志是一个可选参数,用于指示要返回的最大条目数。
gcloud logging read "projects/[PROJECT_ID]/logs/alloydb.googleapis.com/postgres.log" --limit=10
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 ACCOUNT
将 ACCOUNT 替换为您要配置的账号的名称。
未能连接到源数据库实例
测试迁移作业时,您看到以下错误消息:
Failure connecting to the source database. Make sure the connectivity information on the connection profile is correct and the source database is reachable.
可尝试的操作
请按以下步骤操作,了解问题可能出在哪里:
检查托管 TCP 代理容器的虚拟机是否正在运行:
如果虚拟机正在运行,请验证下载 TCP 代理容器映像时是否没有错误:
- 选择在 TCP 代理设置过程中创建的虚拟机。在日志下,点击串行端口 1(控制台)。
如果您在日志中没有看到
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 企业版 API,例如 Container Registry。
验证容器是否可以连接到来源实例:
选择在代理设置过程中创建的虚拟机。在日志下,点击 Cloud Logging。
如果您看到以下消息:
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 代理的虚拟机 (VM) 所属的 Virtual Private Cloud (VPC) 网络之外。
您可以使用 Google Cloud的Connectivity Tests 调试连接问题,确保目标数据库与托管 TCP 代理的虚拟机之间存在连接:
在控制台中,前往 Connectivity Tests 页面。
点击创建连接测试。
输入测试的名称。
选择 TCP 作为协议。
从来源端点列表中选择 IP 地址。如果可以使用公共 IP 地址访问源数据库,请输入新创建的 TCP 代理的公共 IP 地址;否则,请输入 TCP 代理的专用 IP 地址。
从目标端点列表中选择 IP 地址,然后输入来源数据库的 IP 地址。
在目标端口字段中,输入用于连接到源数据库的端口号。
点击创建。
运行连接性测试,并解决出现的任何连接问题。解决连接问题后,请验证 TCP 代理是否可以连接到源实例:
前往 Compute Engine 中的虚拟机实例。
选择在代理设置过程中创建的虚拟机。在日志下,点击 Cloud Logging。
如果您看到
Connection to source DB verified
日志条目,则表示 TCP 代理现在可以连接到来源实例。
验证迁移测试是否因连接问题而失败。
未能连接到目标数据库实例
如果 TCP 代理容器可以连接到来源实例,但由于连接问题,迁移测试仍会失败,则问题可能出在目标实例与托管 TCP 代理容器的虚拟机之间的连接上。
调试问题
如需调试此问题,您可以使用 Google Cloud的Connectivity Tests 确保目标数据库与托管 TCP 代理的虚拟机之间存在连接:
在控制台中,前往 Connectivity Tests 页面。
点击创建连接测试。
为您的测试设置以下参数:
- 输入测试的名称。
- 选择 TCP 作为协议。
- 从来源端点列表中选择 IP 地址,然后输入新创建的 AlloyDB 集群的 IP 地址。
- 从目标端点列表中选择 IP 地址,然后输入 TCP 代理的专用 IP 地址。
- 在目标端口字段中输入 5432。
点击创建。
运行连接性测试,并解决出现的任何连接问题。
可能的原因
存在一条防火墙规则,会拒绝目标实例与 TCP 代理虚拟机之间的通信。
可尝试的操作
添加一条防火墙规则,允许目标实例使用端口 5432 与 TCP 代理进行通信。
可能的原因
目标实例与运行 TCP 代理容器的虚拟机之间的 VPC 不匹配。
可尝试的操作
为目标实例选择与源实例相同的 VPC。
排查反向 SSH 隧道问题
SSH 隧道是一种在 SSH 连接上转发某些通信的方法。反向 SSH 隧道允许设置 SSH 隧道,但会保持目标网络是发起隧道连接的网络。如果您出于安全考虑不想在自己的网络中打开端口,此方法会非常有用。
您尝试实现的目标是设置以下内容: AlloyDB DB ---> Compute Engine VM bastion ---> tunnel ---> source network bastion ---> source DB
假设:
AlloyDB destination 可以访问 Compute Engine VM bastion。
source network bastion 可以访问 source DB(这是通过将 AlloyDB 网络与 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
。
AlloyDB DB ---> source DB
最好使用 Database Migration Service 中的 testing the migration job
进行测试。如果失败,则表示 AlloyDB 网络与 Compute Engine VM bastion 网络之间的 VPC 对等互连或路由存在问题。
源数据库服务器的防火墙必须配置为允许为 VPC 网络(AlloyDB 目标实例将其用作 ipConfiguration 设置的 privateNetwork 字段)的专用服务连接分配的整个内部 IP 地址范围。
如要在控制台中查找内部 IP 范围,请执行以下操作:
在 Google Cloud 控制台中,前往“VPC 网络”页面。
选择要使用的 VPC 网络。
选择专用服务连接标签页。
您还可以在 Cloud VPN gateway
项目的 Cloud Logging 控制台中查看 AlloyDB 实例与 Compute Engine 虚拟机实例之间的流量。在 Compute Engine 虚拟机日志中,查找来自 AlloyDB 实例的流量。在 AlloyDB 实例的日志中,查找来自 Compute Engine 虚拟机的流量。