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