遷移專案
把一個已部署的專案連同資料遷移到同一團隊的另一台伺服器上:換一台更大的伺服器、換一個地區,或者淘汰舊機器。專案的 ID、設定、網域和歷史都會保留。
在你確認專案在新伺服器上執行正常之前,舊伺服器上不會刪除任何東西。
開始之前
- 你需要在團隊中擁有 admin 或 owner 角色,並輸入專案名稱確認。
- 專案必須已經部署。未部署的專案沒有需要複製的資料;請改為把它複製到另一台伺服器上。
- 新伺服器必須處於就緒狀態,舊伺服器必須能存取,因為資料要從舊伺服器複製。
- 遷移期間專案不可用:為了保證副本的一致性,它的服務會被停止。請安排在存取量少的時候遷移。耗時大約相當於備份並還原它的全部資料。
開始遷移
- 開啟專案的 設定 → 通用 → 遷移到其他伺服器。
- 選擇新伺服器。Zenavo 會檢查並顯示:
- 伺服器是否就緒、團隊是否在方案限制之內,以及伺服器是否有足夠的空閒記憶體(按每個服務的記憶體限制或近期用量計算);
- 與該伺服器上其他專案的網域和發布的 TCP/UDP 連接埠衝突;
- 將要複製的資料;
- 會自動切換的生成網域,以及自定義網域需要你修改的 DNS 記錄。
- 輸入專案名稱,點選 遷移。
遷移以任務的形式執行。任務頁面會顯示每個步驟和日誌。
遷移過程
| 步驟 | 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 | 回到舊伺服器(返回一個任務) |