调试连接
您已在源数据库和目标数据库之间建立连接,但如何知道它们已连接?如果它们之间的通信失败,您如何找出问题所在以及问题发生的位置?
最基本的工具包括 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 地址),请完成以下步骤:
前往控制台中的 AlloyDB 集群页面。 Google Cloud console
找到与您要调试的迁移作业相关联的集群。
传出 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 实例日志条目的日志,请按如下所述操作:控制台
- 转到 Logs Explorer
- 在页面顶部选择一个现有 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 代理的虚拟机位于不同的虚拟私有云 (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]- 预计会看到 telnet 连接字符串,以Connected to x.x.x.x结尾。[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]- 预计会看到 telnet 连接字符串,以Connected to x.x.x.x结尾。[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 对等互连或路由问题
。
如要在控制台中查找内部 IP 范围 ,请执行以下操作:
进入控制台中的 VPC 网络页面 Google Cloud 。
选择要使用的 VPC 网络。
依次选择专用服务访问通道 > 为服务分配的 IP 范围。
找到与 servicenetworking-googleapis-com 创建的连接关联的内部 IP 范围 。
您还可以在
Cloud Logging控制台中查看 AlloyDB 实例与 Compute Engine 虚拟机实例之间的流量,该控制台位于
Cloud VPN gateway项目中。在 Compute Engine 虚拟机日志中,查找来自 AlloyDB 实例的流量。在
AlloyDB 实例的日志中,查找来自 Compute Engine 虚拟机的流量。