1.25亿用户以后,Netflix总结的系统高可用经验
http://www.sohu.com/a/249521297_355140
Netflix 可謂是硅谷最酷的公司之一,其企業(yè)文化也備受推崇:這家公司沒有 CTO,只保留高效能人士,不論公司發(fā)展如何都提供市場價最高的薪資……也正是在這樣的背景下,Netflix 發(fā)展迅速,從 5000 萬用戶增長到 1.25 億用戶,他們總結(jié)了哪些可供參考的系統(tǒng)高可用經(jīng)驗?
在過去四年中,Netflix 已從不到 5000 萬用戶增加到 1.25 億用戶。這種增長給我們帶來了伸縮性方面的挑戰(zhàn),但實際上,我們已經(jīng)設(shè)法在這段時間內(nèi)提高了服務(wù)的整體可用性。在這個過程中,我們學到了很多東西,我們也更加明白該如何提升系統(tǒng)的可用性。但天下沒有免費的午餐,這些經(jīng)驗來之不易:在出現(xiàn)問題時我們忙成一團,有時候還要處理用戶事件。盡管我們還沒有完全掃清所有的問題,我們的系統(tǒng)仍然還有很多可以改進的地方,但我們分享的這些經(jīng)驗都是從實戰(zhàn)中總結(jié)出來的。希望你們能夠從中收獲點什么,以免在凌晨三點鐘收到要你起床處理用戶事件的電話。
在 Netflix,我們使用 Spinnaker 作為持續(xù)集成和交付的平臺。這里討論的很多最佳實踐都已納入到 Spinnaker 中,這些技巧和最佳實踐具有通用性,將幫到任何想要提升系統(tǒng)可用性的人。
(注:Spinnaker 是 Netflix 開源的持續(xù)交付平臺,定位于將產(chǎn)品快速且持續(xù)地部署到多種云平臺上。)
優(yōu)先考慮區(qū)域部署而不是全球部署
我們的目標是盡可能提供最佳的客戶體驗。因此,我們要限制系統(tǒng)變更的影響范圍,對變更進行驗證,然后將變更推給客戶。更具體地說,我們一次只部署一個 AWS 區(qū)域,這為我們的生產(chǎn)部署提供了額外的安全保障。我們能夠快速地轉(zhuǎn)移受影響的客戶流量,這也是我們最重要的四大補救手段之一。
我們還建議在每個區(qū)域部署之間對應(yīng)用程序功能進行驗證,并避免在目標區(qū)域的高峰時段進行部署。
在 Spinnaker 中,指定部署的目標區(qū)域非常簡單。
使用紅黑部署策略進行生產(chǎn)部署
在紅黑(也稱為藍綠)部署中,新版本的應(yīng)用程序(紅色)在通過健康檢查之后立即開始接收流量。在確定紅色版本的健康狀態(tài)之后,之前的(黑色)版本將被禁用,并且不會收到任何流量。如果要回滾,只需要啟用以前的版本即可,非常簡單。這種模型加快了我們的部署流程,并可以在出現(xiàn)問題時回滾到之前的狀態(tài)。
要使用 Spinnaker 完成紅黑部署,只需要在管道中指定策略(并可選擇性地在策略中設(shè)置參數(shù)),Spinnaker 將負責完成部署。
使用部署窗口
每當你在部署新版本應(yīng)用時,都要記住以下兩點:首先,你(或你的同事)是否有監(jiān)控部署,并在必要時進行補救?第二,如果出現(xiàn)了問題,你是否能夠盡可能減小影響范圍?
我們的流媒體流量遵循相對可預(yù)測的模式,大多數(shù)人會在晚上打開視頻流。因此,我們建議選擇工作時段和非高峰時段的部署窗口。
Spinnaker 為此提供了一個界面,讓我們可以輕松地指定運行部署管道的日期和時間。
不要在非工作時段或周末自動觸發(fā)部署
部署窗口也適用于自動觸發(fā)的事件。在 Spinnaker 中,可以使用 cron 表達式作為管道觸發(fā)器,這也可能是一個冒險的策略:有些 cron 表達式可能會在非工作時段或周末執(zhí)行管道,但這不是我們所期望的。無論你使用哪一種自動化機制,都要確保任何自動觸發(fā)的管道都可以在無人值守的模式下運行。
啟用 Chaos Monkey
Chaos Monkey 由 Netflix 創(chuàng)建并開源,是我們混沌工程工具套件的一部分。Chaos Monkey 以不可預(yù)測的方式隨機終止生產(chǎn)環(huán)境中的實例,以此來增強服務(wù),讓服務(wù)具備應(yīng)對單實例故障的彈性能力。如果某些服務(wù)不具備彈性能力,Chaos Monkey 將會暴露出它們的漏洞,服務(wù)所有者就可以在這些漏洞演變成影響用戶的事故之前修復(fù)它們。在 Netflix,生產(chǎn)環(huán)境中的所有服務(wù)都應(yīng)該啟用 Chaos Monkey,在 Chaos Monkey 終止應(yīng)用程序?qū)嵗龝r,服務(wù)所有者不應(yīng)該檢測到任何問題。
在將代碼推送到生產(chǎn)環(huán)境之前使用各種測試和金絲雀分析來驗證代碼
實現(xiàn)快速部署的關(guān)鍵是在部署之前自動驗證新版本的軟件。理想情況下,所有必要的測試套件都應(yīng)該在沒有人工干預(yù)的情況下運行。
此外,我們建議使用金絲雀分析。金絲雀分析是一種通過實時流量來驗證服務(wù)變更的有效方法。最近我們開源了內(nèi)部工具 Kayenta,它可以輕松集成到 Spinnaker 中,并結(jié)合人工判斷,成為放開所有生產(chǎn)流量之前的最后一道門檻。
必要的人工干預(yù)
盡可能使用自動化,但在必要的時候也需要人工干預(yù)。例如,在將新版本推向生產(chǎn)環(huán)境之前需要檢查金絲雀運行的結(jié)果。
部署時盡可能只用已經(jīng)測試過的東西
既然你已經(jīng)對新版本進行了大量的測試和驗證,我們強烈建議你在進行生產(chǎn)環(huán)境部署時只用測試過的東西。對于我們來說,我們更傾向于從測試環(huán)境中復(fù)制經(jīng)過驗證的鏡像,而不是重新構(gòu)建新的鏡像。
定期檢查聯(lián)系人設(shè)置
有時候,為了確保應(yīng)用程序的可用性,你所要做的其實很簡單。如果你的應(yīng)用程序會出問題,并且很可能會在某個時間點出問題,那么此時最重要的是找到能解決問題的人。因此,請定期檢查你的聯(lián)系人設(shè)置,這樣可以確保在發(fā)生事故時能夠迅速找到解決問題的人。
Spinnaker 提供了一個“Page application owner”按鈕,請確保這里配置的信息是最新的,這樣就不會在發(fā)生問題時找錯人。
知道如何快速回滾部署
即使有可靠的測試、金絲雀和其他驗證過程,將某些東西部署到生產(chǎn)環(huán)境中仍然會出現(xiàn)問題。也許這是一種由競態(tài)條件導致的罕見錯誤,只會在達到一定規(guī)模時才發(fā)生。但無論是何種情況,最重要的是你要知道在必要時如何快速恢復(fù)到之前正常的狀態(tài)。
在 Spinnaker 中,如果應(yīng)用程序的新版本出現(xiàn)問題,可以通過“Server Group”下的“Rollback”選項進行回滾?;貪L將啟用你選擇的 ASG(通常是之前的),并禁用發(fā)生故障的 ASG。Spinnaker 還支持創(chuàng)建可在發(fā)生管道故障時執(zhí)行或通過手動觸發(fā)的回滾管道。
如果實例運行不正常,將部署視為失敗
多年來,有幾次我們在部署成功后感覺狀態(tài)不對,實例起來了,但不能正常處理流量?!俺晒Α钡牟渴鸾o我們造成了一種假象,當一個關(guān)鍵的服務(wù)運行不正常時,請求很快會堆積起來,有時會導致重試雪崩,造成各種各樣的破壞。因此,當實例運行不正常時,要將部署視為失敗。
Spinnaker 提供了一種靈活的方法用于關(guān)聯(lián)實例的健康狀況。當一個實例不健康時,Spinnaker 會將其標注出來,更重要的是,不健康的實例將收不到流量。如果 ASG 中的所有實例都不健康,Spinnaker 會將部署視為失敗。Spinnaker 還用不同的顏色來標記實例的狀態(tài),如啟動中、等待發(fā)現(xiàn)、不健康和健康,如下所示。
在進行自動部署時,需要通知團隊有關(guān)部署的情況
讓人們知道部署已成功進入生產(chǎn)環(huán)境,這對成功的運維來說至關(guān)重要。在出現(xiàn)問題時,需要知道發(fā)生了哪些變更以及這些變更是在什么時候發(fā)生的。因此,在進行自動部署時,需要通知團隊,讓他們密切關(guān)注服務(wù)的健康狀況。在 Netflix,我們使用 Slack 發(fā)送通知。在 Spinnaker 中,管道可以在部署完成時通知相應(yīng)的 Slack 頻道。
自動化非典型部署,而不是進行一次性手動部署
每個工程師都為非典型情況編寫過一次性腳本。而當這類“一次性”情況再次發(fā)生時,團隊的其他成員并不知道寫腳本的那個工程師在腳本里都干了什么,因為腳本本來是打算運行一次就丟掉的!很多人都遇到過這種情況。
管道是自動執(zhí)行一系列步驟的有效手段,即使有些步驟并不會每天都執(zhí)行。例如,一個用于緊急推送的管道,它使用參數(shù)作為控制執(zhí)行的條件(比如跳過部署窗口)。
不要忘記定期測試非關(guān)鍵場景的非典型(和典型)部署管道!
使用先決條件驗證預(yù)期狀態(tài)
現(xiàn)如今,系統(tǒng)經(jīng)常發(fā)生變化是常態(tài)。在 Netflix,我們的數(shù)百個微服務(wù)在不斷發(fā)生變化。做出無根據(jù)的假設(shè)(比如假設(shè)其他系統(tǒng)的狀態(tài))是很危險的。我們現(xiàn)在使用先決條件來確保在部署新代碼或進行其他變更時假設(shè)仍然有效。這對于長時間執(zhí)行的管道(可能是因為人工判斷或部署窗口造成延遲)來說尤為重要。我們可以在發(fā)生潛在的破壞性操作之前使用先決條件來驗證預(yù)期的狀態(tài)。
總 結(jié)
這篇文章總結(jié)了我們多年來在 Netflix 積累的各種技巧和最佳實踐。我們的方法是盡可能圍繞這些最佳實踐構(gòu)建工具。我們始終把提高服務(wù)可用性作為目標。在真正需要人工干預(yù)時,我們才會介入,否則就不插手。工程師的時間用在了那些可以提高可用性的任務(wù)上,而在不需要他們參與的情況下,他們可以專注其他事情。
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/9586113.html
總結(jié)
以上是生活随笔為你收集整理的1.25亿用户以后,Netflix总结的系统高可用经验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员职业发展路径图:从菜鸟工程师到高级
- 下一篇: 重磅!GitHub发布开源负载均衡组件G