偵錯連線
您已設定來源和目的地資料庫之間的連線,但如何確認兩者已連線?如果通訊失敗,該如何找出問題所在和發生位置?
最基本的工具是 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 控制台的「SQL Instances」(SQL 執行個體) 頁面。
- 按一下與您要偵錯的遷移工作相關聯的執行個體名稱。
- 向下捲動,直到看見「連線至這個執行個體」窗格。這個窗格會顯示傳出 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 檔案的複製連線區段已更新,可接受來自 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 連線轉送部分通訊的方法。反向 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 設定 SSH 通道至 Compute Engine VM bastion,將任何傳入連線透過通道轉送至 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。psql -h [source_db_host_or_ip] -p [source_db_port] -U [username] -d [database_name]:應該會看到密碼提示或存取遭拒。
如果失敗,請確認您已啟用從這個堡壘主機存取來源資料庫的權限。
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。psql -h 127.0.0.1 -p [tunnel_port] -U [username] -d [database_name]:應該會看到密碼提示或存取遭拒。
如果失敗,請確認通道已啟動並正常運作。執行 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 網路之間的虛擬私有雲對接或轉送有問題。
來源資料庫伺服器的防火牆必須設為允許整個內部 IP 範圍,該範圍是分配給虛擬私有雲網路的私人服務連線,Cloud SQL 目的地執行個體會將該連線做為其 ipConfiguration 設定的 privateNetwork 欄位。
如要在控制台查看內部 IP 範圍,請按照下列步驟操作:
- 前往 Google Cloud 控制台的「VPC networks」(虛擬私有雲網路) 頁面。
- 選取要使用的虛擬私有雲網路。
- 依序選取「私人服務存取權」>「分配的服務 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 的流量。