偵錯連線
您已設定來源和目的地資料庫之間的連線,但如何知道它們已連線?當兩者之間的通訊失敗時,您該如何找出問題所在?
最基本的工具是 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 位址),請完成下列步驟:
前往 Google Cloud console中的「SQL Instances」(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 虛擬私有雲 IP 位址範圍的連線。
Cloud Logging
資料庫移轉服務和 Cloud SQL 會使用 Cloud Logging。如需完整資訊,請參閱 Cloud Logging 說明文件,並查看 Cloud SQL 查詢範例。查看記錄
您可以查看 Cloud SQL 執行個體和其他 Google Cloud專案的記錄,例如 Cloud VPN 或 Compute Engine 執行個體。如要查看 Cloud SQL 執行個體記錄項目的記錄,請按照下列步驟操作:控制台
- 前往「Logs Explorer」
- 在頁面頂端選取現有的 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 橋接區域網路使用。如果建立的 Cloud SQL 執行個體使用這個範圍內的 IP,系統將無法連接至執行個體。此外,從該範圍內任何 IP 連線到使用私人 IP 的 Cloud SQL 執行個體也會失敗。
VPN 疑難排解
請參閱 Google Cloud Cloud VPN 疑難排解頁面。
排解反向 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 VM 網路配對)。
接著,您可以設定從 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]
- 預期會看到存取權遭拒
如果失敗,您必須確認已啟用從此 Bastion 存取來源資料庫的權限。
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
會顯示這個 VM 上的所有監聽程序,您應該會看到 sshd listening on the tunnel_port
。
Cloud SQL DB ---> source DB
建議由資料庫移轉服務的 testing the migration job
進行測試。如果失敗,表示 Cloud SQL 網路與 Compute Engine VM bastion 網路之間的 VPC 對等互連或路由發生問題。
來源資料庫伺服器的防火牆必須設為允許將整個內部 IP 範圍分配給私人服務連線,而 Cloud SQL 目的地執行個體將使用該範圍做為其 ipConfiguration 設定的 privateNetwork 欄位。
如要在主控台中尋找內部 IP 範圍:
選取要使用的 VPC 網路。
選取「Private service connection」(私人服務連線) 分頁標籤。
您也可以在 Cloud VPN gateway
專案的 Cloud Logging 主控台中,查看 Cloud SQL 執行個體與 Compute Engine VM 執行個體之間的流量。在 Compute Engine VM 記錄中,尋找來自 Cloud SQL 執行個體的流量。在 Cloud SQL 執行個體的記錄中,找出 Compute Engine VM 的流量。