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