帶著問題學(xué)習(xí)分布式系統(tǒng)
很長一段時間,對分布式系統(tǒng)都比較感興趣,也聽說過、了解過其中一些相關(guān)的知識點,但都比較零碎。一直想系統(tǒng)的學(xué)習(xí)一下,但是一拖再拖,寫下本文,也是希望能督促自己。
寫在前面
聽過很多道理,卻依然過不好這一生。
看過很多關(guān)于學(xué)習(xí)的技巧、方法,卻沒應(yīng)用到自己的學(xué)習(xí)中。
隨著年紀(jì)變大,記憶力越來越差,整塊的時間也越來越少,于是,越來越希望能夠更高效的學(xué)習(xí)。學(xué)習(xí)是一種習(xí)慣也是一種能力,這種能力在上學(xué)期間養(yǎng)成是最好的,畢竟那個時候絕大部分時間都在學(xué)習(xí)。但很遺憾,我沒有養(yǎng)成適合自己的、好的學(xué)習(xí)習(xí)慣。工作之后,除了在日常工作中用到的知識技術(shù),很難通過自學(xué)掌握新的知識(偏向于專業(yè)知識,即技術(shù))。而互聯(lián)網(wǎng)行業(yè)的分支、知識點又是如此之多,于是會出現(xiàn)這樣的情況,遇到一個新的知識,覺得很厲害很感興趣,看兩天,但很快就忘記了。另外,對于一些比較龐雜的技術(shù),又無從下手,也很難堅持下去。
根本的問題在于學(xué)習(xí)不系統(tǒng),沒有把一個個的知識點連接起來,本來這些新的知識就很少在工作中實踐,如果又是一個個的信息孤島,很快就會被遺忘。另一個問題,沒有良好的規(guī)劃,今天看看這里,明天看看哪里,糾結(jié)于細(xì)枝末節(jié),忘了從整體上把握。
幸好,差不多半年前開始意識到了這個問題,開始看書,看別人的博客,開始思考如何充分利用好有限的時間。自己也實踐了一些想法,比如寫博客,堅持寫博客。也有很多沒做好,比如如何學(xué)習(xí)掌握一門新技術(shù)。關(guān)于這一點,其實看了許多文章,也有很多印象深刻,覺得很有道理;也有一些好書,比如《study more,learn less》。紙上得來終覺淺,絕知此事要躬行,別人的辦法再好也需要親身實踐才知道是否對自己適用。
需要學(xué)習(xí)的技術(shù)很多,要自學(xué)新知識也不是一件容易的事,選擇一個自己比較感興趣的會是一個比較好的開端,于是,打算學(xué)一學(xué)分布式系統(tǒng)。
帶著問題,有目的的學(xué)習(xí),先了解整體架構(gòu),在深入感興趣的細(xì)節(jié),這是我的計劃。
帶著問題出發(fā)
分布式要解決什么問題呢?解決持久化數(shù)據(jù)太大,單個節(jié)點的硬盤無法存儲的問題;解決運算量太大,單個節(jié)點的內(nèi)存、CPU無法處理的問題。解決這些問題,有兩種思路:scale up,scale out。前者就是提升單個節(jié)點的能力,更大的磁盤,更快的CPU,定制的軟硬件,然而這意味著更高的價格,而且再怎么scaleup 也是有上限的。后者就是把存儲、計算任務(wù)分擔(dān)到普通的機(jī)器上,通過動態(tài)增加節(jié)點來應(yīng)對數(shù)據(jù)量的增長,但缺點是多個節(jié)點的管理、任務(wù)的調(diào)度比較麻煩,這也是分布式系統(tǒng)研究和解決的問題。只有當(dāng)數(shù)據(jù)量達(dá)到單機(jī)無法存儲、處理的情況下才考慮分布式,不然都是自找麻煩。
數(shù)據(jù)分片
數(shù)據(jù)分片是指將數(shù)據(jù)子集盡可能均衡的劃分到各個物理節(jié)點上。那么會有哪些挑戰(zhàn)呢?
(1)如果某個物理節(jié)點宕機(jī),如何將該物理節(jié)點負(fù)責(zé)的數(shù)據(jù)盡快的轉(zhuǎn)移到其他物理節(jié)點;
?。?)如果新增了物理節(jié)點,怎么從其他節(jié)點遷移數(shù)據(jù)到新節(jié)點;
?。?)對于可修改的數(shù)據(jù)(即不是只能追加的數(shù)據(jù)),比如數(shù)據(jù)庫數(shù)據(jù),如果某節(jié)點數(shù)據(jù)量變大,怎么將部分?jǐn)?shù)據(jù)遷移到其他負(fù)載較小的節(jié)點,及達(dá)到動態(tài)均衡的效果。
(4.2)如何保證meta server的高性能和高可用,是單點還是復(fù)制集
自問自答(2017 06 28):
帶著問題學(xué)習(xí)分布式系統(tǒng)之?dāng)?shù)據(jù)分片
數(shù)據(jù)冗余
前面提到,分布式系統(tǒng)中的節(jié)點都是普通的節(jié)點,因此有一定的概率會出現(xiàn)物理故障,比如斷電、網(wǎng)絡(luò)不可用,這些故障導(dǎo)致數(shù)據(jù)的暫時不可用;另外一些故障更嚴(yán)重,會導(dǎo)致數(shù)據(jù)的丟失,比如磁盤損壞。即使單個節(jié)點的故障是小概率,當(dāng)集群中的節(jié)點數(shù)目很多是,故障就成為了一個大概率事件。因此,保證數(shù)據(jù)的高可用和可靠性是分布式系統(tǒng)必須解決的問題。
為了避免單點故障,可行的辦法就是數(shù)據(jù)冗余(復(fù)制集),即將同一份數(shù)據(jù)放在不同的物理節(jié)點,甚至是不同的數(shù)據(jù)中心。如果數(shù)據(jù)是一次寫,多次讀那很好辦,隨便從哪個副本讀取都行。但對于很多分布式存儲系統(tǒng),比如數(shù)據(jù)庫,數(shù)據(jù)是持續(xù)變化的,有讀有寫。那么復(fù)制集會帶來什么樣的挑戰(zhàn)呢,需要如何權(quán)衡呢,假設(shè)有三個副本:
?。?)三個副本的地位,大家都是平等的還是有主(primary、master)有次(secondary、slave),如果是平等的,那么每個節(jié)點都可以接收寫操作;如果不平等,可以一個節(jié)點負(fù)責(zé)所有的寫操作,所有節(jié)點都提供讀操作,
(2)在平等的情況下,怎么保證寫入操作不沖突,保證各個節(jié)點的數(shù)據(jù)是一致的,怎么保證能讀取到最新的數(shù)據(jù)
(4)不管復(fù)制集內(nèi)部的節(jié)點是平等的,還是有集中式節(jié)點的,只要有多個數(shù)據(jù)副本,就需要考慮數(shù)據(jù)的一致性可用性問題。按照CAP理論,只能同時滿足一致性 可用性 分區(qū)容錯性之間的二者,不同的分布式系統(tǒng)需要權(quán)衡。
其他
分片 副本 一致性哈希 冪等 CAP paxos raft NWR lease 兩階段提交協(xié)議 三階段提交協(xié)議 拜占庭問題
目前收集到的學(xué)習(xí)資料如下:
劉杰的《分布式系統(tǒng)原理介紹》
Distributed systems for fun and profit
CMU課程:http://www.cs.cmu.edu/~dga/15-440/S14/syllabus.html
MIT課程:http://nil.csail.mit.edu/6.824/2016/schedule.html
前面兩個是基礎(chǔ)整體介紹,最后一個是MIT的課程,網(wǎng)上評價很高,也有很多人在學(xué)習(xí)。
總結(jié):
對于一門新技術(shù),不要上來就開干,思考新技術(shù)解決了什么問題、已有的技術(shù)能否替代、適用場景與缺陷。對于自己(程序員),想想為什么要學(xué)、是深度還是廣度知識、該技術(shù)在自己的技能樹中的位置。

浙公網(wǎng)安備 33010602011771號