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