分布式领域架构师要掌握的技术
分布式系統(tǒng)無(wú)疑是持久的熱門(mén)話(huà)題,但其實(shí)如果不是一定有必要,強(qiáng)烈建議不要進(jìn)入分布式領(lǐng)域,在集中式的情況下很多問(wèn)題都會(huì)簡(jiǎn)單不少,技術(shù)人員千萬(wàn)不要因?yàn)橥饨缁馃岬睦缥⒎?wù),就把自己的產(chǎn)品的也去做改造,一定要仔細(xì)判斷是否有必要,不要為了技術(shù)而技術(shù),那么在必須分布式的情況下(訪(fǎng)問(wèn)量、存儲(chǔ)量或開(kāi)發(fā)人數(shù)),一個(gè)分布式領(lǐng)域的合格的架構(gòu)師要掌握哪些技術(shù)呢,這篇文章就聊聊這個(gè)話(huà)題。
簡(jiǎn)單重復(fù)下我對(duì)架構(gòu)師的標(biāo)準(zhǔn),一個(gè)架構(gòu)師最重要的不是畫(huà)幾個(gè)框,連幾條線(xiàn)(這是基本要求),而是控制技術(shù)風(fēng)險(xiǎn),要控制技術(shù)風(fēng)險(xiǎn)顯然不是看幾個(gè)結(jié)構(gòu)性的ppt就能學(xué)會(huì)的。
?
通信
既然是分布式系統(tǒng),系統(tǒng)間通信的技術(shù)就不可避免的要掌握。
首先要掌握一些基礎(chǔ)知識(shí),例如網(wǎng)絡(luò)通信協(xié)議(諸如TCP/UDP等等)、網(wǎng)絡(luò)IO(Blocking-IO,NonBlocking-IO、Asyn-IO)、網(wǎng)卡(多隊(duì)列等);更偏應(yīng)用的層面,需要了解例如連接復(fù)用、序列化/反序列化、RPC、負(fù)載均衡等。
學(xué)了這些基本知識(shí)后,基本上可以寫(xiě)一個(gè)簡(jiǎn)單的分布式系統(tǒng)里的通信模塊,但這其實(shí)遠(yuǎn)遠(yuǎn)不夠,既然進(jìn)入了分布式領(lǐng)域,對(duì)規(guī)模其實(shí)就已經(jīng)有了不低的要求,通常也就意味著需要的是能支持大量連接、高并發(fā)、低資源消耗的通信程序。
大量的連接通常會(huì)有兩種方式:
1. 大量client連一個(gè)server
? ?在現(xiàn)如今NonBlocking-IO這么成熟的情況下,一個(gè)支持大量client的server已經(jīng)不那么難寫(xiě)了,但在大規(guī)模,并且通常長(zhǎng)連接的情況下,有一個(gè)點(diǎn)要特別注意,就是當(dāng)server掛掉的時(shí)候,不能出現(xiàn)所有client都在一個(gè)時(shí)間點(diǎn)發(fā)起重連,那樣基本就是災(zāi)難,在沒(méi)有經(jīng)驗(yàn)的情況下我看過(guò)好幾起類(lèi)似的case,到client規(guī)模上去后,server一重啟基本就直接被沖進(jìn)來(lái)的大量建連沖垮了(當(dāng)然,server的backlog隊(duì)列首先應(yīng)該稍微設(shè)置大一些),通常可以采用的方法是client重連前都做隨機(jī)時(shí)間的sleep,另外就是重連的間隔采取避讓算法。
2. 一個(gè)client連大量的server
? ?有些場(chǎng)景也會(huì)出現(xiàn)需要連大量server的現(xiàn)象,在這種情況下,同樣要注意的也是不要并發(fā)同時(shí)去建所有的連接,而是在能力范圍內(nèi)分批去建。
? ?除了建連接外,另外還要注意的地方是并發(fā)發(fā)送請(qǐng)求也同樣,一定要做好限流,否則很容易會(huì)因?yàn)橐恍c(diǎn)慢導(dǎo)致內(nèi)存爆掉。
?
這些問(wèn)題在技術(shù)風(fēng)險(xiǎn)上得考慮進(jìn)去,并在設(shè)計(jì)和代碼實(shí)現(xiàn)上體現(xiàn),否則一旦隨著規(guī)模上去了,問(wèn)題一時(shí)半會(huì)還真不太好解。
高并發(fā)這個(gè)點(diǎn)需要掌握CAS、常見(jiàn)的lock-free算法、讀寫(xiě)鎖、線(xiàn)程相關(guān)知識(shí)(例如線(xiàn)程交互、線(xiàn)程池)等,通信層面的高并發(fā)在NonBlocking-IO的情況下,最重要的是要注意在整體設(shè)計(jì)和代碼實(shí)現(xiàn)上盡量減少對(duì)io線(xiàn)程池的時(shí)間占用。
低資源消耗這點(diǎn)的話(huà)NonBlocking-IO本身基本已經(jīng)做到。
?
伸縮性
分布式系統(tǒng)基本就意味著規(guī)模不小了,對(duì)于這類(lèi)系統(tǒng)在設(shè)計(jì)的時(shí)候必須考慮伸縮性問(wèn)題,架構(gòu)圖上畫(huà)的任何一個(gè)點(diǎn),如果請(qǐng)求量或者是數(shù)據(jù)量不斷增大,怎么做到可以通過(guò)加機(jī)器的方式來(lái)解決,當(dāng)然,這個(gè)過(guò)程也不用考慮無(wú)限大的場(chǎng)景,如果經(jīng)歷過(guò)從比較小到非常大規(guī)模的架構(gòu)師,顯然優(yōu)勢(shì)是不小的,同樣也會(huì)是越來(lái)越稀缺的。
伸縮性的問(wèn)題圍繞著以下兩種場(chǎng)景在解決:
1. 無(wú)狀態(tài)場(chǎng)景
? ?對(duì)于無(wú)狀態(tài)場(chǎng)景,要實(shí)現(xiàn)隨量增長(zhǎng)而加機(jī)器支撐會(huì)比較簡(jiǎn)單,這種情況下只用解決節(jié)點(diǎn)發(fā)現(xiàn)的問(wèn)題,通常只要基于負(fù)載均衡就可以搞定,硬件或軟件方式都有;
? ?無(wú)狀態(tài)場(chǎng)景通常會(huì)把很多狀態(tài)放在db,當(dāng)量到一定階段后會(huì)需要引入服務(wù)化,去緩解對(duì)db連接數(shù)太多的情況。
2. 有狀態(tài)場(chǎng)景
? ?所謂狀態(tài)其實(shí)就是數(shù)據(jù),通常采用Sharding來(lái)實(shí)現(xiàn)伸縮性,Sharding有多種的實(shí)現(xiàn)方式,常見(jiàn)的有這么一些:
? ?2.1 規(guī)則Sharding
? ? ? ?基于一定規(guī)則把狀態(tài)數(shù)據(jù)進(jìn)行Sharding,例如分庫(kù)分表很多時(shí)候采用的就是這樣的,這種方式支持了伸縮性,但通常也帶來(lái)了很復(fù)雜的管理、狀態(tài)數(shù)據(jù)搬遷,甚至業(yè)務(wù)功能很難實(shí)現(xiàn)的問(wèn)題,例如全局join,跨表事務(wù)等。
? ?2.2 一致性Hash
? ? ? ?一致性Hash方案會(huì)使得加機(jī)器代價(jià)更低一些,另外就是壓力可以更為均衡,例如分布式cache經(jīng)常采用,和規(guī)則Sharding帶來(lái)的問(wèn)題基本一樣。
? ?2.3 Auto Sharding
? ? ? ?Auto Sharding的好處是基本上不用管數(shù)據(jù)搬遷,而且隨著量上漲加機(jī)器就OK,但通常Auto Sharding的情況下對(duì)如何使用會(huì)有比較高的要求,而這個(gè)通常也就會(huì)造成一些限制,這種方案例如HBase。
? ?2.4 Copy
? ? ? ?Copy這種常見(jiàn)于讀遠(yuǎn)多于寫(xiě)的情況,實(shí)現(xiàn)起來(lái)又會(huì)有最終一致的方案和全局一致的方案,最終一致的多數(shù)可通過(guò)消息機(jī)制等,全局一致的例如zookeeper/etcd之類(lèi)的,既要全局一致又要做到很高的寫(xiě)支撐能力就很難實(shí)現(xiàn)了。 ??
? ?
即使發(fā)展到今天,Sharding方式下的伸縮性問(wèn)題仍然是很大的挑戰(zhàn),非常不好做。
上面所寫(xiě)的基本都還只是解決的方向,到細(xì)節(jié)點(diǎn)基本就很容易判斷是一個(gè)解決過(guò)多大規(guī)模場(chǎng)景問(wèn)題的架構(gòu)師,:)
?
穩(wěn)定性
作為分布式系統(tǒng),必須要考慮清楚整個(gè)系統(tǒng)中任何一個(gè)點(diǎn)掛掉應(yīng)該怎么處理(到了一定機(jī)器規(guī)模,每天掛掉一些機(jī)器很正常),同樣主要還是分成了無(wú)狀態(tài)和有狀態(tài):
1. 無(wú)狀態(tài)場(chǎng)景
? ?對(duì)于無(wú)狀態(tài)場(chǎng)景,通常好辦,只用節(jié)點(diǎn)發(fā)現(xiàn)的機(jī)制上具備心跳等檢測(cè)機(jī)制就OK,經(jīng)驗(yàn)上來(lái)說(shuō)無(wú)非就是純粹靠4層的檢測(cè)對(duì)業(yè)務(wù)不太夠,通常得做成7層的,當(dāng)然,做成7層的就得處理好規(guī)模大了后的問(wèn)題。
2. 有狀態(tài)場(chǎng)景
? ?對(duì)于有狀態(tài)場(chǎng)景,就比較麻煩了,對(duì)數(shù)據(jù)一致性要求不高的還OK,主備類(lèi)型的方案基本也可以用,當(dāng)然,主備方案要做的很好也非常不容易,有各種各樣的方案,對(duì)于主備方案又覺(jué)得不太爽的情況下,例如HBase這樣的,就意味著掛掉一臺(tái),另外一臺(tái)接管的話(huà)是需要一定時(shí)間的,這個(gè)對(duì)可用性還是有一定影響的;
? ?全局一致類(lèi)型的場(chǎng)景中,如果一臺(tái)掛了,就通常意味著得有選舉機(jī)制來(lái)決定其他機(jī)器哪臺(tái)成為主,常見(jiàn)的例如基于paxos的實(shí)現(xiàn)。
?
可維護(hù)性
維護(hù)性是很容易被遺漏的部分,但對(duì)分布式系統(tǒng)來(lái)說(shuō)其實(shí)是很重要的部分,例如整個(gè)系統(tǒng)環(huán)境應(yīng)該怎么搭建,部署,配套的維護(hù)工具、監(jiān)控點(diǎn)、報(bào)警點(diǎn)、問(wèn)題定位、問(wèn)題處理策略等等。
?
從上面要掌握的這些技術(shù),就可以知道為什么要找到一個(gè)合格的分布式領(lǐng)域的架構(gòu)師那么的難,何況上面這些提到的還只是通用的分布式領(lǐng)域的技術(shù)點(diǎn),但通常其實(shí)需要的都是特定分布式領(lǐng)域的架構(gòu)師,例如分布式文件系統(tǒng)、分布式cache等,特定領(lǐng)域的架構(gòu)師需要在具備上面的這些技術(shù)點(diǎn)的基礎(chǔ)上還具備特定領(lǐng)域的知識(shí)技能,這就更不容易了。
隨著互聯(lián)網(wǎng)的發(fā)展,分布式領(lǐng)域的很多技術(shù)都在成熟化,想想在8年或9年前,一個(gè)大規(guī)模的網(wǎng)站的伸縮性是怎么設(shè)計(jì)的還是很熱門(mén)的探討話(huà)題,但是到了今天基本的結(jié)構(gòu)大家其實(shí)都清楚,并且還有很多不錯(cuò)的系統(tǒng)開(kāi)源出來(lái),使得很多需要經(jīng)驗(yàn)的東西也被沉淀下去了,在有了各種不錯(cuò)的開(kāi)源產(chǎn)品的支撐下以后要做一個(gè)分布式系統(tǒng)的難度一定會(huì)越來(lái)越大幅降低,云更是會(huì)加速這個(gè)過(guò)程。
?
ps: 在寫(xiě)這篇文章的過(guò)程中,發(fā)現(xiàn)要判斷一個(gè)技術(shù)人的功底有多厚,其實(shí)還真不難,就是請(qǐng)TA寫(xiě)或者講自己覺(jué)得懂的所有技術(shù),看看能寫(xiě)多厚或講多久...要寫(xiě)厚或講很久其實(shí)都不容易,盡管我也不否認(rèn)要很簡(jiǎn)潔的寫(xiě)明白或講清楚也不容易,但一定是先厚然后薄。
總結(jié)
以上是生活随笔為你收集整理的分布式领域架构师要掌握的技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 探讨下DevOPS
- 下一篇: IT从业者都应关注的软件行业的变化