偵錯連線
您已設定來源與目的地資料庫之間的連線,但如何確認兩者已連線?如果兩者之間的通訊失敗,您要如何找出問題所在和發生位置?
最基本的工具是 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中的 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 虛擬私有雲 IP 位址範圍的連線。
Cloud Logging
資料庫遷移服務和 AlloyDB 都會使用 Cloud Logging。如需完整資訊,請參閱 Cloud Logging 說明文件,並查看 Cloud SQL 查詢範例。查看記錄
您可以查看 AlloyDB 執行個體和其他專案 (例如 Cloud VPN 或 Compute Engine 執行個體) 的記錄。 Google Cloud如要查看 AlloyDB 執行個體記錄項目記錄,請按照下列步驟操作:控制台
- 前往 Logs Explorer
- 在頁面頂端選取現有的 AlloyDB 專案。
- 在查詢建立工具中新增下列項目:
- 資源:選取「AlloyDB 資料庫」。在對話方塊中選取 AlloyDB 執行個體。
- 記錄檔名稱:捲動至 AlloyDB 專區,然後為執行個體選取適當的記錄檔。舉例來說:
- alloydb.googlapis.com/postgres.log
- 嚴重性:選取記錄層級。
- 時間範圍:選取預設範圍或建立自訂範圍。
gcloud
使用 gcloud logging 指令查看記錄項目。在下方範例中,請將 PROJECT_ID 換成您的 API 金鑰。limit 標記是選用參數,表示要傳回的項目數量上限。
gcloud logging read "projects/[PROJECT_ID]/logs/alloydb.googleapis.com/postgres.log" --limit=10
排解 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 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 Proxy 容器的 VM 是否正在執行:
前往控制台的 Compute Engine「VM instances」(VM 執行個體) 頁面。
搜尋在 Proxy 設定程序中建立的 VM。如果未列出或未執行,請從頭設定 TCP Proxy,並使用正確的 IP 位址更新遷移作業中的來源執行個體設定。
如果 VM 正在執行,請確認下載 TCP Proxy 容器映像檔時沒有發生錯誤:
- 選取在 TCP proxy 設定程序中建立的 VM。在「Logs」(記錄) 下,按一下「Serial port 1 (console)」(序列埠 1 (主控台))。
如果記錄中沒有
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。
確認容器可以連線至來源執行個體:
選取在 Proxy 設定程序中建立的 VM。按一下「記錄」下方的「Cloud Logging」。
如果看到以下訊息:
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 代理程式的 VM 位於不同的虛擬私有雲 (VPC) 網路。
您可以使用 Google Cloud的連線測試功能,偵錯連線問題,確保目的地資料庫與代管 TCP Proxy 的 VM 之間有連線能力:
前往控制台的「Connectivity Tests」頁面。
按一下「建立連線能力測試」。
輸入測試名稱。
選取 TCP 做為通訊協定。
從「Source endpoint」(來源端點) 清單中選取「IP address」(IP 位址)。如果可使用公開 IP 位址存取來源資料庫,請輸入新建立的 TCP Proxy 公開 IP 位址;否則,請輸入 TCP Proxy 的私人 IP 位址。
從「Destination endpoint」(目的地端點) 清單選取「IP address」(IP 位址),然後輸入來源資料庫的 IP 位址。
在「Destination port」(目的地通訊埠) 欄位中,輸入連線至來源資料庫時使用的通訊埠編號。
點選「建立」。
執行連線測試,並解決任何連線問題。修正連線問題後,請確認 TCP Proxy 可以連線至來源執行個體:
前往 Compute Engine 中的「VM instances」(VM 執行個體)。
選取在 Proxy 設定程序中建立的 VM。按一下「記錄」下方的「Cloud Logging」。
如果看到
Connection to source DB verified記錄項目,表示 TCP Proxy 現在可以連線至來源執行個體。
確認遷移測試未因連線問題而失敗。
無法連線至目的地資料庫執行個體
如果 TCP Proxy 容器可以連線至來源執行個體,但移轉測試仍因連線問題而失敗,問題可能是目的地執行個體與代管 TCP Proxy 容器的 VM 之間的連線。
偵錯問題
如要偵錯問題,可以使用 Google Cloud的 Connectivity Tests,確認目的地資料庫與代管 TCP Proxy 的 VM 之間有連線:
前往控制台的「Connectivity Tests」頁面。
按一下「建立連線能力測試」。
為測試設定下列參數:
- 輸入測試名稱。
- 選取 TCP 做為通訊協定。
- 從「Source endpoint」(來源端點) 清單選取「IP address」(IP 位址),然後輸入新建立的 AlloyDB 叢集 IP 位址。
- 從「Destination endpoint」(目的地端點) 清單中選取「IP address」(IP 位址),然後輸入 TCP Proxy 的私人 IP 位址。
- 在「目的地通訊埠」欄位中輸入 5432。
點選「建立」。
執行連線測試,並解決任何連線問題。
可能原因
防火牆規則會拒絕目的地執行個體與 TCP proxy VM 之間的通訊。
建議做法
新增防火牆規則,允許目的地執行個體使用通訊埠 5432 與 TCP Proxy 通訊。
可能原因
目的地執行個體與執行 TCP Proxy 容器的 VM 之間,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 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]- 應該會看到 telnet 連線字串,結尾為Connected to x.x.x.x。[db_client] -h[source_db_host_or_ip] -P[source_db_port]- expect to see access denied
如果失敗,請確認您已從這個堡壘主機啟用來源資料庫的存取權。
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。[db_client] -h127.0.0.1 -P[tunnel_port]- expect to see access denied
如果失敗,請確認通道是否正常運作。執行 sudo netstat -tupln 會顯示這個 VM 上的所有接聽程序,您應該會看到 sshd listening on the tunnel_port。
AlloyDB DB ---> source DB
最好透過資料庫遷移服務進行測試。testing the migration job如果失敗,表示 AlloyDB 網路與Compute Engine VM bastion網路之間的 VPC 對等互連或路由發生問題。
來源資料庫伺服器的防火牆必須設定為允許整個內部 IP 範圍,該範圍是為虛擬私有雲網路的私人服務連線所分配,AlloyDB 目的地執行個體會將該範圍做為 ipConfiguration 設定的 privateNetwork 欄位。
如要在控制台中尋找內部 IP 範圍:
在 Google Cloud 控制台中前往「VPC networks」(VPC 網路) 頁面。
選取要使用的虛擬私有雲網路。
依序選取「私人服務連線」>「分配的服務 IP 範圍」。
找出與 servicenetworking-googleapis-com 建立的連線相關聯的內部 IP 範圍。
您也可以在 Cloud VPN gateway 專案的 Cloud Logging 控制台中,查看 AlloyDB 執行個體與 Compute Engine VM 執行個體之間的流量。在 Compute Engine VM 記錄中,尋找來自 AlloyDB 執行個體的流量。在 AlloyDB 執行個體的記錄中,尋找來自 Compute Engine VM 的流量。