連線除錯

偵錯連線

您已設定來源和目的地資料庫之間的連線,但如何確認兩者已連線?如果兩者之間的通訊失敗,該如何找出問題所在和發生位置?

最基本的工具是 ping 和 traceroute。

乒乓

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. 前往 Google Cloud 控制台的「Clusters」(叢集) 頁面:

    前往 AlloyDB for PostgreSQL 叢集

  2. 找出與您要偵錯的遷移工作相關聯的 AlloyDB for PostgreSQL 叢集。
  3. 這兩個傳出公開 IP 位址都會顯示在叢集主要執行個體的詳細資料中。

開啟本機通訊埠

如要確認主機是否在您預期的通訊埠上監聽,請執行 ss -tunlp4 指令。這會顯示哪些通訊埠已開啟並正在監聽。

舉例來說,如果您有執行中的 PostgreSQL 資料庫,通訊埠 5432 應會啟動並監聽。SSH 應會顯示通訊埠 22。

所有本機通訊埠活動

使用 netstat 指令查看所有本機通訊埠活動。例如,netstat -lt 會顯示目前所有使用中的通訊埠。

使用 telnet 連線至遠端主機

如要確認您可以使用 TCP 連線至遠端主機,請執行 telnet 指令。Telnet 會嘗試連線至您提供的 IP 位址和通訊埠。

舉例來說,如果遠端主機執行 PostgreSQL 資料庫,您應該可以透過通訊埠 5432 透過 telnet 連線至該主機: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 for PostgreSQL 虛擬私有雲 IP 位址範圍的連線。

Cloud Logging

資料庫遷移服務和 AlloyDB for PostgreSQL 會使用 Cloud Logging。如需完整資訊,請參閱 Cloud Logging 說明文件。

查看記錄

您可以查看 AlloyDB for PostgreSQL 執行個體和其他 Google Cloud 專案 (例如 Cloud VPN 或 Compute Engine 執行個體) 的記錄。如要查看 AlloyDB for PostgreSQL 執行個體記錄項目的記錄,請按照下列步驟操作:

控制台

  1. 前往「Logs Explorer」
  2. 在頁面頂端選取 AlloyDB for PostgreSQL 專案。
  3. 在查詢建立工具中,新增下列內容:
    • 資源:選取「AlloyDB for PostgreSQL 執行個體」。在對話方塊中,選取 AlloyDB for PostgreSQL 執行個體。
    • 記錄檔名稱:捲動至「AlloyDB for PostgreSQL」部分,然後選取執行個體適用的記錄檔。舉例來說:
      • alloydb.googleapis.com/postgres.log
    • 嚴重性:選取記錄層級。
    • 日期範圍:選取預設範圍或建立自訂範圍。

gcloud

使用 gcloud logging 指令查看記錄項目。在以下範例中,請替換 PROJECT_ID。limit 旗標是選用參數,用於指定要傳回的項目數量上限。

gcloud logging read "projects/PROJECT_ID/logs/alloydb.googleapis.com%2Fpostgres.log" --limit=10

私人 IP 位址

使用私人 IP 位址連至 AlloyDB for PostgreSQL 叢集的連線,必須獲得 RFC 1918 位址範圍授權。如果網路使用非 RFC 1918 位址範圍,您必須更新網路對等互連,匯出所有非 RFC 1918 路由。例如:gcloud compute networks peerings update servicenetworking-googleapis-com --network=NETWORK --export-subnet-routes-with-public-ip --project=PROJECT

IP 範圍 172.17.0.0/16 已保留給 Docker 橋接網路。從該範圍內任何 IP 位址連至 AlloyDB for PostgreSQL 叢集的連線,如果使用私人 IP 位址,就會失敗。

VPN 疑難排解

請參閱 Google Cloud Cloud VPN 疑難排解頁面。

排解 TCP Proxy 錯誤

TCP Proxy 的設定方式也可能導致錯誤。如要排解 TCP Proxy 錯誤,請參閱下列問題示例和解決方法:

無法啟動虛擬機器 (VM)

在 Compute Engine 啟動 VM 執行個體時,您會看到下列訊息:

You do not currently have an active account selected.

試試這些建議

執行下列其中一個指令,設定有效帳戶:

  • 如要取得新的憑證,請執行下列指令:

    gcloud auth login
    
  • 如要選取已驗證的帳戶,請執行下列指令:

    gcloud config set account <var>ACCOUNT</var>
    

    將 ACCOUNT 替換為要設定的帳戶名稱。

無法連線至來源資料庫執行個體

測試遷移工作時,出現下列錯誤訊息:

Failure connecting to the source database. Make sure the connectivity information on the connection profile is correct and the source database is reachable.

試試這些建議

請按照下列步驟操作,找出問題所在:

  1. 檢查託管 TCP Proxy 容器的 VM 是否正在運作:
    1. 前往 Google Cloud 控制台的 Compute Engine「VM instances」(VM 執行個體) 頁面。

      前往 VM 執行個體

    2. 搜尋在 Proxy 設定程序中建立的 VM。如果未列出或未執行,請從頭設定 TCP Proxy,並使用正確的 IP 位址更新遷移工作的來源連線設定檔設定。
  2. 如果 VM 正在運作,請確認下載 TCP Proxy 容器映像檔時沒有發生錯誤:
    1. 選取在 TCP Proxy 設定程序中建立的 VM。在「記錄」下按一下 [序列埠 1 (主控台)]。
    2. 如果記錄中沒有 Launching user container 'gcr.io/dms-images/tcp-proxy' 項目,問題可能是執行個體無法從 Container Registry 提取映像檔。如要確認是否為這種情況,請連線至 VM,並使用下列指令,手動嘗試從 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),表示 VM 無法連線至 Container Registry。如果 VM 只有私人 IP 位址,您必須在該 IP 位址所屬的子網路上啟用 Private Google Access,否則 VM 將無法存取 Google Enterprise API,例如 Container Registry。

  3. 確認容器可以連線至來源執行個體:
    1. 選取在 Proxy 設定程序中建立的 VM。在「記錄」下方,按一下「Cloud Logging」。
    2. 如果看到以下訊息:Connection refused, please verify that the machine you are using to run the script can connect to the source database at,表示 TCP Proxy 容器無法連線至來源資料庫執行個體。可能原因如下:
      • 來源執行個體的 IP 位址不正確。
      • 防火牆政策拒絕從 TCP Proxy 連至來源執行個體。
      • 來源執行個體與託管 TCP Proxy 的 VM 位於不同的虛擬私有雲 (VPC) 網路。

    您可以使用 Google Cloud的連線能力測試,對連線問題進行偵錯,確保託管 TCP Proxy 的 VM 與來源資料庫之間可以連線:

    1. 前往 Google Cloud 控制台的「Connectivity Tests」 頁面。

      Connectivity Tests

    2. 按一下「Create Connectivity Tests」(建立 Connectivity Tests)。
    3. 輸入測試名稱。
    4. 選取「TCP」TCP做為通訊協定。
    5. 從「來源端點」清單選取「IP 位址」。如果來源資料庫可透過公開 IP 位址存取,請輸入新建立的 TCP Proxy 公開 IP 位址,否則請輸入 TCP Proxy 的私人 IP 位址。
    6. 從「Destination endpoint」(目的地端點) 清單中選取「IP address」(IP 位址),然後輸入來源資料庫的 IP 位址。
    7. 在「Destination port」(目的地通訊埠) 欄位中,輸入連線至來源資料庫時使用的通訊埠編號。
    8. 點選「建立」。

    執行連線能力測試,並解決任何連線問題。修正連線問題後,請確認 TCP Proxy 能連至來源執行個體:

    1. 前往 Compute Engine 的「VM instances」(VM 執行個體)。

      前往 VM 執行個體

    2. 選取在 Proxy 設定程序中建立的 VM。在「記錄」下方,按一下「Cloud Logging」。
    3. 如果看到 Connection to source DB verified 記錄項目,代表 TCP Proxy 現在可以連線至來源執行個體。
  4. 確認遷移測試未因連線問題而失敗。

無法連線至目的地資料庫叢集

如果 TCP Proxy 容器可以連線至來源執行個體,但遷移測試仍因連線問題而失敗,問題可能出在目的地 AlloyDB for PostgreSQL 叢集與託管 TCP Proxy 容器的 VM 之間的連線能力。

偵錯問題

如要偵錯,請使用 Google Cloud Connectivity Tests,確認目的地 AlloyDB for PostgreSQL 叢集與託管 TCP Proxy 的 VM 之間是否能連線:

  1. 前往 Google Cloud 控制台的「Connectivity Tests」頁面。

    Connectivity Tests

  2. 按一下「Create Connectivity Tests」(建立 Connectivity Tests)。
  3. 為測試設定下列參數:
    1. 輸入測試名稱。
    2. 選取「TCP」TCP做為通訊協定。
    3. 從「來源端點」清單選取「IP 位址」,然後輸入新建立 AlloyDB for PostgreSQL 叢集的 IP 位址。
    4. 從「目的地端點」清單選取「IP 位址」,然後輸入 TCP Proxy 的私人 IP 位址。
    5. 在「Destination port」(目的地通訊埠) 欄位中輸入 5432。
  4. 點選「建立」。
  5. 執行連線能力測試,並解決任何連線問題。

可能原因

防火牆規則拒絕目的地叢集與 TCP Proxy VM 之間的通訊。

試試這些建議

新增防火牆規則,允許目的地叢集使用通訊埠 5432 與 TCP Proxy 通訊。

可能原因

目的地叢集與執行 TCP Proxy 容器的 VM 之間,虛擬私有雲不相符。

試試這些建議

為目的地叢集選取相同的虛擬私有雲。

排解反向 SSH 通道問題

SSH 通道是一種透過 SSH 連線轉送部分通訊的方法。反向 SSH 通道可讓您設定 SSH 通道,同時確保目的地網路是啟動通道連線的網路。如果基於安全考量,不想在自己的網路中開啟通訊埠,這項功能就非常實用。

您要設定的目標如下:

AlloyDB for PostgreSQL cluster ---> Compute Engine VM bastion ---> tunnel ---> source network bastion ---> source DB

假設:

  • AlloyDB for PostgreSQL cluster 可存取 Compute Engine VM bastion (方法是將 AlloyDB for PostgreSQL 網路與 Compute Engine VM 網路對接)。

  • source network bastion可以存取source DB。

接著,您從 source network bastion 設定 SSH 通道至 Compute Engine VM bastion,將任何傳入連線轉送至 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]:應該會看到 telnet 連線字串,結尾為 Connected to x.x.x.x。
    • psql -h [source_db_host_or_ip] -p [source_db_port] -U [username] -d [database_name]:應該會看到密碼提示或存取遭拒。

如果失敗,請確認您已啟用從這個堡壘主機存取來源資料庫的權限。

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]:應該會看到 telnet 連線字串,結尾為 Connected to x.x.x.x。
    • psql -h 127.0.0.1 -p [tunnel_port] -U [username] -d [database_name]:應該會看到密碼提示或存取遭拒。

如果失敗,請確認通道已啟動並正常運作。執行 sudo netstat -tupln 會顯示這個 VM 上所有監聽程序,您應該會看到 sshd listening on the tunnel_port。

AlloyDB for PostgreSQL cluster ---> source DB

建議您透過資料庫遷移服務testing the migration job進行測試。如果失敗,表示 AlloyDB for PostgreSQL 網路和 Compute Engine VM bastion 網路之間的虛擬私有雲對接或轉送有問題。

來源資料庫伺服器的防火牆必須設為允許整個內部 IP 範圍,該範圍是分配給 AlloyDB for PostgreSQL 目的地叢集使用的虛擬私有雲網路私人服務連線。

如要在控制台查看內部 IP 範圍,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「VPC networks」(虛擬私有雲網路) 頁面。
  2. 選取要使用的虛擬私有雲網路。
  3. 依序選取「私人服務存取權」>「分配的服務 IP 範圍」。
  4. 找出與 servicenetworking-googleapis-com 建立的連線相關聯的內部 IP 範圍。

您也可以在 Cloud VPN gateway 專案的 Cloud Logging 控制台中,查看 AlloyDB for PostgreSQL 叢集與 Compute Engine VM 執行個體之間的流量。在 Compute Engine VM 記錄中,尋找來自 AlloyDB for PostgreSQL 叢集的流量。在 AlloyDB for PostgreSQL 叢集的記錄中,尋找來自 Compute Engine VM 的流量。