偵錯連線
您已設定來源與目的地資料庫之間的連線,但如何確認兩者已連線?如果兩者之間的通訊失敗,您要如何找出問題所在和發生位置?
最基本的工具是 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 指令。這會顯示開啟及接聽的連接埠。
舉例來說,如果正在執行 MySQL 資料庫,通訊埠 3306 應會啟動並接聽。如果是 SSH,您應該會看到通訊埠 22。
所有本機通訊埠活動
使用 netstat 指令查看所有本機連接埠活動。舉例來說,netstat -lt 會顯示目前所有作用中的連接埠。
使用 Telnet 連線至遠端主機
如要確認是否可以使用 TCP 連線至遠端主機,請執行 telnet 指令。Telnet 會嘗試連線至您提供的 IP 位址和通訊埠。
telnet 35.193.198.159 3306。成功後,您會看到以下訊息:
Trying 35.193.198.159...
Connected to 35.193.198.159.
。
如果失敗,您會看到 telnet 停止回應,直到您強制關閉嘗試為止:
Trying 35.193.198.159...
^C.
。
Cloud Logging
資料庫遷移服務和 Cloud SQL 都會使用 Cloud Logging。如需完整資訊,請參閱 Cloud Logging 說明文件,並查看 Cloud SQL 查詢範例。查看記錄
您可以查看 Cloud SQL 執行個體和其他專案 (例如 Cloud VPN 或 Compute Engine 執行個體) 的記錄。 Google Cloud如要查看 Cloud SQL 執行個體記錄檔項目的記錄:控制台
- 前往 Logs Explorer
- 在頁面頂端選取現有的 Cloud SQL 專案。
- 在查詢建立工具中新增下列項目:
- 資源:選取「Cloud SQL 資料庫」。在對話方塊中,選取 Cloud SQL 執行個體。
- 記錄名稱:捲動至 Cloud SQL 區段,然後選取執行個體的適當記錄檔。例如:
- cloudsql.googlapis.com/mysql-general.log
- cloudsql.googleapis.com/mysql.err
- 嚴重性:選取記錄層級。
- 時間範圍:選取預設範圍或建立自訂範圍。
gcloud
使用 gcloud logging 指令查看記錄項目。在下方範例中,請將 PROJECT_ID 換成您的 API 金鑰。limit 標記是選用參數,表示要傳回的項目數量上限。
gcloud logging read "projects/[PROJECT_ID]/logs/cloudsql.googleapis.com/mysql-general.log" --limit=10
私人 IP 位址
使用私人 IP 位址連線至 Cloud SQL 執行個體時,系統會自動授權 RFC 1918 位址範圍。您必須在 Cloud SQL 中將非 RFC 1918 位址範圍設為授權網路。您也需要更新 Cloud SQL 的網路對等互連,匯出所有非 RFC 1918 路徑。例如:gcloud compute networks peerings update cloudsql-mysql-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 連線上的部分通訊。反向 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]- expect to see the mysql password prompt (something like5.7.12-logPuN0%`D5G??f9nVS'Pmysql_native_passwordConnection)[db_client] -h[source_db_host_or_ip] -P[source_db_port]- expect to see access denied (something likeERROR 1045 (28000): Access denied for user...)
如果失敗,請確認您已從這個堡壘主機啟用來源資料庫的存取權。
Compute Engine VM bastion ---> source DB
- 透過 SSH 連線至 Compute Engine VM bastion (使用
gcloud compute ssh VM_INSTANCE_NAME) - 使用下列任一方法測試與來源資料庫的連線:
telnet 127.0.0.1 [tunnel_port]- 應該會看到 mysql 密碼提示 (類似5.7.12-logPuN0%`D5G??f9nVS'Pmysql_native_passwordConnection)[db_client] -h127.0.0.1 -P[tunnel_port]- expect to see access denied (something likeERROR 1045 (28000): Access denied for user...)
如果失敗,請確認通道是否正常運作。執行 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 範圍:
在 Google Cloud 控制台中前往「VPC networks」(VPC 網路) 頁面。
選取要使用的虛擬私有雲網路。
依序選取「私人服務連線」>「分配的服務 IP 範圍」。
找出與 servicenetworking-googleapis-com 建立的連線相關聯的內部 IP 範圍。
您也可以在 Cloud VPN gateway 專案的 Cloud Logging 控制台中,查看 Cloud SQL 執行個體和 Compute Engine VM 執行個體之間的流量。在 Compute Engine VM 記錄中,尋找來自 Cloud SQL 執行個體的流量。在 Cloud SQL 執行個體的記錄中,尋找來自 Compute Engine VM 的流量。