5個小時,我們將800個微服務(wù)遷移到了云端
9 月 16 日晚上,我們將 FINN 的生產(chǎn)環(huán)境從本地數(shù)據(jù)中心遷移到了谷歌云平臺(GCP)。這意味著要遷移一個高流量的網(wǎng)站,該網(wǎng)站由一個復(fù)雜的分布式系統(tǒng)支持,由 800 多個應(yīng)用程序、145 個數(shù)據(jù)庫和 16TB 數(shù)據(jù)組成。我們在夜間有規(guī)劃的停機(jī)時間窗口,但這一窗口越小越好。我們是怎么做的?請繼續(xù)閱讀本文!
關(guān)于將 FINN.no 移出我們的數(shù)據(jù)中心,并遷移到云平臺中的內(nèi)部討論始于多年前。此后,我們一直在嘗試各種云技術(shù)和云提供商。當(dāng)我們在 2016 年選擇 Kubernetes 作為平臺時,我們的指導(dǎo)思想就是在云平臺中運行 FINN。
從很久前開始,我們在思想上已經(jīng)準(zhǔn)備好將系統(tǒng)遷移到云端了,但一直沒有制定真正實現(xiàn)這一目標(biāo)的策略或計劃。我們產(chǎn)品的某些部件早在 1998 年就開始使用了,因此遷移它們是一項艱巨的任務(wù)。但是,隨著數(shù)據(jù)中心愈加不堪重負(fù)、對更靈活解決方案的需求,以及我們?nèi)ツ瓿晒?Sybase 從 Solaris 遷移到 Linux 的經(jīng)驗,都給了我們很多動力來認(rèn)真考慮這一計劃。
我們從 2019 年 1 月開始評估各家云提供商。候選名單包括 AWS、Google Cloud、IBM Cloud 和 Azure。我們參加了很多研討會、會議和電話會議,評估了自行管理服務(wù)以及將我們的服務(wù)托管于其他云提供商等許多選項,最終我們決定采用“多云”方案,而選擇 GCP 作為我們大多數(shù)服務(wù)的首選項。該方案最終于 2019 年 8 月中旬被 Schibsted 批準(zhǔn)。
1. 準(zhǔn)備工作
遷移即將進(jìn)行,我們必須制定一個計劃,將我們擁有的一切轉(zhuǎn)移到 GCP,同時保持 FINN 的正常運行。我們決定逐步遷移,使開發(fā)人員能夠隨著時間的推移遷移服務(wù)。但是,時間過得真快,我們意識到可用時間越來越少?;A(chǔ)架構(gòu)的惡化、現(xiàn)有數(shù)據(jù)中心計劃中的網(wǎng)絡(luò)翻新以及資源的匱乏,使我們很難看到逐步遷移的成功前景。全球疫情大流行也讓工作變得更困難了。我們被迫做出一些艱難的決定。
2020 年 6 月,我們了解到,我們需要采取更直接的方法,并確定向 GCP 迅速切換的日期。我們將目標(biāo)日期定為 9 月 15 日,并獲得了 FINN 管理小組批準(zhǔn),準(zhǔn)許 FINN.no 停機(jī)一晚。7 月,云平臺遷移被設(shè)置為 FINN 的第一要務(wù);這意味著所有團(tuán)隊必須完成他們負(fù)責(zé)的所有與云平臺遷移相關(guān)的工作,然后才能進(jìn)行其他計劃的任務(wù)。是時候該去(遠(yuǎn)程)工作了。
當(dāng)我們決定放棄逐步遷移,決定快速切換時,擺在我們面前的艱巨任務(wù)就開始出現(xiàn)了。我們必須準(zhǔn)備一個平臺,使我們能夠在一夜之間移動 800 多個應(yīng)用、145 個數(shù)據(jù)庫、超過 16TB 的數(shù)據(jù)以及 183 個虛擬機(jī)。FINN 的基礎(chǔ)架構(gòu)團(tuán)隊已經(jīng)為云平臺遷移做了很長時間的準(zhǔn)備,但是這個決定使我們重新集中精力?,F(xiàn)在,我們必須堅定地確定優(yōu)先級,在必要時花時間深入探索技術(shù),且始終保持目標(biāo)清晰。在某些情況下,這意味著我們需要改變甚至放棄我們曾經(jīng)投入大量時間的一些解決方案。
從夏天結(jié)束的那一刻起,我們就努力使這一計劃取得成功。我們必須對我們需要花時間要做的事情和必須等待的事情做出艱難的選擇。但是我們盡量不走捷徑,堅持我們的原則,例如基礎(chǔ)設(shè)施即代碼。隨著遷移日越來越近以及工作量的增加,我們的信心也隨之增加。
該圖顯示了隨著切換時間的臨近,我們用于維護(hù) FINN 基礎(chǔ)架構(gòu)的一個存儲庫的更改頻率不斷增長
對 FINN.no 的更改通常每天實行約 350 次。在切換前的最后 24 小時,我們決定建議使用“發(fā)行凍結(jié)”,這意味著那些既不能解決實時生產(chǎn)問題,又不能解決與云平臺遷移有關(guān)的更改應(yīng)等到第二天。切換的前一天,更改頻率降低到一半左右,并且在云平臺切換開始前幾分鐘,最后一個產(chǎn)品部署到了我們的原有內(nèi)部基礎(chǔ)架構(gòu)中。
2. 云平臺切換
9 月 15 日 23:00 時,基礎(chǔ)架構(gòu)團(tuán)隊聚在一起(在線),準(zhǔn)備就緒并檢查切換前檢查清單。由于每個人都在不同的地理位置,因此我們依靠詳細(xì)的運行手冊和視頻會議進(jìn)行協(xié)作。對 FINN.no 的更改通常在不停機(jī)的情況下進(jìn)行部署,站點停機(jī)是 1 級嚴(yán)重事件。不過,這不是一個正常的星期二晚上。午夜時分,我們將用戶重定向到靜態(tài)后備頁面后關(guān)閉了 FINN.no。半小時后,我們關(guān)閉了本地 Kubernetes 集群中的所有應(yīng)用程序。
轉(zhuǎn)換期間在 FINN.no 上顯示的靜態(tài)后備頁面
然后我們準(zhǔn)備遷移數(shù)據(jù)。Kafka 是我們微服務(wù)架構(gòu)的基礎(chǔ)之一。每天大約有 20 億條消息(平均每秒 30,000 條)通過我們的 Kafka 集群,其穩(wěn)定性對于 FINN 的正常運轉(zhuǎn)至關(guān)重要。Kafka 小組遷移了我們的 Kafka 群集,該團(tuán)隊暫時以“延伸集群”配置運行該集群,將我們的本地數(shù)據(jù)中心和云平臺作為單個集群。我們提前幾周仔細(xì)計劃和實施了延伸集群配置。Kafka 中的主題在切換前一周已復(fù)制到 GCP 的 broker 中,而 GCP 的 broker 在轉(zhuǎn)換過程中成為主 broker。
需要持久存儲的服務(wù)通常使用我們的 25 個 PostgreSQL 集群之一或我們的 Sybase 集群。我們通過預(yù)先在 GCP 中設(shè)置數(shù)據(jù)庫副本,并在切換過程中所有應(yīng)用程序停止后切換主數(shù)據(jù)庫來遷移這些數(shù)據(jù)庫集群。在切換當(dāng)天的 01:35,Kafka 以及我們所有的 PostgreSQL 和 Sybase 數(shù)據(jù)庫都運行在了 GCP 中。
移動持久數(shù)據(jù)后,我們觸發(fā)了所有應(yīng)用程序到新的 Google Container Engine(GKE)集群的部署。到 02:30,所有 800 個應(yīng)用程序(超過 1500 個 Kubernetes 的 pod)都已部署到 GKE。至此,我們當(dāng)晚只遇到了一些小的問題和延誤,并已經(jīng)準(zhǔn)備好進(jìn)行內(nèi)部測試。
在切換之夜前,我們在所有領(lǐng)域的遷移準(zhǔn)備和測試計劃方面都做得非常出色,當(dāng)午夜測試開始,看到綠燈亮起,我們的基礎(chǔ)架構(gòu)團(tuán)隊感到非常欣慰。對平臺所有不同部分的自組織測試的效果甚至超出了我們的想象!
經(jīng)過所有團(tuán)隊的良好團(tuán)隊合作,修復(fù)了一些應(yīng)用部署、損壞的數(shù)據(jù)庫表和其他一些小問題之后,云平臺中的 FINN 于 04:43 啟用,沒有發(fā)生重大事故。
在 FINN.no 在云平臺中于 04:43 啟用后,通過某個負(fù)載均衡器的請求的速率增長曲線
我們?yōu)槟軌虺晒M(jìn)行云平臺切換而感到自豪!
沒有 FINN Technology 的優(yōu)秀人才,遷移不可能成功。我們在組織的各個部門都得到支持,當(dāng)行動號召到來時,每個人都加入進(jìn)來并做了應(yīng)做的部分工作。在準(zhǔn)備階段,開發(fā)團(tuán)隊一直在努力處理防火墻、網(wǎng)絡(luò)路由和負(fù)載平衡器,發(fā)現(xiàn)我們新的 GCP 基礎(chǔ)架構(gòu)中的問題,并與基礎(chǔ)架構(gòu)團(tuán)隊合作解決這些問題。在切換之夜的前幾個星期,我們在工作時間還針對開發(fā)環(huán)境進(jìn)行了轉(zhuǎn)換演習(xí)。這次“排演”使我們充滿信心,相信我們可以在指定的停機(jī)時間窗口內(nèi)執(zhí)行轉(zhuǎn)換,幫助我們發(fā)現(xiàn)和糾正工具方面的問題,并且對于完善生產(chǎn)切換的運行手冊非常有幫助。這兩件事都有助于將風(fēng)險降低到可接受的水平。
由于我們的遷移工作有一個硬期限,因此許多系統(tǒng)必須采用直接遷移方式進(jìn)行移動。當(dāng)我們稍微適應(yīng)云環(huán)境時,我們期待將基礎(chǔ)架構(gòu)的這些部分也變得更加云原生化。


















 
 
 

 
 
 
 