跳到正文

遷移專案 ​

把一個已部署的專案連同資料遷移到同一團隊的另一台伺服器上:換一台更大的伺服器、換一個地區,或者淘汰舊機器。專案的 ID、設定、網域和歷史都會保留。

在你確認專案在新伺服器上執行正常之前,舊伺服器上不會刪除任何東西。

開始之前 ​

  • 你需要在團隊中擁有 admin 或 owner 角色,並輸入專案名稱確認。
  • 專案必須已經部署。未部署的專案沒有需要複製的資料;請改為把它複製到另一台伺服器上。
  • 新伺服器必須處於就緒狀態,舊伺服器必須能存取,因為資料要從舊伺服器複製。
  • 遷移期間專案不可用:為了保證副本的一致性,它的服務會被停止。請安排在存取量少的時候遷移。耗時大約相當於備份並還原它的全部資料。

開始遷移 ​

  1. 開啟專案的 設定 → 通用 → 遷移到其他伺服器。
  2. 選擇新伺服器。Zenavo 會檢查並顯示:
    • 伺服器是否就緒、團隊是否在方案限制之內,以及伺服器是否有足夠的空閒記憶體(按每個服務的記憶體限制或近期用量計算);
    • 與該伺服器上其他專案的網域和發布的 TCP/UDP 連接埠衝突;
    • 將要複製的資料;
    • 會自動切換的生成網域,以及自定義網域需要你修改的 DNS 記錄。
  3. 輸入專案名稱,點選 遷移。

遷移以任務的形式執行。任務頁面會顯示每個步驟和日誌。

遷移過程 ​

步驟Zenavo 做什麼
檢查新伺服器確認它已就緒並有足夠空間。此時還沒有任何改動。
停止寫入停止舊伺服器上的應用服務。
備份匯出沒有儲存卷的 PostgreSQL 和 MySQL 資料庫,然後停止它們,再把每個儲存卷複製為 .tar 歸檔。記錄每個檔案的 SHA-256。
部署在新伺服器上部署相同的映像檔和設定,所有服務都處於停止狀態。不執行初始化指令:資料來自舊伺服器。TLS 憑證也會被複制,所以流量一到達,HTTPS 就能正常工作。
恢復把每個儲存卷還原到新的空儲存卷中,然後啟動需要匯入的資料庫並還原匯出內容。
啟動按依賴順序啟動服務,實例數與原來相同,並等待它們透過健康檢查。
切換把每個生成的網域指向新伺服器的位址,並把新伺服器設為專案的伺服器。

遷移前已暫停或停止的服務,在新伺服器上仍保持停止。

如果出現失敗 ​

如果切換之前的任何步驟失敗,Zenavo 會撤銷遷移:服務在舊伺服器上按原樣重新啟動,新伺服器上的副本被刪除,任務以失敗結束並給出原因。遷移永遠不會改動舊伺服器上的資料。

如果撤銷也失敗了(例如舊伺服器變得無法存取),遷移會保持未完成狀態並顯示原因。問題解決後,點選 回滾 重試。只有在舊伺服器重新執行之後,新伺服器上的副本才會被刪除。

切換之後 ​

專案現在執行在新伺服器上。它已停止的副本連同全部資料仍保留在舊伺服器上。在遷移等待你確認期間:

  • 自定義網域:把它們的 DNS 記錄改為新伺服器的位址。遷移頁面會為每個網域顯示具體的記錄(型別 A 或 AAAA 以及位址)。在你修改之前,這些網域仍然指向已經停止的舊伺服器。
  • 在新伺服器上檢查應用:登入、後台任務、郵件、Webhook 以及它依賴的其他功能。
  • 部署和其他專案操作會暫停,以便遷移仍然可以被完整地撤銷。

然後選擇一項:

  • 完成遷移 會從舊伺服器上刪除已停止的副本及其儲存卷,並從 Zenavo 中刪除遷移的傳輸檔案。之後專案無法再回滾到舊伺服器。
  • 回滾 會停止新伺服器上的副本,把生成的網域指回去,用遷移開始時的資料在舊伺服器上啟動服務,並刪除新副本。切換之後在新伺服器上產生的修改不會被複制回去。 如果你改過自定義網域,也請把它們指回去。

補充說明 ​

  • 生成網域的記錄會先新增新記錄,再刪除舊記錄,所以名稱始終能夠解析。解析器可能會把舊位址快取最多五分鐘。
  • 服務儲存在儲存卷以外(容器中)的資料不會被複制:這些資料在任何一次重啟時都會丟失。需要保留的資料請放在儲存卷中。
  • 傳輸檔案與備份是同一種檔案,在遷移完成或回滾之前會出現在專案的備份中。
  • 不支援遷移到其他團隊的伺服器。請把專案複製到另一個團隊,然後在那裡還原備份。
  • 每次遷移、完成和回滾都會記錄在團隊的稽核日誌中。

API ​

方法路徑
GET/api/projects/{pid}/move最近一次遷移:狀態、伺服器、資料、網域、can_finish 和 can_roll_back
GET/api/projects/{pid}/move/preflight?server_id=檢查遷移,不做任何改動(管理員)
POST/api/projects/{pid}/move開始遷移:{server_id, confirmation: "<project name>"}(返回一個任務)
POST/api/projects/{pid}/move/finish從舊伺服器上刪除已停止的副本(返回一個任務)
POST/api/projects/{pid}/move/rollback回到舊伺服器(返回一個任務)

與 Zeabur 無關聯。