開(kāi)發(fā)網(wǎng)站監(jiān)控推薦營(yíng)銷(xiāo)推廣外包
寫(xiě)在前面
聽(tīng)過(guò)很多道理,卻依然過(guò)不好這一生。
看過(guò)很多關(guān)于學(xué)習(xí)的技巧、方法,卻沒(méi)應(yīng)用到自己的學(xué)習(xí)中。
隨著年紀(jì)變大,記憶力越來(lái)越差,整塊的時(shí)間也越來(lái)越少,于是,越來(lái)越希望能夠更高效的學(xué)習(xí)。學(xué)習(xí)是一種習(xí)慣也是一種能力,這種能力在上學(xué)期間養(yǎng)成是最好的,畢竟那個(gè)時(shí)候絕大部分時(shí)間都在學(xué)習(xí)。但很遺憾,我沒(méi)有養(yǎng)成適合自己的、好的學(xué)習(xí)習(xí)慣。工作之后,除了在日常工作中用到的知識(shí)技術(shù),很難通過(guò)自學(xué)掌握新的知識(shí)(偏向于專(zhuān)業(yè)知識(shí),即技術(shù))。而互聯(lián)網(wǎng)行業(yè)的分支、知識(shí)點(diǎn)又是如此之多,于是會(huì)出現(xiàn)這樣的情況,遇到一個(gè)新的知識(shí),覺(jué)得很厲害很感興趣,看兩天,但很快就忘記了。另外,對(duì)于一些比較龐雜的技術(shù),又無(wú)從下手,也很難堅(jiān)持下去。
根本的問(wèn)題在于學(xué)習(xí)不系統(tǒng),沒(méi)有把一個(gè)個(gè)的知識(shí)點(diǎn)連接起來(lái),本來(lái)這些新的知識(shí)就很少在工作中實(shí)踐,如果又是一個(gè)個(gè)的信息孤島,很快就會(huì)被遺忘。另一個(gè)問(wèn)題,沒(méi)有良好的規(guī)劃,今天看看這里,明天看看哪里,糾結(jié)于細(xì)枝末節(jié),忘了從整體上把握。
幸好,差不多半年前開(kāi)始意識(shí)到了這個(gè)問(wèn)題,開(kāi)始看書(shū),看別人的博客,開(kāi)始思考如何充分利用好有限的時(shí)間。自己也實(shí)踐了一些想法,比如寫(xiě)博客,堅(jiān)持寫(xiě)博客。也有很多沒(méi)做好,比如如何學(xué)習(xí)掌握一門(mén)新技術(shù)。關(guān)于這一點(diǎn),其實(shí)看了許多文章,也有很多印象深刻,覺(jué)得很有道理;也有一些好書(shū),比如《study?more,learn?less》。紙上得來(lái)終覺(jué)淺,絕知此事要躬行,別人的辦法再好也需要親身實(shí)踐才知道是否對(duì)自己適用。
需要學(xué)習(xí)的技術(shù)很多,要自學(xué)新知識(shí)也不是一件容易的事,選擇一個(gè)自己比較感興趣的會(huì)是一個(gè)比較好的開(kāi)端,于是,打算學(xué)一學(xué)分布式系統(tǒng)。
帶著問(wèn)題,有目的的學(xué)習(xí),先了解整體架構(gòu),在深入感興趣的細(xì)節(jié),這是我的計(jì)劃。
首先得有問(wèn)題,如果每日重復(fù)相同的工作,也不主動(dòng)去學(xué)習(xí),很難發(fā)現(xiàn)新的問(wèn)題。不怕自己無(wú)知,就怕不知道自己無(wú)知,只有不斷的學(xué)習(xí),才會(huì)發(fā)現(xiàn)更多未知的知識(shí)領(lǐng)域!
帶著問(wèn)題出發(fā)
分布式要解決什么問(wèn)題呢?解決持久化數(shù)據(jù)太大,單個(gè)節(jié)點(diǎn)的硬盤(pán)無(wú)法存儲(chǔ)的問(wèn)題;解決運(yùn)算量太大,單個(gè)節(jié)點(diǎn)的內(nèi)存、CPU無(wú)法處理的問(wèn)題。解決這些問(wèn)題,有兩種思路:scale?up,scale?out。前者就是提升單個(gè)節(jié)點(diǎn)的能力,更大的磁盤(pán),更快的CPU,定制的軟硬件,然而這意味著更高的價(jià)格,而且再怎么scaleup 也是有上限的。后者就是把存儲(chǔ)、計(jì)算任務(wù)分擔(dān)到普通的機(jī)器上,通過(guò)動(dòng)態(tài)增加節(jié)點(diǎn)來(lái)應(yīng)對(duì)數(shù)據(jù)量的增長(zhǎng),但缺點(diǎn)是多個(gè)節(jié)點(diǎn)的管理、任務(wù)的調(diào)度比較麻煩,這也是分布式系統(tǒng)研究和解決的問(wèn)題。只有當(dāng)數(shù)據(jù)量達(dá)到單機(jī)無(wú)法存儲(chǔ)、處理的情況下才考慮分布式,不然都是自找麻煩。
狀態(tài)的維護(hù)比計(jì)算要難很多,所謂狀態(tài)就是需要持久化的數(shù)據(jù)。因此主要考慮分布式存儲(chǔ),況且即使是分布式計(jì)算,為了節(jié)省帶寬需要盡量保證data?locality,也是需要分布式存儲(chǔ)。
現(xiàn)在有一堆數(shù)據(jù),可能是結(jié)構(gòu)化或者半結(jié)構(gòu)化,需要將數(shù)據(jù)分片(segment、fragment、shard),形成一個(gè)個(gè)的數(shù)據(jù)子集,存儲(chǔ)到一組物理節(jié)點(diǎn)上,物理節(jié)點(diǎn)之間通過(guò)網(wǎng)絡(luò)通信。那么需要考慮兩個(gè)問(wèn)題:
第一:數(shù)據(jù)如何劃分;?
第二:數(shù)據(jù)的可靠性、可用性問(wèn)題
?
數(shù)據(jù)分片
數(shù)據(jù)分片是指將數(shù)據(jù)子集盡可能均衡的劃分到各個(gè)物理節(jié)點(diǎn)上。那么會(huì)有哪些挑戰(zhàn)呢?
(1)如果某個(gè)物理節(jié)點(diǎn)宕機(jī),如何將該物理節(jié)點(diǎn)負(fù)責(zé)的數(shù)據(jù)盡快的轉(zhuǎn)移到其他物理節(jié)點(diǎn);
(2)如果新增了物理節(jié)點(diǎn),怎么從其他節(jié)點(diǎn)遷移數(shù)據(jù)到新節(jié)點(diǎn);
(3)對(duì)于可修改的數(shù)據(jù)(即不是只能追加的數(shù)據(jù)),比如數(shù)據(jù)庫(kù)數(shù)據(jù),如果某節(jié)點(diǎn)數(shù)據(jù)量變大,怎么將部分?jǐn)?shù)據(jù)遷移到其他負(fù)載較小的節(jié)點(diǎn),及達(dá)到動(dòng)態(tài)均衡的效果。
(4)元數(shù)據(jù)的管理問(wèn)題:當(dāng)數(shù)據(jù)分布在各個(gè)節(jié)點(diǎn),那么當(dāng)用戶(hù)使用的時(shí)候需要知道具體的數(shù)據(jù)在哪一個(gè)節(jié)點(diǎn)上。因此,系統(tǒng)需要維護(hù)數(shù)據(jù)的元數(shù)據(jù):即每一個(gè)數(shù)據(jù)所在的位置、狀態(tài)等信息。當(dāng)用戶(hù)需要具體的數(shù)據(jù)時(shí),先查詢(xún)?cè)獢?shù)據(jù),然后再去具體的節(jié)點(diǎn)上查詢(xún)。當(dāng)數(shù)據(jù)在節(jié)點(diǎn)之間遷移的時(shí)候,也需要更新元數(shù)據(jù)。元數(shù)據(jù)的管理節(jié)點(diǎn)這里稱(chēng)之為meta server。元數(shù)據(jù)的管理也帶來(lái)了新的挑戰(zhàn):
(4.1)如何抽取數(shù)據(jù)的特征(特征是分片的依據(jù),也是用戶(hù)查詢(xún)數(shù)據(jù)時(shí)的key),或者支持用戶(hù)自定義數(shù)據(jù)特征;
(4.2)如何保證meta server的高性能和高可用,是單點(diǎn)還是復(fù)制集
(5)分片的粒度,即數(shù)據(jù)子集的大小,也是數(shù)據(jù)遷移的基本單位。粒度過(guò)粗,不利于數(shù)據(jù)均衡;粒度過(guò)細(xì),管理、遷移成本又會(huì)比較大。
數(shù)據(jù)冗余
前面提到,分布式系統(tǒng)中的節(jié)點(diǎn)都是普通的節(jié)點(diǎn),因此有一定的概率會(huì)出現(xiàn)物理故障,比如斷電、網(wǎng)絡(luò)不可用,這些故障導(dǎo)致數(shù)據(jù)的暫時(shí)不可用;另外一些故障更嚴(yán)重,會(huì)導(dǎo)致數(shù)據(jù)的丟失,比如磁盤(pán)損壞。即使單個(gè)節(jié)點(diǎn)的故障是小概率,當(dāng)集群中的節(jié)點(diǎn)數(shù)目很多是,故障就成為了一個(gè)大概率事件。因此,保證數(shù)據(jù)的高可用和可靠性是分布式系統(tǒng)必須解決的問(wèn)題。
為了避免單點(diǎn)故障,可行的辦法就是數(shù)據(jù)冗余(復(fù)制集),即將同一份數(shù)據(jù)放在不同的物理節(jié)點(diǎn),甚至是不同的數(shù)據(jù)中心。如果數(shù)據(jù)是一次寫(xiě),多次讀那很好辦,隨便從哪個(gè)副本讀取都行。但對(duì)于很多分布式存儲(chǔ)系統(tǒng),比如數(shù)據(jù)庫(kù),數(shù)據(jù)是持續(xù)變化的,有讀有寫(xiě)。那么復(fù)制集會(huì)帶來(lái)什么樣的挑戰(zhàn)呢,需要如何權(quán)衡呢,假設(shè)有三個(gè)副本:
(1)三個(gè)副本的地位,大家都是平等的還是有主(primary、master)有次(secondary、slave),如果是平等的,那么每個(gè)節(jié)點(diǎn)都可以接收寫(xiě)操作;如果不平等,可以一個(gè)節(jié)點(diǎn)負(fù)責(zé)所有的寫(xiě)操作,所有節(jié)點(diǎn)都提供讀操作,
(2)在平等的情況下,怎么保證寫(xiě)入操作不沖突,保證各個(gè)節(jié)點(diǎn)的數(shù)據(jù)是一致的,怎么保證能讀取到最新的數(shù)據(jù)
(3)不平等的情況下
(3.1)寫(xiě)節(jié)點(diǎn)怎么將變更的數(shù)據(jù)同步到其他節(jié)點(diǎn),同步還是異步;
(3.2)非寫(xiě)節(jié)點(diǎn)能否提供讀數(shù)據(jù),如果能夠允許,會(huì)不會(huì)讀取到過(guò)時(shí)的數(shù)據(jù)。
(3.3)主節(jié)點(diǎn)是怎么產(chǎn)生的,當(dāng)主節(jié)點(diǎn)宕機(jī)的時(shí)候,怎么選擇出新的主節(jié)點(diǎn)。是有統(tǒng)一的復(fù)制集管理中心(記錄誰(shuí)主誰(shuí)次,各自的狀態(tài)),還是復(fù)制集自己選舉出一個(gè)主節(jié)點(diǎn)?
(4)不管復(fù)制集內(nèi)部的節(jié)點(diǎn)是平等的,還是有集中式節(jié)點(diǎn)的,只要有多個(gè)數(shù)據(jù)副本,就需要考慮數(shù)據(jù)的一致性可用性問(wèn)題。按照CAP理論,只能同時(shí)滿(mǎn)足一致性?可用性?分區(qū)容錯(cuò)性之間的二者,不同的分布式系統(tǒng)需要權(quán)衡。
其他
分布式系統(tǒng)有自己的術(shù)語(yǔ)或者概念。在當(dāng)前的這個(gè)時(shí)間點(diǎn),我對(duì)其中的一些有了解,或者使用過(guò);另外一些只是聽(tīng)說(shuō)過(guò),不甚了解;當(dāng)然,還有更多的是不知道的,是需要在后續(xù)的學(xué)習(xí)中去發(fā)現(xiàn)、去掌握的。
分片 副本 一致性哈希 冪等 CAP paxos raft NWR lease 兩階段提交協(xié)議 三階段提交協(xié)議 拜占庭問(wèn)題