<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          高可用架構(gòu)設(shè)計之無狀態(tài)服務(wù)

          共 3445字,需瀏覽 7分鐘

           ·

          2021-03-31 14:07

          高可用架構(gòu)設(shè)計之無狀態(tài)服務(wù)

          笑談架構(gòu)設(shè)計

          事故的發(fā)生是量的積累的結(jié)果,任何事情都沒有表面看起來那么簡單,在軟件運行的過程中,隨著用戶量的增加,不考慮高可用,遲早有一天會發(fā)生故障,不得事先考慮高可用設(shè)計,而高可用是一門龐大的學(xué)問

          你想知道我在設(shè)計一個高可用系統(tǒng)會考慮哪些內(nèi)容嗎?在架構(gòu)設(shè)計的過程中

          • 考慮方案選型會帶來哪些坑,最差的情況下需要考慮故障發(fā)生的緊急解決方案
          • 需要監(jiān)控系統(tǒng),在故障發(fā)生時、發(fā)生時有所感知
          • 需要自動化恢復(fù)方案,自動化提前處理預(yù)警方案
          • 在代碼層面需要考慮處理速度、代碼性能、報錯處理
          • 還要考慮把故障降低到最?。悍?wù)降級、限流、熔斷
          • 等等

          這篇文章主要介紹無狀態(tài)服務(wù)在架構(gòu)層面,如何保證可高用

          ★ 

          無狀態(tài)服務(wù):在任何時候服務(wù)都不存儲數(shù)據(jù)(除緩存),可以任意銷毀創(chuàng)建,用戶數(shù)據(jù)不會發(fā)生丟失,可以任意切換到任何一個副本,不影響用戶

          無狀態(tài)服務(wù)的高可用旨在任何情況下數(shù)據(jù)都不丟失,服務(wù)都不發(fā)生故障,在某些服務(wù)發(fā)生故障時保證影響最小,并可以快速恢復(fù)

          可以從這幾個方面考慮

          • 冗余部署:至少多部署一個節(jié)點,避免單點問題
          • 垂直擴展:增加單機性能
          • 水平擴展:流量激增可快速擴容

          冗余部署

          在單點架構(gòu)中,隨著數(shù)據(jù)數(shù)據(jù)量增加,單點負載壓力過大,容易產(chǎn)生服務(wù)崩潰不可用的情形,對于無狀態(tài)服務(wù),可以考慮部署多個節(jié)點的服務(wù)來分散壓力

          對于如何調(diào)度來臨的請求,可以參考負載均衡的方式,盡可能的保證充分的利用服務(wù)器的資源

          • 無狀態(tài)服務(wù):不需要存儲數(shù)據(jù)的服務(wù),即使節(jié)點掛掉再重啟,不會發(fā)生數(shù)據(jù)丟失
          • 負載均衡:把大量請求分散到不同節(jié)點上的一種算法

          無狀態(tài)服務(wù)的負載均衡

          可以使用負載均衡中提供的四種算法

          • 隨機均衡算法:已知后端服務(wù)器列表,隨機請求,數(shù)據(jù)量越大越趨近于均衡
          • 輪詢算法:輪流請求后端服務(wù)器

          前兩種算法存在的問題是后端服務(wù)器在負載壓力不同或服務(wù)器配置不同時,不能保證壓力小的多分配,壓力大的小分配,于是引入

          • 加權(quán)輪循算法:按照后端服務(wù)器的抗壓能力,負載情況分配更高的權(quán)重,更容易命中,減少宕機風(fēng)險,按權(quán)重順序的分配到后端服務(wù)器上
          • 加權(quán)隨機法:和加權(quán)輪訓(xùn)算法一樣,不同的是分配是按權(quán)重隨機的,比如有多臺權(quán)重一致的情況,隨機訪問,那就和隨機算法有同樣的問題,數(shù)據(jù)量大時才趨近于均衡,數(shù)據(jù)量小時有可能重復(fù)訪問同一臺權(quán)重一致的機器
          • [加權(quán)]最小連接數(shù)算法:這是最智能的一種算法,根據(jù)服務(wù)器當(dāng)前的連接數(shù)來選取,更容易命中處理速度快的服務(wù)器

          上面的算法使用于無狀態(tài)應(yīng)用,假如要保存通信狀態(tài),需要使用

          • 源地址哈希算法:對源地址做hash,可以保證相同的請求最終都是落在同一臺機器上,不需要重復(fù)建立連接

          負載均衡算法如何選擇?

          首先拋棄隨機算法,最簡單的配置可以使用基本的輪訓(xùn)算法,它適用于服務(wù)器配置一致,比如使用虛擬機,可以動態(tài)調(diào)整服務(wù)器配置的場景,同時要保證專用虛擬機,上面不會部署其他應(yīng)用的情況

          但是服務(wù)器上往往會安裝多個應(yīng)用,那就要考慮在加權(quán)輪訓(xùn)最小連接數(shù)中做選擇

          加權(quán)輪訓(xùn)適用于短連接場景,比如HTTP服務(wù),在k8s中因為每個pod都是獨立的,默認(rèn)service策略是非加權(quán)輪訓(xùn)

          • 最小連接數(shù)適用于長連接,比如FTP等

          如果系統(tǒng)架構(gòu)中考慮到無cookie功能的場景,可以用源地址hash算法,把源IP一直映射到同一臺rs上,在k8s中叫會話保持模式,每次轉(zhuǎn)發(fā)到同一個pod上

          建議:

          • 如果上了容器直接交給k8s來做調(diào)度,使用cookie做會話保持,算法使用默認(rèn)輪訓(xùn),具體調(diào)度未來k8s文章里會做詳細介紹
          • 使用長連接的應(yīng)用(FTP、socket,或者用于下載連接),選擇加權(quán)最小連接數(shù)
          • 短連接應(yīng)用(靜態(tài)網(wǎng)站、微服務(wù)組件等),選擇加權(quán)輪訓(xùn),用cookie來做會話保持,減少session的設(shè)計,不僅會提高代碼復(fù)雜度,也會增加服務(wù)端負載情況,不利于分布式應(yīng)用

          高并發(fā)應(yīng)用的識別

          主要指標(biāo)QPS每秒處理響應(yīng)數(shù),比如每天有10w的pv

          公式 (100000 * 80%) / (86400*20%) = 4.62 QPS(峰值QPS)

          公式原理:每天80%的訪問集中在20%的時間里,這20%時間叫做峰值時間。

          比如我做的系統(tǒng)托管了最高5w臺機器,每臺機器每次分鐘有一次PV,時間比較均勻那就是

          ((60*24)*50000)/(86400)=833 QPS

          一般上百的量級就可以叫高并發(fā)了,網(wǎng)上查到的資料微博每天1億多pv的系統(tǒng)一般也就1500QPS,5000QPS峰值。

          除了QPS還有服務(wù)響應(yīng)時間、并發(fā)用戶數(shù)指標(biāo)可以參考

          在服務(wù)器負載高的時候,表現(xiàn)在處理速度變慢、網(wǎng)絡(luò)斷連、服務(wù)處理失敗、異常報錯等問題,具體問題要具體分析,不可一概而論

          可以通過監(jiān)控,來獲得服務(wù)器性能狀態(tài),動態(tài)調(diào)整、重試,達到服務(wù)可用性的保證,減少維護成本,通常單純服務(wù)器壓力大的時候可以考慮垂直擴展

          垂直擴展

          垂直擴展是增加服務(wù)器單機的處理能力,主要有三種方式

          • 服務(wù)器升配:集中在CPU、內(nèi)存、swap、磁盤容量或者網(wǎng)卡等
          • 硬件性能:磁盤SSD、調(diào)整系統(tǒng)參數(shù)等
          • 架構(gòu)調(diào)整:軟件層面使用異步、緩存、無鎖結(jié)構(gòu)等

          增強單機性能的方式是最快最容易的方式,但是單機性能之中是存在極限,同時單機部署時如果產(chǎn)生故障,對應(yīng)用來說打擊是致命的,我們應(yīng)該保證應(yīng)用時刻處于可用的狀態(tài),也就是俗話說的保證5個9的可靠性

          水平自動伸縮

          知道了單機的局限以后,考慮使用水平伸縮的方式

          水平伸縮就是壓力增加的時候,增加新的節(jié)點來分擔(dān)壓力,但僅僅多點部署還是不夠的,對于持續(xù)增長的業(yè)務(wù),始終有一天會突破服務(wù)的壓力上限,如果遇到流量激增的場景,人工應(yīng)對肯定會措手不及,所以需要一種自動伸縮的手段

          • 對于私有云部署來說可以手動實現(xiàn)調(diào)度器,檢測系統(tǒng)狀態(tài),連通iaas層實現(xiàn)伸縮
          • 也可以直接使用云服務(wù)器提供的彈性伸縮服務(wù)
          • 對于容器而言,可以在iaas層彈性伸縮的情況下或者有充足node節(jié)點的情況下,配置自動伸縮和調(diào)度的策略,預(yù)防單機故障
          ★ 

          名詞解釋:iaas 基礎(chǔ)設(shè)施即服務(wù),代表對服務(wù)器、存儲、網(wǎng)絡(luò)等硬件資源管理的服務(wù)

          注意:彈性伸縮針對的業(yè)務(wù)場景是無狀態(tài)服務(wù)

          另外無狀態(tài)機器不足以承載請求流量,需要進行水平擴展的閾值一般QPS是千級,同時在這里對數(shù)據(jù)庫也會有壓力,所以建議水平伸縮的服務(wù)器不要部署有狀態(tài)服務(wù)

          對于有狀態(tài)服務(wù)壓力分散在后續(xù)的文章會有所介紹

          CDN和OSS

          對于一個網(wǎng)站來說,用戶交互頁面,是一個特殊的服務(wù),包含很多靜態(tài)資源,比如圖片、視頻、頁面(html/css/js),這些資源在用戶請求的時候需要現(xiàn)場下載,下載速度決定了加載速度,在web服務(wù)故障的時候,同樣應(yīng)該對用戶做出相應(yīng)

          在這一層面可以考慮使用CDN內(nèi)容分發(fā)網(wǎng)絡(luò)的方式,詳見[xxx],把前端靜態(tài)數(shù)據(jù)緩存到邊緣服務(wù)器上

          ★ 

          名詞解釋:邊緣服務(wù)器(邊緣節(jié)點),可以理解為和用戶交互的服務(wù)器,也可理解為靠近用戶的服務(wù)器節(jié)點,因為靠近用戶,減少了網(wǎng)絡(luò)傳輸使用的時間

          使用了CDN的web服務(wù),可以把https證書綁定到cdn上,在回源策略可以配置回源超時、回源跟隨301/302狀態(tài)碼等配置,還可以智能壓縮網(wǎng)頁、自定義錯誤頁面,非常方便

          oss是一種特殊的存儲方案,以對象的形式進行存儲,理論上可以存儲無限的文件

          考慮使用oss對象存儲并結(jié)合cdn,把媒體資源存儲在對象存儲上面,也可以把冷數(shù)據(jù)壓縮歸檔到oss上

          常見的視頻網(wǎng)站大多會用到oss,微博n年以前的數(shù)據(jù)應(yīng)該就是歸檔到對象存儲中了

          總結(jié)

          本文介紹的無狀態(tài)服務(wù)常見的高可用架構(gòu)設(shè)計,他們是

          • 冗余部署

          • 負載均衡的6種算法與算法選擇

          • 垂直擴展的好處與弊端

          • 水平擴展與水平自動伸縮

          • 哪些服務(wù)可以使用CDN和OSS

          要注意無狀態(tài)應(yīng)用不應(yīng)該存儲session,也不存儲數(shù)據(jù)

          本文對負載均衡的6種算法做了介紹,但是沒有介紹每個算法具體的實現(xiàn)方式,這個留給你下來研究,這些方案在實際使用的時候會有一定難度,服務(wù)不可用的故障原因任何一門都是博大精深的學(xué)問,程序員不僅是寫代碼

          這里也僅僅寫了無狀態(tài)服務(wù)的部分高可用方案,不管是什么服務(wù)還是從代碼層級的設(shè)計,你還知道哪些呢?

          有時候比較苛刻的情況下,沒有更多的服務(wù)器資源,如何在有限服務(wù)器的情況下提高更多的代碼性能呢?

          瀏覽 42
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线观看爱爱视频 | 大香蕉大香蕉最新视频在线75 | 免费A√在线播放 | 日韩性爱无码 | 亚洲欧洲在线观看高清 |