一、分布式系統面臨的挑戰有哪些
分布式系統需要大量(liang)機器協作,面臨諸多(duo)的挑戰,其中主(zhu)要的挑戰有:
1、異構的機器與網絡
分布式系統中的(de)機器,配置不(bu)(bu)一(yi)樣,其上運行(xing)的(de)服務也可能由不(bu)(bu)同(tong)的(de)語(yu)言、架構實現,因此處理(li)能力也不(bu)(bu)一(yi)樣;節點間通過網(wang)(wang)絡(luo)連接,而(er)不(bu)(bu)同(tong)網(wang)(wang)絡(luo)運營商提供的(de)網(wang)(wang)絡(luo)的(de)帶寬、延時(shi)、丟包率又不(bu)(bu)一(yi)樣。怎么保證(zheng)大家齊(qi)頭并進(jin),共同(tong)完成目標(biao),這(zhe)是個不(bu)(bu)小(xiao)的(de)挑(tiao)戰(zhan)。
2、普遍的節點故障
雖然單個節(jie)點(dian)的(de)(de)故障概率較低(di),但節(jie)點(dian)數目達到(dao)一定規(gui)模(mo),出故障的(de)(de)概率就(jiu)變高了。分布式系(xi)統需要保(bao)證故障發(fa)生的(de)(de)時候,系(xi)統仍然是可用的(de)(de),這就(jiu)需要監控節(jie)點(dian)的(de)(de)狀(zhuang)態(tai),在節(jie)點(dian)故障的(de)(de)情況下將該節(jie)點(dian)負責的(de)(de)計算、存儲任(ren)務轉移到(dao)其他節(jie)點(dian)。
3、不可靠的網絡
節(jie)點(dian)間(jian)通(tong)(tong)過網絡(luo)(luo)(luo)(luo)通(tong)(tong)信,而網絡(luo)(luo)(luo)(luo)是(shi)不可靠(kao)的(de)。可能的(de)網絡(luo)(luo)(luo)(luo)問(wen)題(ti)包(bao)括:網絡(luo)(luo)(luo)(luo)分割、延時(shi)、丟包(bao)、亂(luan)序(xu)。相比單(dan)(dan)機過程(cheng)調用,網絡(luo)(luo)(luo)(luo)通(tong)(tong)信最(zui)讓人頭(tou)疼的(de)是(shi)超時(shi):節(jie)點(dian)A向節(jie)點(dian)B發出請(qing)求,在約定的(de)時(shi)間(jian)內沒(mei)有收到(dao)節(jie)點(dian)B的(de)響應,那(nei)么(me)B是(shi)否處(chu)理(li)了請(qing)求,這(zhe)個是(shi)不確(que)(que)定的(de),這(zhe)個不確(que)(que)定會(hui)帶來諸多問(wen)題(ti),最(zui)簡單(dan)(dan)的(de),是(shi)否要重試(shi)請(qing)求,節(jie)點(dian)B會(hui)不會(hui)多次處(chu)理(li)同(tong)一個請(qing)求。
總而言之(zhi),分布(bu)式(shi)的(de)(de)挑戰來(lai)自(zi)不(bu)確定(ding)性(xing)(xing),不(bu)確定(ding)計算機什么時候(hou)crash、斷電,不(bu)確定(ding)磁盤(pan)什么時候(hou)損壞,不(bu)確定(ding)每次網絡通(tong)(tong)信(xin)要延遲多久(jiu),也不(bu)確定(ding)通(tong)(tong)信(xin)對端是(shi)否(fou)處理了(le)發(fa)送的(de)(de)消(xiao)息(xi)。而分布(bu)式(shi)的(de)(de)規(gui)模放大(da)了(le)這個不(bu)確定(ding)性(xing)(xing),不(bu)確定(ding)性(xing)(xing)是(shi)令人討厭的(de)(de),所(suo)以有諸多的(de)(de)分布(bu)式(shi)理論、協議來(lai)保證(zheng)在這種(zhong)不(bu)確定(ding)性(xing)(xing)的(de)(de)情況下,系統還能(neng)繼(ji)續正常工作。
二、分布式系統帶來的問題及解答
1、如何找到所需的服務?——服務發現組件
問題描述:線上生產環境中(zhong),尤其容器部署情況下(xia)服務(wu)實(shi)例地(di)(di)址(服務(wu)器端口(kou))是動態(tai)分配的,服務(wu)調用者無(wu)法提前獲取服務(wu)實(shi)例地(di)(di)址和端口(kou)。
解(jie)決方案:在服務運行(xing)時,通(tong)過(guo)服務發現組(zu)件解(jie)析服務名來(lai)獲取(qu)服務實例地址和端口。
2、如何找到實例?——請求分發的策略
問題描述:找到(dao)服(fu)務(wu)器(qi)后,還應該確定將當前(qian)請求發往服(fu)務(wu)器(qi)的哪一個實例。
解決方案:
(1)如果同一個服務(wu)的實例都是(shi)完全(quan)對等的(無狀態),那么(me)按(an)負載均衡策略來處理就足夠(隨機、輪(lun)詢、權重、hash、一致性(xing)hash、fair等各種策略)。
(2)如果(guo)同一個(ge)服務的實例不是(shi)對等的(有狀態(tai)),那么(me)需要通(tong)過(guo)路由服務(元(yuan)數(shu)據服務等)先確定(ding)當(dang)前要訪問(wen)的請求數(shu)據在(zai)哪一個(ge)實例上,然(ran)后(hou)再進行(xing)訪問(wen)。
3、如何避免雪崩?
問題描述:一個故(gu)障由(you)于正反饋(kui)不斷被(bei)擴大(da),從(cong)而導致整個系(xi)統故(gu)障
解決方案:
(1)【快速失敗】和(he)【降(jiang)(jiang)級機制】:熔斷、降(jiang)(jiang)級、限流等(deng),通(tong)過快速減少系統負(fu)載(zai)來避(bi)免(mian)雪(xue)崩的發生。
(2)【彈性擴容機制】,通過快速增加系(xi)統(tong)的服務能力來避(bi)免雪崩的發生。
4、如何對系統進行監控?
問題描述:對于一個分布式系統,如(ru)果(guo)我們不能很清(qing)楚(chu)地了解內部的(de)狀態,那(nei)么高(gao)可用是沒有辦法完全保(bao)障的(de)。
解決方(fang)案(an):監控系(xi)統的各層
(1)【硬件層(ceng)面】:服務器(qi)溫度、磁盤RAID陣列等。
(2)【系統層面】:存活狀(zhuang)態、CPU、RAM、load負載。
(3)【應(ying)用層(ceng)】:mysql、Nginx、Django、LVS、HAProxy。
(4)【業(ye)務層面】:PV、UV、訂單。
5、分布式存儲如何做數據切片?
問題(ti)描述(shu):既(ji)然要實現分(fen)布式數據庫,那么應該如何將數據進行切片?
解決方案:Hash、Consistent Hash和Range Based分(fen)片(pian)策略。
6、如何設置冗余?如何復制數據?
問題描(miao)述:分布式存(cun)儲的高可用性需要(yao)冗(rong)余來(lai)保證,那么如何做冗(rong)余?如何對數(shu)據進行復制、更新時(shi)保證兩(liang)份(fen)數(shu)據的一致性?
解決方案:
(1)【中心化方案】:主從復制、一(yi)致性協議(Raft和Paxos)。
(2)【去中心化的方案】:Quorum、Vector Clock。