要:在全球軟件大會(huì)上,華為云工程師深度分析了網(wǎng)站在各類極端重大災(zāi)難場景下,如何快速恢復(fù)的高可用保障方案和工程化實(shí)踐。
最近,某CDN服務(wù)故障,導(dǎo)致海外大批知名新聞網(wǎng)站無法正常訪問或加載,一石激起千層浪。確實(shí),隨著越來越多的業(yè)務(wù)上云,一個(gè)網(wǎng)站或者某個(gè)業(yè)務(wù)能否保證持續(xù)的在線,非常考驗(yàn)背后的高可用、高可靠方案設(shè)計(jì)。
在第七屆全球軟件大會(huì)上,華為軟件工程師杜志剛,就為廣大開發(fā)者分享了華為云官網(wǎng)的高可用保障方案,深度分析了網(wǎng)站在各類極端重大災(zāi)難場景下,如何快速恢復(fù)的方案和工程化實(shí)踐。
從網(wǎng)站所有者角度來看:網(wǎng)站不可用直接導(dǎo)致的是經(jīng)濟(jì)收入方面的影響,特別對于電商類網(wǎng)站,每分每秒都在產(chǎn)生交易,一旦訪問中斷,經(jīng)濟(jì)損失的影響顯而易見。除此之外,從客戶角度來看,面對網(wǎng)站不可訪問,最直觀的感受是不靠譜,對網(wǎng)站以及網(wǎng)站背后的企業(yè)品牌產(chǎn)生不可挽回的口碑及信任度方面的負(fù)面影響。
從近十年的互聯(lián)網(wǎng)重大故障事件來看,DNS、CDN導(dǎo)致的大范圍影響歷歷在目,其他IT基礎(chǔ)設(shè)施導(dǎo)致的區(qū)域型及全局型故障也影響甚大。
業(yè)界廣泛使用的網(wǎng)站可用性指標(biāo)包括網(wǎng)站不可用時(shí)間及網(wǎng)站年度可用率,不同類型的網(wǎng)站和應(yīng)用對可用性的要求也不盡相同。
其中網(wǎng)站不可用時(shí)間(故障時(shí)間)=故障恢復(fù)時(shí)間點(diǎn)-故障發(fā)生時(shí)間點(diǎn)。網(wǎng)站年度可用率(Yearly Uptime Percentage)=(1-網(wǎng)站不可用時(shí)間/年度總時(shí)間)*100%。
華為云官網(wǎng)作為云基礎(chǔ)設(shè)施提供商的互聯(lián)網(wǎng)訪問入口,對可用性有著極高的要求,面向最終用戶的核心頁面要做到7*24小時(shí)在線,如果出現(xiàn)重大故障,如云服務(wù)區(qū)級(jí)別,或基礎(chǔ)設(shè)施導(dǎo)致的單云全局故障,5分鐘內(nèi)告警通知到相關(guān)責(zé)任人,15分鐘內(nèi)完成故障切換。
下面結(jié)合圖例分析一下網(wǎng)站頁面訪問的整體流程及關(guān)鍵故障點(diǎn):
在①處,DNS故障會(huì)通常會(huì)導(dǎo)致網(wǎng)站整體不可訪問,到了②是CDN故障會(huì)讓部分地理區(qū)域用戶不可訪問,③是單云全局故障會(huì)導(dǎo)致網(wǎng)站整體不可訪問,④是云服務(wù)區(qū)級(jí)別故障會(huì)導(dǎo)致分流到該區(qū)域的用戶不可訪問,⑤是云服務(wù)可用區(qū)級(jí)別故障會(huì)導(dǎo)致路由到故障AZ的用戶不可訪問,⑥是容器集群故障導(dǎo)致路由到對應(yīng)容器服務(wù)的用戶不可訪問,⑦是服務(wù)節(jié)點(diǎn)故障會(huì)導(dǎo)致路由到故障服務(wù)節(jié)點(diǎn)的用戶不可訪問。
綜上,云化場景下,頁面訪問面臨諸多的關(guān)鍵技術(shù)挑戰(zhàn),包括:
針對以上關(guān)鍵挑戰(zhàn),通過華為云官網(wǎng)近幾年的實(shí)踐,總結(jié)了4個(gè)方案分享給大家,我們將一一拆解,為大家展示這些方案的實(shí)際效果。
DNS是相對來說非常重要但卻沒有得到應(yīng)有重視的薄弱環(huán)節(jié),對于可用性要求極高的商業(yè)門戶網(wǎng)站,將DNS依托于一家服務(wù)商,不出問題風(fēng)平浪靜,一旦發(fā)生全局性故障,導(dǎo)致的影響可能是災(zāi)難性的。
我們當(dāng)前的策略是:采用雙DNS廠商域名解析方案,在一家服務(wù)商發(fā)生部分或整體故障時(shí),可以在短時(shí)間內(nèi)自動(dòng)實(shí)現(xiàn)故障切換,將域名解析工作交給其他服務(wù)商完成。此外,我們還構(gòu)建了統(tǒng)一運(yùn)維平臺(tái)實(shí)現(xiàn)多廠商域名解析的統(tǒng)一配置,以及DNS可用性監(jiān)控、故障服務(wù)的快速剔除能力。
雙廠商DNS配置如圖所示:
這個(gè)配置的前提是域名注冊商及域名解析商支持多廠商N(yùn)ame Server配置。具體配置方面,首先將域名注冊托管遷移到支持多廠商N(yùn)S配置的注冊商,然后同步DNS廠商配置的解析記錄到新廠商,最后域名注冊服務(wù)及解析服務(wù)同時(shí)配置NS記錄指向雙廠商N(yùn)ame Server(0~72小時(shí)生效)。
這樣配置可以在單個(gè)廠商N(yùn)ame Server發(fā)生故障時(shí),ISP Local DNS自動(dòng)將故障Name Server降低選擇優(yōu)先級(jí)(BIND SRTT算法,失敗懲罰),使用優(yōu)選的Name Server進(jìn)行A記錄或CNAME域名解析。
演練步驟可以拆解為:
第一步:雙廠商N(yùn)S記錄配置。
第二步:通過瀏覽器檢查服務(wù)可正常訪問。
第三步:撥測Name Server可用性,驗(yàn)證不同地域ISP是否使用了不同廠商的Name Server進(jìn)行域名解析。
第四步:關(guān)停Bind模擬單個(gè)廠商DNS故障。
最后,通過HTTP從多個(gè)地域撥測服務(wù)是否可以正常訪問。
下面介紹一下多CDN廠商的配置與切換,如圖所示:
使用這個(gè)方案的限制條件有三個(gè):DNS協(xié)議不支持多廠商CDN的CNAME解析配置;DNS智能解析支持不同地域或網(wǎng)絡(luò)配置不同的CNAME解析記錄;CDN出現(xiàn)整體故障概率較低,更多是區(qū)域性故障。
多CDN廠商的配置要先對國內(nèi)及海外訪問分別做主備CDN加速,然后CDN CNAME解析TTL設(shè)置為60s,讓單CDN廠商服務(wù)不可用時(shí),故障切換生效時(shí)間更短;最后是構(gòu)建CDN管理平臺(tái),對接多廠商DNS管理API,預(yù)先配置切換和回切策略,出現(xiàn)故障一鍵切換。
最后的配置效果也很明顯,CDN告警廠商A大面積故障后,可通過CDN運(yùn)維管理平臺(tái),將對應(yīng)區(qū)域的CNAME解析Failover到廠商B提供服務(wù),生效時(shí)間1分鐘。
下圖是我們運(yùn)維平臺(tái)的切換界面示例,可按不同二級(jí)域名分國內(nèi)及海外用戶訪問場景分別切換。
在2020年和2021年我們遇到了實(shí)際的現(xiàn)網(wǎng)故障,CDN的故障切換功能得到了有效應(yīng)用,讓頁面訪問實(shí)現(xiàn)了快速故障恢復(fù)。
這里介紹了我們中國站和國際站雙站異地多活的組網(wǎng)策略,如圖所示:
如果發(fā)生區(qū)域性地理災(zāi)難場景,我們使用站點(diǎn)多Region多活部署,使用這個(gè)解決方案要保證內(nèi)容管理服務(wù)發(fā)布的頁面內(nèi)容在多云服務(wù)區(qū)保持同步。同時(shí),LB及網(wǎng)關(guān)路由配置多活云服務(wù)區(qū)保持一致。
具體配置時(shí),先將國內(nèi)及海外用戶CDN回源流量按比例分流至不同云服務(wù)區(qū);隨后配置健康檢查策略,當(dāng)出現(xiàn)云服務(wù)區(qū)級(jí)別故障時(shí)告警,便于自動(dòng)或手動(dòng)切換回源流量至健康的云服務(wù)區(qū);如果海外與國內(nèi)服務(wù)存在差異時(shí),通過云廠商內(nèi)部專線在LB或網(wǎng)關(guān)進(jìn)行跨云服務(wù)區(qū)路由。
這樣,在非容災(zāi)場景下,多云服務(wù)區(qū)同時(shí)提供頁面訪問服務(wù),降低單云服務(wù)區(qū)回源壓力。即便出現(xiàn)云服務(wù)區(qū)級(jí)別故障時(shí),也可通過CDN Admin API實(shí)現(xiàn)一鍵故障切換,CDN回源快速回到可用狀態(tài)。
如圖所示,通過我們的運(yùn)維平臺(tái),在單個(gè)云服務(wù)區(qū)故障場景下,可實(shí)現(xiàn)故障云服務(wù)區(qū)的快速剔除,這個(gè)過程主要通過批量切換二級(jí)域名Region級(jí)別回源DNS A記錄實(shí)現(xiàn)的。
最后介紹一下整個(gè)高可用方案的最底層的保底方案:網(wǎng)站備份與故障切換,首先來看一下網(wǎng)站的備份流程,如圖所示:
運(yùn)維人員先配置站點(diǎn)元數(shù)據(jù)及配置備份策略,站點(diǎn)管理根據(jù)備份策略下發(fā)備份任務(wù)到調(diào)度服務(wù),然后調(diào)度服務(wù)再定時(shí)調(diào)用備份服務(wù)執(zhí)行備份任務(wù)。
采集的話是由備份服務(wù)啟動(dòng)Headless Browser加載入口頁,再加載靜態(tài)頁面資源,執(zhí)行頁面腳本加載動(dòng)態(tài)頁面資源,然后執(zhí)行預(yù)置腳本加載動(dòng)態(tài)頁面資源,最后識(shí)別頁面跳轉(zhuǎn)URL,包括HTML標(biāo)記及腳本觸發(fā)的動(dòng)態(tài)跳轉(zhuǎn)點(diǎn),啟動(dòng)新Headless Browser實(shí)例,實(shí)現(xiàn)級(jí)聯(lián)爬取。
采集完是存儲(chǔ),頁面主文檔及相關(guān)頁面資源加載完成后通過OBS接口轉(zhuǎn)儲(chǔ)到對象存儲(chǔ)服務(wù),再通過云廠商提供的對象存儲(chǔ)跨Region同步能力實(shí)現(xiàn)頁面內(nèi)容異地容災(zāi)。跨云復(fù)制則通過跨云同步工具將備份站點(diǎn)頁面內(nèi)容,同步到其他云廠商對象存儲(chǔ)服務(wù),實(shí)現(xiàn)跨云容災(zāi)。
備份結(jié)束后,再看一下故障切換流程。當(dāng)基礎(chǔ)設(shè)施問題等原因?qū)е碌膯卧贫郣egion故障使得Web服務(wù)整體不可用時(shí),開始故障檢測,頁面可用性撥測服務(wù)監(jiān)測到云服務(wù)區(qū)A、B不可用,在5分鐘內(nèi)發(fā)出告警。
往下是故障轉(zhuǎn)移,成立重大問題應(yīng)急處理作戰(zhàn)小組,同時(shí)打開運(yùn)維容災(zāi)管理平臺(tái),查看不可用區(qū)域、備份站點(diǎn)撥測是否正常。如果同云備份站點(diǎn)可用,優(yōu)先切換同云備份站點(diǎn);如果不可用,第三方云廠商備份站點(diǎn)可用,切換到備份站點(diǎn)。整個(gè)切換通過更新回源域名A記錄解析地址指向OBS公網(wǎng)訪問地址實(shí)現(xiàn)。
最后是故障修復(fù)階段,先定位解決問題,撥測Web Server可用,再手動(dòng)執(zhí)行故障回切,然后用戶回歸正常訪問。
以上是在各種極端場景下如何保證網(wǎng)站持續(xù)在線的一些實(shí)踐經(jīng)驗(yàn)的總結(jié),相關(guān)方案已經(jīng)在實(shí)際場景下驗(yàn)證有效,并且做到持續(xù)的例行化演練。
另外,對于不同類型或規(guī)模的網(wǎng)站,高可用并沒有具體量化的標(biāo)準(zhǔn),可以給幾個(gè)比較粗的級(jí)別供參考:最基礎(chǔ)的保證功能可用,不考慮網(wǎng)元的單點(diǎn)問題。要求再高一點(diǎn),考慮應(yīng)用服務(wù)集群化部署、DB、緩存等中間件進(jìn)行相應(yīng)的高可用部署,確保沒有基本的單點(diǎn)問題。再往上考慮多數(shù)據(jù)中心部署,解決單數(shù)據(jù)中心不可用問題。最后是考慮異地多活或容災(zāi),應(yīng)對某一地理區(qū)域?yàn)?zāi)難的場景。
除了以上傳統(tǒng)套路外,隨著越來越多的企業(yè)都在上云,還要考慮單個(gè)云廠商基礎(chǔ)設(shè)施發(fā)生整體故障時(shí)如何快速替換及逃生的問題,例如CDN,DNS等,這些都是網(wǎng)站訪問基礎(chǔ)場景要重點(diǎn)考慮的故障點(diǎn)。
關(guān)注@華為云,了解更多資訊
.使用Jquery實(shí)現(xiàn)跳轉(zhuǎn)
$(location).attr('href',"http://www.google.com"); $jq(window).attr("location","http://www.google.com"); $(location).prop('href',"http://www.google.com");
2.使用JavaScript實(shí)現(xiàn)跳轉(zhuǎn)
// 相當(dāng)于 HTTP redirect window.location.replace("http://stackoverflow.com"); // 相當(dāng)于 clicking on a link window.location.;
JavaScript其它的可實(shí)現(xiàn)頁面跳轉(zhuǎn)的方式
window.history.back(-1); window.navigate("top.jsp"); //old-ie-only self.location = 'top.jsp'; top.location = 'top.jsp'; window.location=window.locaiton.host; winodw.locaiton.assign('http://www.baidu.com'); ducument.location.href='/path'; window.history.go(-1);
3.頁面跳轉(zhuǎn)路徑錯(cuò)誤問題
ie8以下的頁面跳轉(zhuǎn)需要使用絕對路徑,使用相對路徑的時(shí)候ie會(huì)自動(dòng)網(wǎng)跳轉(zhuǎn)的Url上面加上當(dāng)前頁面的路徑,這會(huì)導(dǎo)致跳轉(zhuǎn)錯(cuò)誤。 下面是解決辦法:
使用Xbuilder打包應(yīng)用程序時(shí),可能會(huì)出現(xiàn)頁面無法正確跳轉(zhuǎn)的問題。這種問題可能是由于文件路徑、HTML文件中的鏈接或JavaScript代碼中的鏈接不正確、打包應(yīng)用程序時(shí)未正確指定應(yīng)用程序的根目錄或服務(wù)器環(huán)境未正確配置等原因?qū)е碌摹R鉀Q此問題,可以嘗試執(zhí)行以下步驟:清除瀏覽器緩存并重新加載頁面、檢查代碼是否存在語法錯(cuò)誤或邏輯問題、確保服務(wù)器已正確配置。
排查在應(yīng)用程序中存在一些路徑問題。確保您在打包應(yīng)用程序時(shí)已正確地指定了文件路徑和目錄結(jié)構(gòu)。
您還可以檢查以下幾點(diǎn),以確定為什么頁面無法正確跳轉(zhuǎn):
1、檢查您的HTML文件中的鏈接是否正確。請確保鏈接的路徑是正確的,并且與打包后的文件路徑匹配。
2、檢查您的JavaScript代碼中的鏈接是否正確。如果您使用了JavaScript進(jìn)行頁面跳轉(zhuǎn),則請確保鏈接的路徑正確,并且與打包后的文件路徑匹配。
3、確保您在打包應(yīng)用程序時(shí)已正確地指定了應(yīng)用程序的根目錄。如果您在打包應(yīng)用程序時(shí)未正確指定根目錄,則可能導(dǎo)致頁面無法正確跳轉(zhuǎn)。
4、確保您在使用服務(wù)器環(huán)境時(shí)已正確地配置服務(wù)器。如果您使用了服務(wù)器環(huán)境來運(yùn)行應(yīng)用程序,則需要確保服務(wù)器已正確地配置,并且可以正確地解析頁面中的鏈接。
5清除瀏覽器緩存。有時(shí),瀏覽器會(huì)緩存舊版本的文件,導(dǎo)致頁面無法正確跳轉(zhuǎn)。在清除緩存后,重新加載頁面,以查看是否已經(jīng)解決問題。
6確保您的代碼沒有任何語法錯(cuò)誤或邏輯問題。有時(shí),代碼中存在語法錯(cuò)誤或邏輯問題可能導(dǎo)致頁面無法正確跳轉(zhuǎn)。您可以使用調(diào)試工具(如Chrome瀏覽器的開發(fā)者工具)來檢查代碼是否存在錯(cuò)誤。
7確保您的應(yīng)用程序已正確地配置服務(wù)器。如果您在使用服務(wù)器環(huán)境來運(yùn)行應(yīng)用程序,則需要確保服務(wù)器已正確地配置,并且可以正確地解析頁面中的鏈接。您可以查看服務(wù)器日志來查看是否有任何錯(cuò)誤信息。
8如果您使用了框架或庫,例如React或Angular,則可能需要檢查是否已正確地配置路由。路由是一種管理應(yīng)用程序中URL的方式,它可以幫助您管理頁面之間的跳轉(zhuǎn)。
還可以嘗試使用瀏覽器的開發(fā)者工具來檢查頁面的網(wǎng)絡(luò)請求和響應(yīng)。這可以幫助您確定頁面是否成功加載,并且是否存在任何錯(cuò)誤或問題。
在開發(fā)者工具中,您可以查看網(wǎng)絡(luò)選項(xiàng)卡,以查看頁面加載時(shí)發(fā)送的所有請求和響應(yīng)。您可以檢查響應(yīng)代碼,以查看是否存在任何錯(cuò)誤或問題。您還可以檢查響應(yīng)標(biāo)頭,以查看是否存在任何緩存控制或重定向信息。
您可以嘗試使用其他工具或服務(wù)來打包您的應(yīng)用程序,以查看是否存在任何差異。例如,您可以嘗試使用Webpack或Parcel來打包您的應(yīng)用程序,以查看是否存在任何問題。如果使用其他工具或服務(wù)成功打包應(yīng)用程序,則可能存在與Xbuilder配置相關(guān)的問題。
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。