服務器 - 從一臺服務器切換至另一臺服務器(損失數十條PV記錄為代價)
看著四年的服務器正式到期,沒什么轟轟烈烈的告別,就像目送老朋友轉身走遠,只默默記下:哦,原來它陪了我這么久啊。
前言
一臺陪伴了我4年的服務器昨天晚上到期了,數據和服務遷移到新服務器上有兩點想盡可能保證的:
- 服務不中斷
- 數據不丟失
最終結果是服務沒中斷,遷移過程中丟失了約數十條的PV記錄。
大致流程是:新服務器部署環境安裝依賴同步靜態數據 --> 新服務器上準備好服務啟動命令準備按回車 --> 舊服務器導出數據庫數據傳輸到新服務器上并導入新服務器數據庫 --> 新服務器快速啟動服務 --> 將流量切到新服務器上。
中間從舊服務器開始導出數據
到流量切到新服務器上
這段時間的產生的十幾條PV記錄寫到了舊服務器上并與新服務器數據庫產生了沖突。由于影響不是很大就沒去處理。
當然想做到數據也不丟失似乎也可以通過主從數據庫的方式來保證,但主要是我不會。
過程
新服務器安裝依賴部署環境同步舊服務器的靜態數據
我有一個習慣,舊服務器上的配置幾乎都存放在一個專門的文件夾TFpath
,然后ln -s
軟鏈接到原始位置,這樣不論我修改什么配置,實質上配置文件都會在TFpath
文件夾下被修改。
也就是說這些靜態配置我只需要scp
到新服務器上并在新服務器上將他們分別軟鏈接到對應位置就好了。
這樣在新服務器上安裝好各個服務后一啟動,配置就和舊服務器一樣了。 萬物皆文件好啊(bushi)
代碼什么的統統復制到新服務器上,該安裝的依賴安裝好,坐等數據庫改好后一鍵啟動。
舊服務器導出數據庫數據傳輸到新服務器上并導入新服務器數據庫
我所涉及的動態數據主要存儲在MySQL中,mysqldumps -u xx -p --all-databases > all.sql
可方便導出整個數據庫,scp all.sql user@ip:path
可將數據庫文件拷貝到新服務器上,新服務器上在MySQL命令行中執行source all.sql
即可一鍵將數據庫變得和舊服務器相同,連用戶名密碼都會變得一致。
有了數據之后,新服務器上的服務就可以啟動,等待流量的到來了。
將流量切換到新服務器上
我使用的是CloudFlare的DNS(以及CDN),代理模式為完全。雖然名義上是CDN實際上在國內就是個減速器,這樣做的目的主要是友好為數不多的國外用戶以及隱匿我的真實IP。
實質上當你訪問我的域名如https://letmefly.xyz
時,DNS服務器將請求定向到其中一個Cloudflare節點上,Cloudflare節點再去請求我的源服務器,這樣第三方用戶就不知道我的真實IP了。
雖然通過一些特殊手段還是可能反映射到,但是cloudflare已經在很大程度上保證源服務器的安全了。請大家把賽博菩薩打在公屏上。
這樣還有一個好處,就是切流量異常地順利,幾乎可以說是秒級。因為這種機制導致切流量時無需更新DNS,用戶仍然訪問cloudflare節點,cloudflare直接把流量切到新機器上就好了。
現在可以公開的情報
舊服務器IP是123.56.114.139
,這個倒背如流的IP可以公開了。
新服務器的IP還藏在堅強的CloudFlare護盾后面,以防一波應該不會出現的針對源IP服務器直接的DDoS。
Q&A
有人說為何不借助云服務商的一鍵遷移或者鏡像導入導出?
這樣是很省事兒,一個是遷移過程中可能仍然會有部分數據修改到舊服務器上,一個是阿某云輕量應用服務器不支持大磁盤機器向小磁盤機器的一鍵遷移(想一鍵遷移還得氪金)。
有人說備案問題怎么解決?新服務器會不會因為沒有備案導致流量被攔截?
不會。個人備案主要備的是域名不是IP,工信部規定解析到中國IP的域名都需要進行備案否則將會被攔截,但是我這個域名在舊服務器上的時候已經備案過了,所以不會被攔截。
Last But Not Least
陪伴了我4年的老戰友,值得一個小小的紀念儀式。
介紹后想起來兩臺同區域的阿里云服務器之間數據應該是可以通過局域網IP快速傳,免受公網IP帶寬限制。
End
當然這也許并非最優解,也許會有很多更簡單好用的方法。如果有,請不要吝惜告訴我。
同步發文于CSDN和我的個人博客,原創不易,轉載經作者同意后請附上原文鏈接哦~
千篇源碼題解已開源