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