一,、分布式系統(tǒng)面臨的挑戰(zhàn)有哪些
分布式系統(tǒng)需要大量機(jī)器協(xié)作,面臨諸多的挑戰(zhàn),,其中主要的挑戰(zhàn)有:
1,、異構(gòu)的機(jī)器與網(wǎng)絡(luò)
分布式系統(tǒng)中的機(jī)器,配置不一樣,,其上運(yùn)行的服務(wù)也可能由不同的語(yǔ)言,、架構(gòu)實(shí)現(xiàn),因此處理能力也不一樣,;節(jié)點(diǎn)間通過(guò)網(wǎng)絡(luò)連接,,而不同網(wǎng)絡(luò)運(yùn)營(yíng)商提供的網(wǎng)絡(luò)的帶寬、延時(shí),、丟包率又不一樣,。怎么保證大家齊頭并進(jìn),共同完成目標(biāo),,這是個(gè)不小的挑戰(zhàn),。
2,、普遍的節(jié)點(diǎn)故障
雖然單個(gè)節(jié)點(diǎn)的故障概率較低,但節(jié)點(diǎn)數(shù)目達(dá)到一定規(guī)模,,出故障的概率就變高了,。分布式系統(tǒng)需要保證故障發(fā)生的時(shí)候,系統(tǒng)仍然是可用的,,這就需要監(jiān)控節(jié)點(diǎn)的狀態(tài),,在節(jié)點(diǎn)故障的情況下將該節(jié)點(diǎn)負(fù)責(zé)的計(jì)算、存儲(chǔ)任務(wù)轉(zhuǎn)移到其他節(jié)點(diǎn),。
3,、不可靠的網(wǎng)絡(luò)
節(jié)點(diǎn)間通過(guò)網(wǎng)絡(luò)通信,而網(wǎng)絡(luò)是不可靠的,??赡艿木W(wǎng)絡(luò)問題包括:網(wǎng)絡(luò)分割、延時(shí),、丟包,、亂序。相比單機(jī)過(guò)程調(diào)用,,網(wǎng)絡(luò)通信最讓人頭疼的是超時(shí):節(jié)點(diǎn)A向節(jié)點(diǎn)B發(fā)出請(qǐng)求,,在約定的時(shí)間內(nèi)沒有收到節(jié)點(diǎn)B的響應(yīng),那么B是否處理了請(qǐng)求,,這個(gè)是不確定的,,這個(gè)不確定會(huì)帶來(lái)諸多問題,最簡(jiǎn)單的,,是否要重試請(qǐng)求,,節(jié)點(diǎn)B會(huì)不會(huì)多次處理同一個(gè)請(qǐng)求。
總而言之,,分布式的挑戰(zhàn)來(lái)自不確定性,,不確定計(jì)算機(jī)什么時(shí)候crash、斷電,,不確定磁盤什么時(shí)候損壞,不確定每次網(wǎng)絡(luò)通信要延遲多久,,也不確定通信對(duì)端是否處理了發(fā)送的消息,。而分布式的規(guī)模放大了這個(gè)不確定性,不確定性是令人討厭的,,所以有諸多的分布式理論,、協(xié)議來(lái)保證在這種不確定性的情況下,系統(tǒng)還能繼續(xù)正常工作,。
二,、分布式系統(tǒng)帶來(lái)的問題及解答
1,、如何找到所需的服務(wù)?——服務(wù)發(fā)現(xiàn)組件
問題描述:線上生產(chǎn)環(huán)境中,,尤其容器部署情況下服務(wù)實(shí)例地址(服務(wù)器端口)是動(dòng)態(tài)分配的,,服務(wù)調(diào)用者無(wú)法提前獲取服務(wù)實(shí)例地址和端口。
解決方案:在服務(wù)運(yùn)行時(shí),,通過(guò)服務(wù)發(fā)現(xiàn)組件解析服務(wù)名來(lái)獲取服務(wù)實(shí)例地址和端口,。
2、如何找到實(shí)例,?——請(qǐng)求分發(fā)的策略
問題描述:找到服務(wù)器后,,還應(yīng)該確定將當(dāng)前請(qǐng)求發(fā)往服務(wù)器的哪一個(gè)實(shí)例。
解決方案:
(1)如果同一個(gè)服務(wù)的實(shí)例都是完全對(duì)等的(無(wú)狀態(tài)),,那么按負(fù)載均衡策略來(lái)處理就足夠(隨機(jī),、輪詢、權(quán)重,、hash,、一致性hash、fair等各種策略),。
(2)如果同一個(gè)服務(wù)的實(shí)例不是對(duì)等的(有狀態(tài)),,那么需要通過(guò)路由服務(wù)(元數(shù)據(jù)服務(wù)等)先確定當(dāng)前要訪問的請(qǐng)求數(shù)據(jù)在哪一個(gè)實(shí)例上,然后再進(jìn)行訪問,。
3,、如何避免雪崩?
問題描述:一個(gè)故障由于正反饋不斷被擴(kuò)大,,從而導(dǎo)致整個(gè)系統(tǒng)故障
解決方案:
(1)【快速失敗】和【降級(jí)機(jī)制】:熔斷,、降級(jí)、限流等,,通過(guò)快速減少系統(tǒng)負(fù)載來(lái)避免雪崩的發(fā)生,。
(2)【彈性擴(kuò)容機(jī)制】,通過(guò)快速增加系統(tǒng)的服務(wù)能力來(lái)避免雪崩的發(fā)生,。
4,、如何對(duì)系統(tǒng)進(jìn)行監(jiān)控?
問題描述:對(duì)于一個(gè)分布式系統(tǒng),,如果我們不能很清楚地了解內(nèi)部的狀態(tài),,那么高可用是沒有辦法完全保障的。
解決方案:監(jiān)控系統(tǒng)的各層
(1)【硬件層面】:服務(wù)器溫度,、磁盤RAID陣列等,。
(2)【系統(tǒng)層面】:存活狀態(tài)、CPU,、RAM,、load負(fù)載,。
(3)【應(yīng)用層】:mysql、Nginx,、Django,、LVS、HAProxy,。
(4)【業(yè)務(wù)層面】:PV,、UV、訂單,。
5,、分布式存儲(chǔ)如何做數(shù)據(jù)切片?
問題描述:既然要實(shí)現(xiàn)分布式數(shù)據(jù)庫(kù),,那么應(yīng)該如何將數(shù)據(jù)進(jìn)行切片,?
解決方案:Hash、Consistent Hash和Range Based分片策略,。
6,、如何設(shè)置冗余?如何復(fù)制數(shù)據(jù),?
問題描述:分布式存儲(chǔ)的高可用性需要冗余來(lái)保證,,那么如何做冗余?如何對(duì)數(shù)據(jù)進(jìn)行復(fù)制,、更新時(shí)保證兩份數(shù)據(jù)的一致性,?
解決方案:
(1)【中心化方案】:主從復(fù)制、一致性協(xié)議(Raft和Paxos),。
(2)【去中心化的方案】:Quorum,、Vector Clock。