调试连接
您已在源数据库和目标数据库之间建立连接,但如何知道它们已连接?当它们之间的通信失败时,您如何找出问题所在?
最基本的工具包括 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 console中的 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 代理的虚拟机位于不同的虚拟私有云 (VPC) 网络中。
您可以使用 Google Cloud的 Connectivity Tests 调试连接问题,确保目标数据库与托管 TCP 代理的虚拟机之间存在连接:
在控制台中,前往 Connectivity Tests 页面。
点击创建 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 页面。
点击创建 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 网络。
依次选择专用服务访问通道 > 为服务分配的 IP 范围。
找到与 servicenetworking-googleapis-com 创建的连接相关联的内部 IP 范围。
您还可以在 Cloud VPN gateway 项目的 Cloud Logging 控制台中查看 AlloyDB 实例与 Compute Engine 虚拟机实例之间的流量。在 Compute Engine 虚拟机日志中,查找来自 AlloyDB 实例的流量。在 AlloyDB 实例的日志中,查找来自 Compute Engine 虚拟机的流量。