目錄:
1.解決的問題
2.基本概念
3.實現手段
4.CAP理論
5.節點和數據
1.解決的問題
本質上是解決單台機器無法解決的問題,核心是計算、存儲。
方向是使用多台機器協同解決。
要解決的問題集中在分片、存儲、單點故障
2.基本概念
分片、存儲:這兩個概念其實是無法分割處理的,分片的結果就是落地到數據存儲上。
分片指以一種規則將數據合理地分配到多台機器上;該規則應着重解決:數據分佈均衡、節點動態增加、節點故障問題。
存儲指數據落地,比如內存、硬盤(包括文件、數據庫);其中要解決單節點數據故障問題、數據同步問題、中心化副本控制協議中的主節點選舉
3.實現手段
分片方式有四種:hash方式、一致性hash、range Based、number Based
這四種方式,可單獨使用,亦可配合使用。它們都不同程度上解決了數據均衡分佈、節點動態增加、單點故障問題。
存儲可將數據集中、分散存儲,採用主從備份;亦可從中心化複製、去中心化來實現。數據可同步可異步
中心化複製集,涉及到主節點選舉,主流的算法是paxos算法、Raft算法。
Raft算法:節點有三個狀態:選民、候選者、當選者。一開始時指定節點為主節點;當主節點掛掉或者出現網絡分區,餘下節點選舉推出主節點;節點向能訪問到的節點發送投票消息,獲票數大於一半時當選;若存在票數相同,所有節點重新投票。投票時節點存在隨機等待時間,且節點在特定時間內僅允許投一次票。
數據同步:主流是從主節點流向從節點,可鏈式,可從節點都從主節點同步。
4.CAP理論
c: 一致性(consistency),A:可用性(availability),P 分區容錯(partition tolerance). 對於分佈式數據存儲,至多隻能滿足其中的兩種,需注意的是A和C都是一個度的問題,並不是非0即1兩個極端。
一致性:複製多個節點的更新,本質上是分佈式事務問題,理論上應該保證原子性:要麼更新成功,要麼都不更新,而不會出現部分節點更新成功的情況。經典解決方案:一階段提交、二階段提交。
可用性:一種是採用集羣或主從備份處理,多個節點處理或者一個節點出現故障後,備份節點提供服務。第二種是數據或計算分攤,確保至少一處可用,多處計算可得結果
分區容錯:採用數據備份解決,可按機器備份、按數據塊備份
5.節點和數據
數據分佈到各個節點上,數據和節點的關係存儲到特定集羣節點上,這個關係稱為元數據。
每次對數據請求都經過元數據服務器的話,元數據服務器壓力會很大。通常元數據的變化並不頻繁,因此通常在訪問節點上做緩存,利用緩存進行讀寫操作,減輕元數據服務壓力。
如何解決緩存的強一致性?問題是通信有延時,不可靠
一種思路是版本號,基本思路是請求的時候帶上緩存的版本號,路由到具體節點後,比較實際數據的版本號,如果不一致,則表示緩存信息過舊,此時拉取元數據並緩存。
第二種是lease機制。Lease機制提出的時候是為了解決分佈式存儲系統中緩存一致性的問題
lease機制要點:
服務器向所有客户端發送魂村數據的同時,頒發一個lease,lease包含一個有限期(即過期時間)
lease的含義是:在這個有效期內,服務器保證元數據不會發生變化
因此客户端在這個有效期內可以放心大膽的使用緩存的數據,如果超過這個期限,就不能使用數據了,就得去服務器請求。
如果外部請求修改服務器的元數據,那麼服務器會阻塞修改請求,直到所有已頒發的lease過期,然後修改元數據,並將新的元數據和新的lease發送到客户端。
如果元數據沒有發生變化,那麼服務器也需要咋之前已頒發的lease過期前,重新給客户端頒發新的lease(只有lease,沒有數據)
在Lease論文的標題中,提到了“Fault-Tolerant”,那麼lease是怎麼做到容錯的呢。關鍵在於,只要服務器一旦發出數據和lease,不關心客户端是否收到數據,只要等待lease過期,就可以修改元數據;另外,lease的有效期通過過期時間(一個時間戳)來標識,因此即使從服務器到客户端的消息延時到達、或者重複發送都是沒有關係的。
zookeeper社區對腦裂的解決辦法叫做fencing, 中文翻譯為隔離,就是想辦法把舊的name node 隔離起來,使它不能正常對外提供服務。