導語 | 本文從研發(fā)規(guī)范層面、應用服務層面、存儲層面、產(chǎn)品層面、運維部署層面、異常應急層面這六大層面去剖析一個高可用架構和系統(tǒng)需要有哪些關鍵的設計和考慮。
10年積累的成都網(wǎng)站設計、成都網(wǎng)站制作經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先網(wǎng)站制作后付款的網(wǎng)站建設流程,更有尖山免費網(wǎng)站建設讓你可以放心的選擇與我們合作。一、高可用系統(tǒng)架構設計思想 1-1、可用性和高可用概念可用性是一個可以量化的指標,計算的公式在維基百科中是這樣描述的:根據(jù)系統(tǒng)損害、無法使用的時間,以及由無法運作恢復到可運作狀況的時間,與系統(tǒng)總運作時間的比較。行業(yè)內(nèi)一般用幾個9表示可用性指標,對應用的可用性程度一般衡量標準有三個9到五個9;一般我們的系統(tǒng)至少要到 4 個 9(99.99%)的可用性才能談得上高可用。
高可用(High Availability)的定義:(From 維基百科)是 IT 術語,指系統(tǒng)無中斷地執(zhí)行其功能的能力,代表系統(tǒng)的可用性程度,是進行系統(tǒng)設計時的準則之一。服務不可能 100% 可用,因此要提高我們的高可用設計,就要盡大可能的去增加我們服務的可用性,提高可用性指標。一句話來表述就是:高可用就是讓我們的服務在任何情況下都盡大可能能夠?qū)ν馓峁┓铡?/p>1-2、高可用系統(tǒng)設計思想
高可用系統(tǒng)的設計,需要有一套比較科學的工程管理套路,要從產(chǎn)品、開發(fā)、運維、基建等全方位去考量和設計,高可用系統(tǒng)的設計思想包括但不限于:
研發(fā)規(guī)范層面這個是大家容易忽視的一個點,但是,我們所有的設計,都是研發(fā)人員來完成的,包括從設計文檔到編碼到發(fā)布上線,因此,研發(fā)層面也是有一個規(guī)范流程和套路,來讓我們更好的去研發(fā)和維護一個高可用的系統(tǒng):
容量評估,是指我們需要評估好,我們這個系統(tǒng),是為了應對一個什么體量的業(yè)務,這個業(yè)務請求量的平均值、高峰的峰值大概都在一個什么級別。如果是新系統(tǒng),那么就需要根據(jù)產(chǎn)品和運營同學對業(yè)務有一個大體的預估,然后開發(fā)同學根據(jù)產(chǎn)品給的數(shù)據(jù)再進行詳細的評估。如果是老系統(tǒng),那么就可以根據(jù)歷史數(shù)據(jù)來評估。評估的時候,要從一個整體角度來看全局的量級,然后再細化到每個子業(yè)務模塊要承載的量級。
資料領取直通車:大廠面試題錦集+視頻教程
Linux服務器學習網(wǎng)站:C/C++Linux服務器開發(fā)/后臺架構師
容量規(guī)劃,是指我們系統(tǒng)在設計的時候,就要能夠初步規(guī)劃好我們的系統(tǒng)大致能夠抗多少的量級,比如是十萬還是百萬級別的請求量,或者更多。不同的量級對應的系統(tǒng)架構的設計會完全不一樣,尤其到了千萬、億級別的量級的時候,架構的設計會有很多的考量。當然這里需要注意的是,我們不需要一上來就設計出遠超于我們當前業(yè)務真實流量的系統(tǒng),要根據(jù)業(yè)務實際情況來設計。同時,容量規(guī)劃還涉及到,我們系統(tǒng)上下游的各個模塊、依賴的存儲、依賴的三方服務,分別需要多少資源,需要有一個相對可以量化的數(shù)據(jù)出來。容量規(guī)劃階段,更多是要依靠自身和團隊的經(jīng)驗,比如要了解我們的 log 的性能、redis 的性能、rpc 接口的性能、服務化框架的性能等等,然后根據(jù)各種組件的性能來綜合評估自己設計的系統(tǒng)的整體性能情況。
容量評估和容量規(guī)劃之后,我們還需要做一件事情,就是性能壓測,最好是能夠做到全鏈路壓測。性能壓測的目的是為了確保你的容量規(guī)劃是準確的,比如我設計的這個系統(tǒng),我規(guī)劃的是能夠抗千萬級別的請求,那么實際上,真的能夠抗住嗎 ?這個在上線之前,首先要根據(jù)經(jīng)驗來判斷,然后是一定要經(jīng)過性能壓測得出準確結論的。性能壓測要關注的指標很多,但是重點要關注是兩個指標,一個是 QPS、一個是響應耗時,要確保壓測的結果符合預期。壓測的步驟可以先分模塊單獨壓測,最后如果情況允許,那么最好執(zhí)行全鏈路壓測。
QPS 預估(漏斗型)QPS 預估(漏斗型),指的是一個真實的請求過來后,從接入層開始,分別經(jīng)過了我們整個系統(tǒng)的哪些層級、哪些模塊,然后每一個層級的 QPS 的量級分別有多少,從請求鏈路上來看,層級越往下,那么下游層級的量級應該會逐步減少的,因為每經(jīng)過一個層級,都有可能會被各種條件過濾掉的一部分請求。比如說進入活動頁后查看商品詳情然后下單這個例子,首先進入活動頁,所有的請求都會進入訪問;然后只會有部分用戶查詢商品詳情;最后查看商品詳情的這些用戶又只會有部分用戶會下單,因此這里就會有一個漏斗,從上層模塊到下層模塊的量級一定是逐步減少的。
QPS 預估(漏斗型)就是需要我們按照請求的層面和模塊來構建我們的預估漏斗模型,然后預估好每一個層級的量級,包括但不限于從服務、接口、分布式緩存等各個層面來預估,最后構成我們完整的 QPS 漏斗模型。
三、應用服務層面 無狀態(tài)和負載均衡設計一般要做到系統(tǒng)的高可用,我們的應用服務的常規(guī)設計都是無狀態(tài)的,這也就意味著,我們可以部署多個實例來提高我們系統(tǒng)的可用性,而這多個實例之間的流量分配,就需要依賴我們的負載均衡能力。無狀態(tài) + 負載均衡 既可以讓我們的系統(tǒng)提高并發(fā)能力,也可以提高我們系統(tǒng)的可用性。
如果我們的業(yè)務服務使用的是各種微服務框架來開發(fā)的,那么大概率在這個微服務框架里面就會包含了服務發(fā)現(xiàn)和負載均衡的能力。這是一整套流程,包括服務注冊和發(fā)現(xiàn)、負載均衡、健康狀態(tài)檢查和自動剔除。當我們的任何一個服務實例出現(xiàn)故障后會被自動剔除掉,當我們有新增一個服務實例后會自動添加進來提供服務。
如果我們不是使用的微服務框架來開發(fā)的,那么就需要依賴負載均衡的代理服務,比如 LVS、Nginx 來幫我們實現(xiàn)負載均衡。
彈性擴縮容設計彈性擴縮容設計是應對突峰流量的非常有效的手段之一,同時也是保障我們服務可用性的必要手段。彈性擴縮容針對的是我們的無狀態(tài)的應用服務而言的,因為服務是無狀態(tài)的,因此可以隨時根據(jù)請求量的大小來進行擴縮容,流量大就擴容來應對大量請求,流量小的時候就縮容減少資源占用。
怎么實現(xiàn)彈性擴縮容呢?現(xiàn)階段都是云原生時代,大部分的公司都是采用容器化(K8s)部署,那么基于這個情況的話,彈性擴縮容就非常容易了,只需要配置好 K8s 的彈性條件就能自動根據(jù) CPU 的使用率來實現(xiàn)。
如果不是容器化部署,是物理機部署的方式,那么要做到彈性擴縮容,必須要有一個公司內(nèi)部的基礎建設能力,能夠在運營平臺上針對服務的 CPU 或者 QPS 進行監(jiān)控,如果超過一定的比例就自動擴縮容,和 K8s 的彈性原理是一樣的,只是需要自行實現(xiàn)。
異步解耦和削峰設計(消息隊列)要想我們的系統(tǒng)能夠高可用,那么從架構層面來說,要做到分層、分模塊來設計,而分層分模塊之后,那么各個模塊之間,還可以進行異步處理、解耦處理。目的是為了不相互影響,通過異步和解耦可以使我們的架構大大的提升可用性。
架構層面的異步解耦的方式就是采用消息隊列(比如常見的 Kafka),并且同時消息隊列還有削峰的作用,這兩者都可以提高我們的架構可用性:
任何服務,一定會存在失敗的情況,不可能有 100% 的可用,服務在線上運行過程中,總會遇到各種各樣意想不到的問題會讓你的服務出現(xiàn)狀況,因此業(yè)界來評價可用性 SLA 都是說多少個 9,比如 4 個 9(99.99%)的可用性。
為此,我們的設計建議遵循"design for failure"的設計原則,設計出一套可容錯的系統(tǒng),需要做到盡早返回、自動修復,細節(jié)如下
系統(tǒng)無法高可用的一個重要原因就在于,我們的系統(tǒng)經(jīng)常會有突發(fā)的流量過來,導致我們的服務超載運行,這個時候,首先要做的當然是快速擴容,并且我們事先就要預留好一定的冗余。另外一個情況下,就算我們擴容了,但是還是會超載,比如超過了下游依賴的存儲的大容量、或者超過了下游依賴的三方服務的大容量。那么這個時候,我們就需要執(zhí)行我們的過載保護策略了,主要包括限流、熔斷、降級,過載保護是為了保證服務部分可用從而不至于整個服務完全不可用。
在當前的互聯(lián)網(wǎng)時代,應用服務基本都是無狀態(tài)的,因此應用服務的高可用相對會比較簡單,但是對于數(shù)據(jù)存儲的高可用,相對來說,會復雜很多,因為數(shù)據(jù)是有狀態(tài)的,那具體我們要怎么保障數(shù)據(jù)存儲的高可用,我們來分析下。
存儲層面的高可用方案的本質(zhì)都是通過通過數(shù)據(jù)冗余的方式來實現(xiàn)高可用,將數(shù)據(jù)復制到多個存儲介質(zhì)里面,可以有效的避免數(shù)據(jù)丟失,同時還可以提高并發(fā)能力,因為數(shù)據(jù)是有狀態(tài)的,因此,這里會比服務的高可用要復雜很多,主要體現(xiàn)在如下幾個方面
常見的解決存儲高可用的方案有兩種:集群存儲和分布式存儲。業(yè)界大多是圍繞這些來構建,或者是做相關衍生和擴展。
集群存儲(集中式存儲)集群就是邏輯上處理同一任務的機器集合,可以屬于同一機房,也可分屬不同的機房。集群存儲,就是把多臺機器上的存儲數(shù)據(jù)組合在一起對外形成一套統(tǒng)一的系統(tǒng)。集群存儲適合業(yè)務存儲量規(guī)模一般的場景,常規(guī)的業(yè)務數(shù)據(jù)存儲一般都是集群存儲方式就足夠了?,F(xiàn)在我們一般對于業(yè)務數(shù)據(jù)存儲的使用,默認都是集群方式,比如 Redis、MySQL 等存儲類型,一般中大型互聯(lián)網(wǎng)公司,默認肯定都是集群存儲的方式。
集群存儲就是我們常說的 1 主多備或者 1 主多從的架構,寫數(shù)據(jù)通過主機,讀數(shù)據(jù)一般通過從機。集群存儲主要需要考慮如下幾個問題:
主備復制是最常見也是最簡單的一種存儲高可用方案,幾乎所有的存儲系統(tǒng)都提供了主備復制的功能,例如 MySQL、Redis、MongoDB 等。
主備架構中的“備機”主要還是起到一個備份作用,并不承擔實際的業(yè)務讀寫操作,如果要把備機改為主機,需要人工操作。因此一般使用場景都是在一些內(nèi)部的后臺管理系統(tǒng)中使用。
2,主從復制主從復制和主備復制雖然只有一字之差,但是兩者是不一樣的設計思路,“從”意思是“隨從、仆從”,“備”的意思是備份?!睆摹?的機制是要干活的,因此是承擔數(shù)據(jù)的“讀”操作的,一般就是主機負責讀寫操作,從機只負責讀操作,不負責寫操作。
3,主從切換主備復制和主從復制方案存在兩個共性的問題:
主從切換(主備切換)就是為了解決這兩個問題而產(chǎn)生的,具體的設計就是在原有方案的基礎上增加“自動切換”的能力,當主機異常后,經(jīng)過系統(tǒng)檢測并且自動將備機或者從機切換為主機。這個是實際應用中比較多的一個方案之一,因為我們一定能夠有機制保證主機異常后從機能夠自動切換為主機。
4,主主復制主主復制指的是兩臺機器都是主機,互相將數(shù)據(jù)復制給對方,客戶端可以任意挑選其中一臺機器進行讀寫操作,如果采取主主復制架構,必須保證數(shù)據(jù)能夠雙向復制。這個相對來說,要求較高。
分布式存儲集群指的是將幾臺服務器集中在一起,實現(xiàn)同一業(yè)務。而分布式是指將不同的業(yè)務分布在不同的地方,分布式中的每一個節(jié)點,都可以做集群。
分布式存儲就是通過網(wǎng)絡使用企業(yè)中的每臺機器上的磁盤空間,并將這些分散的存儲資源構成一個虛擬的存儲設備,數(shù)據(jù)分散的存儲在企業(yè)的各個角落。分布式存儲中的每臺服務器都可以處理讀寫請求,因此不存在集中式存儲中負責寫的主機那樣的角色。但在分布式存儲中,必須有一個角色來負責執(zhí)行數(shù)據(jù)分配算法,這個角色可以是獨立的一臺服務器,也可以是集群自己選舉出的一臺服務器。分布式存儲適合非常大規(guī)模的數(shù)據(jù)存儲,業(yè)務數(shù)據(jù)量巨大的場景可以采用這種方式。常見的分布式存儲比如 Hadoop(HDFS)、HBase、Elasticsearch 等。
五、產(chǎn)品層面產(chǎn)品層面的高可用架構解決方案,基本上就是指我們的兜底產(chǎn)品策略。降級/限流的策略,更多的是從后端的業(yè)務服務和架構上的設計來考慮相關解決方案。這里說的兜底策略,也可叫做柔性降級策略,更多則是通過產(chǎn)品層面上來考慮。
灰度發(fā)布、接口測試、接口撥測系列設計包括但不限于:
灰度發(fā)布和接口測試,一般在大公司里面會有相關的 DevOps 流程來保證。
開發(fā)階段-監(jiān)控告警設計監(jiān)控告警的設計,在大公司來說,根本不是問題,因為一定會有比較專門一撥人去做這種基礎能力的建設,會有對應的配套系統(tǒng),業(yè)務開發(fā)的同學只需要配置或使用即可。那如果說公司內(nèi)部沒有相關基礎建設,那么就需要自己分別來接入對應的系統(tǒng)了。
監(jiān)控系統(tǒng)一般在監(jiān)控系統(tǒng)這方面的開源解決方案包括但不限于這些:
我們會依托開源系統(tǒng)進行自建或者擴展,甚至直接使用都行,然后我們的監(jiān)控的指標一般會包括:
這些系統(tǒng)接入完了之后,還只是做到監(jiān)控和統(tǒng)計,當出現(xiàn)問題的時候,還需要進行實時告警,因此還要有一個實時告警系統(tǒng),如果沒有實時報警,系統(tǒng)運行異常后我們就無法快速感知,這樣就無法快速處理,就會給我們的業(yè)務帶來重大故障和災難。告警設計需要包括:
安全性、防攻擊設計的目的是為了防刷、防黑產(chǎn)、防黑客,避免被外部惡意攻擊,這個一般有幾個策略:
一般的高可用策略,都是針對一個機房內(nèi)來服務層面來設計的,但是如果整個機房都不可用了,比如地震、火災、光纖挖斷等。。。。那么這個情況怎么辦?這就需要我們的服務和存儲都能夠進行容災了,容災的一個常見方案就是多機房部署了。
條件不允許的情況下,我們保證多機房部署業(yè)務服務就可以了。
線上運行階段-故障演練(混沌實驗)故障演練在大公司是一個常見的手段;在業(yè)界,Netflix 早在 2010 年就構建了混沌實驗工具 Chaos Monkey,混沌實驗工程對于提升復雜分布式系統(tǒng)的健壯性和可靠性發(fā)揮了重要作用。
簡單的故障演練就是模擬機房斷電、斷網(wǎng)、服務掛掉等場景,然后看我們的整個系統(tǒng)運行是否正常。系統(tǒng)的就要參考混沌實驗工程來進行詳細的規(guī)劃和設計,這個是一個相對比較大的工程,效果挺好,但是需要有大量人力去開發(fā)這種基礎建設。
線上運行階段-接口撥測系列設計接口撥測,和巡檢類似,就是服務上線后,每隔一個固定時間(比如 5s)調(diào)用后端的各種接口,如果接口異常則進行告警
針對接口撥測,一般也會有相關配套設施來提供相關的能力去實現(xiàn),如果沒有提供,那么我們可以自己寫一個接口撥測(巡檢)的服務,定期去調(diào)用重要的接口。
七、異常應急層面前面做了這么多保障,但是終究架不住線上的各種異常情況,如果真出問題了,讓我們的服務異常,無法提供服務后,我們還需要最后一根救命稻草,那就是應急預案,將服務異常的損失降低到最小。
應急預案就是我們需要事先規(guī)劃好,我們業(yè)務系統(tǒng)在各個層級出現(xiàn)問題后,我們需要第一時間怎么恢復,制定好相關規(guī)則和流程,當出現(xiàn)異常狀況后可以按照既有的流程去執(zhí)行,這樣避免出現(xiàn)問題后手忙腳亂導致事態(tài)擴大。
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧