偵錯連線
您已設定來源和目的地資料庫之間的連線,但如何知道它們已連線?當兩者之間的通訊失敗時,您該如何找出問題所在?
最基本的工具是 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 執行個體和其他 Google Cloud專案的記錄,例如 Cloud VPN 或 Compute Engine 執行個體。如要查看 AlloyDB 執行個體記錄項目的記錄,請按照下列步驟操作:控制台
- 前往「Logs Explorer」
- 在頁面頂端選取現有的 AlloyDB 專案。
- 在查詢建立工具中加入以下內容:
- 資源:選取「AlloyDB 資料庫」。在對話方塊中選取 AlloyDB 執行個體。
- 記錄檔名稱:捲動至 AlloyDB 專區,然後為執行個體選取適當的記錄檔。舉例來說:
- alloydb.googlapis.com/postgres.log
- 嚴重性:選取記錄層級。
- 時間範圍:選取預設值或建立自訂範圍。
gcloud
使用 gcloud logging
指令查看記錄項目。在下方範例中,請替換 PROJECT_ID
。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。如果未列出該 Proxy 或 Proxy 未執行,請從頭設定 TCP Proxy,並使用正確的 IP 地址更新遷移作業中的來源執行個體設定。
如果 VM 正在執行,請確認下載 TCP 代理程式容器映像檔時沒有發生錯誤:
- 選取在 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 位址所屬的子網路上啟用私人 Google 存取權;否則,VM 將無法存取 Google Enterprise API,例如 Container Registry。
確認容器是否可以連線至來源執行個體:
選取在 Proxy 設定程序中建立的 VM。在「Logs」下方,按一下「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 Proxy 的 VM 位於不同的虛擬私有雲 (VPC) 網路。
您可以使用 Google Cloud的連線測試來偵錯連線問題,確保目的地資料庫與託管 TCP Proxy 的 VM 之間有連線:
前往控制台的「Connectivity Tests」頁面。
按一下「建立連線能力測試」。
輸入測試名稱。
選取 TCP 做為通訊協定。
從「Source Endpoints」(來源端點) 清單中選取「IP address」(IP 位址)。如果來源資料庫可透過公開 IP 位址存取,請輸入新建立 TCP Proxy 的公開 IP 位址;否則,請輸入 TCP Proxy 的私人 IP 位址。
從「Destination endpoint」(目的地端點) 清單中選取「IP address」(IP 位址),然後輸入來源資料庫的 IP 位址。
在「Destination port」欄位中,輸入用來連線至來源資料庫的通訊埠編號。
按一下 [建立]。
執行連線測試,並解決任何連線問題。修正連線問題後,請確認 TCP Proxy 能否連線至來源執行個體:
前往 Compute Engine 中的「VM 執行個體」。
選取在 Proxy 設定程序中建立的 VM。在「Logs」下方,按一下「Cloud Logging」。
如果看到
Connection to source DB verified
記錄項目,表示 TCP Proxy 現已可連線至來源執行個體。
確認遷移測試不會因連線問題而失敗。
無法連線至目的地資料庫執行個體
如果 TCP Proxy 容器可以連線至來源執行個體,但移轉測試仍因連線問題而失敗,問題可能出在目的地執行個體與代管 TCP Proxy 容器的 VM 之間的連線。
偵錯問題
如要對問題進行偵錯,您可以使用 Google Cloud的連線測試,確認目的地資料庫與託管 TCP Proxy 的 VM 之間有連線:
前往控制台的「Connectivity Tests」頁面。
按一下「建立連線能力測試」。
為測試設定下列參數:
- 輸入測試名稱。
- 選取 TCP 做為通訊協定。
- 從「Source endpoint」(來源端點) 清單中選取「IP address」(IP 位址),然後輸入新建立的 AlloyDB 叢集 IP 位址。
- 從「Destination endpoint」清單中選取「IP address」,然後輸入 TCP Proxy 的私人 IP 位址。
- 在「Destination port」欄位中輸入 5432。
按一下 [建立]。
執行連線測試,並解決任何連線問題。
可能的原因
防火牆規則會拒絕目的地執行個體和 TCP proxy VM 之間的通訊。
試試看
新增防火牆規則,允許目的地執行個體使用通訊埠 5432 與 TCP Proxy 通訊。
可能的原因
目的地執行個體與執行 TCP Proxy 容器的 VM 之間的 VPC 不符。
試試看
為目的地執行個體選取相同的 VPC。
排解反向 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]
:您應該會看到以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
。
AlloyDB DB ---> source DB
建議由資料庫移轉服務的 testing the migration job
進行測試。如果失敗,表示 AlloyDB 網路與 Compute Engine VM bastion 網路之間的 VPC 對等互連或路由發生問題。
來源資料庫伺服器的防火牆必須設定為允許為虛擬私有雲端網路的私人服務連線分配的整個內部 IP 範圍,AlloyDB 目的地執行個體會將其用於其 ipConfiguration 設定的 privateNetwork 欄位。
如要在主控台中尋找內部 IP 範圍:
選取要使用的 VPC 網路。
選取「Private service connection」(私人服務連線) 分頁標籤。
您也可以在 Cloud VPN gateway
專案的 Cloud Logging 主控台中,查看 AlloyDB 執行個體與 Compute Engine VM 執行個體之間的流量。在 Compute Engine VM 記錄中,尋找來自 AlloyDB 執行個體的流量。在 AlloyDB 執行個體的記錄中,查看 Compute Engine VM 的流量。