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