−25%

Windows 年繳方案適用,至 10 月 31 日。 檢視方案

EQVPS
開始使用

不停機把 VPS 遷移到新服務供應商

2026年10月10日 · 1 分鐘閱讀 · EQVPS Team

每個遷移翻車的故事,中間情節都一樣:有人先改了 DNS,然後才開始複製資料。遷移時的停機幾乎從來不是因為複製太慢,而是因為步驟順序錯了。

下面是行得通的順序,不管您是從別的服務供應商遷過來,還是在我們的兩個方案之間遷移。

1. 提前兩天:調低 TTL

找到您要修改的 DNS 記錄(通常是 A、AAAA,以及指向它們的 CNAME),把 TTL 調到 300 秒。然後至少等待舊 TTL 那麼長的時間。TTL 為一天的記錄,意味著修改後部分解析器還會繼續返回舊位址一整天,您在伺服器上做什麼都無法加快這一過程。

這是大家最常跳過的一步,也正是它把五分鐘的切換變成了一整天:一半使用者看到的仍是舊伺服器。

2. 給舊伺服器做一份清單

您要在別處重建這台機器,所以把它實際在做的事情寫下來。不是您記得的,而是它真正在做的:

ss -tlnp                                # what is listening, and which process
crontab -l; ls /etc/cron.d              # scheduled jobs
systemctl list-timers --all             # the scheduled jobs people forget
systemctl list-units --type=service --state=running

再補充進清單:TLS 憑證及其續期方式、存放金鑰的環境變數檔案、防火牆規則、使用者和他們的 SSH 金鑰、資料庫及其大小,以及所有透過 IP 位址存取這台伺服器的東西。最後這一類最容易被忽略:合作方的白名單、支付服務供應商的 Webhook 設定、某個監控檢查。

3. 在舊伺服器旁邊搭建新伺服器

訂購新伺服器,舊的先別動。從 VPS 列表 裡選一個磁碟不小於您實際用量的方案,而不是當初賣給您的容量。如果舊機器接收任何對內流量(網站、Webhook、API),新機器就需要獨立 IPv4。NAT 方案只在 SSH 埠上接受對內連線,一個轉發埠能做什麼、不能做什麼 解釋了為什麼這一點很重要。

連上去,安裝同樣的套件,重新建立使用者和防火牆。金鑰和首次登入見 連線指南。

4. 同步兩次檔案

第一次同步在舊伺服器照常執行時複製全部內容。可能要好幾個小時,沒關係。

rsync -aHAX --numeric-ids --info=progress2 /var/www/ root@203.0.113.10:/var/www/

--numeric-ids 按數字保留檔案屬主,避免了兩套系統使用者建立順序不同時那種經典的「所有檔案都屬於錯誤使用者」的意外。如果您沒用過基於 SSH 的 rsync,如何把檔案傳到 VPS 會一步步講清楚。

第二次同步在切換前進行,只複製第一次之後有變化的部分,通常幾秒鐘就完成。

5. 慎重地遷移資料庫

檔案很簡單。接收寫入的資料庫是唯一一個「不停機」需要要麼做點小妥協、要麼多花功夫的地方。

簡單的辦法:先匯出、匯入一次用於測試;切換時停寫一分鐘(把應用設為唯讀或停掉),重新匯出一份,匯入到新伺服器,然後在新伺服器上啟動應用。對大多數小專案來說,這就是一兩分鐘的停頓,可以提前通知。

不停頓的辦法:設定從舊資料庫到新資料庫的複製,等它追上進度,切換時把新庫提升為主庫。設定更多,但當哪怕一分鐘的寫入遺失都無法接受時,這是值得的。

6. 在別人看到之前測試新伺服器

DNS 仍然指向舊伺服器,所以您可以私下測試新伺服器。把對真實網域的請求發到新位址:

curl --resolve example.com:443:203.0.113.10 https://example.com/health

如果憑證還沒配好,就用同樣的方式走 HTTP 測試,或者在 hosts 檔案裡臨時加一行,在瀏覽器裡把網站點一遍。檢查登入、上傳、背景任務和外發郵件。這是發現缺少某個 PHP 擴充成本最低的時刻。

7. 切換,並讓舊伺服器繼續執行

完成最後一次檔案同步和資料庫步驟,然後修改 DNS 記錄。TTL 為 300 秒時,大部分流量幾分鐘內就會轉過去。盯著舊伺服器的存取記錄:那些忽略 TTL 的解析器和用戶端還會零星地發來請求。讓它保持原樣執行幾天。之後更新所有指向舊 IP 的地方:合作方白名單、Webhook 位址,以及郵件相關的新位址反向 DNS(在我們的獨立 IP 方案上可以自己設定,見 反向 DNS)和 SPF 記錄。

最常出問題的地方

大致按我們見到的頻率排序:沒人列進清單的 systemd 定時器、寫死舊 IP 的設定檔案、屬於錯誤使用者的檔案、擋住應用自身埠的防火牆、在舊伺服器上續期而新伺服器上沒續期的憑證,以及因為新位址還沒有反向 DNS 而被扔進垃圾箱的郵件。

這份清單不適用的情況

寫入持續不斷、完全不能停頓的繁忙資料庫,需要的是正經的複製方案和一次彩排,而不是一篇部落格清單。Windows 伺服器的遷移工具和 rsync 不同。另外,如果遷移的真正原因是設定不夠用,先看這一點:這裡的方案可以原地升級。升級到同一網路型別的更大方案,只需重新啟動一次就能增加 vCPU、記憶體和磁碟,完全不用遷移。只有降配才需要新伺服器。如果您是因為不確定機器夠不夠用才想遷移,什麼時候真的需要 64 GB 記憶體 也許能幫您省掉這趟折騰;如果您還不確定 VPS 是否適合您,可以看看 VPS、共享主機、獨立伺服器和雲平台的比較。

常見問題

應該提前多久調低 DNS 的 TTL?

至少提前目前 TTL 的時長,最好在遷移前一兩天就調。如果記錄的 TTL 是 86400 秒,解析器可能會把舊結果保留整整一天,所以切換前一小時才調低毫無用處。

真的能做到完全不停機遷移嗎?

無狀態服務可以:兩台伺服器同時執行,切換 DNS,讓流量慢慢轉過去。對於接收寫入的資料庫,要麼接受最後一次同步時的短暫停寫,要麼設定複製,讓新伺服器始終保持最新。

怎樣在改 DNS 之前測試新伺服器?

只讓您自己的機器指向它。用 curl 加 --resolve,把對真實網域的請求發到新 IP,或者在 hosts 檔案裡臨時加一行。其他所有人仍然存取舊伺服器。

什麼時候可以關掉舊伺服器?

等舊 TTL 過期後,它的記錄至少一天沒有真實流量時。有些解析器和用戶端會忽略 TTL,所以如果條件允許,讓舊伺服器保持原樣再執行幾天。

遷移後最常出什麼問題?

被遺忘的定時任務、設定檔案和合作方白名單裡寫死的 IP 位址、複製後的檔案屬主、防火牆規則,還有郵件:反向 DNS 和 SPF 記錄仍然指向舊位址。

評論

目前還沒有評論。歡迎成為第一位。

發表評論

評論在顯示前會經過審核。