這是 中興大數據第200篇原創(chuàng )文章
分布式系統是大數據的基礎,大數據是分布式系統的最佳實(shí)踐。本文將介紹分布式系統對數據的基本處理方法,包括數據的分布方式和對數據副本進(jìn)行控制的協(xié)議和算法。這些算法也是大數據各類(lèi)組件技術(shù)的基礎。
分布式系統定義
分布式系統是若干獨立計算機的集合,但這些計算機系統集合從用戶(hù)的使用角度來(lái)說(shuō),則是一個(gè)單一的應用系統。組建一個(gè)分布式系統具備五個(gè)關(guān)鍵目標:
資源的可訪(fǎng)問(wèn)性:用戶(hù)能夠方便的訪(fǎng)問(wèn)遠程資源,并且可以以一種受控的方式與其他用戶(hù)共享資源;
透明性:資源在網(wǎng)絡(luò )上的分布對用戶(hù)不可見(jiàn),用戶(hù)的使用體驗就是在一個(gè)入口做操作;
開(kāi)放性:系統通過(guò)一整套標準化的接口來(lái)提供服務(wù),任何第三方系統都可以通過(guò)該標準接口接入該系統,并使用其提供的服務(wù);
可擴展性:系統在規模上可以擴展,可以方便的增加資源來(lái)為更多的用戶(hù)提供服務(wù)。
容錯性:系統可以從部分失效中自動(dòng)恢復,而且不會(huì )嚴重的影響整體性能。特別是,當故障發(fā)生時(shí),分布式系統應該在進(jìn)行故障恢復的同時(shí)依然可以提供基本的操作能力。也就是說(shuō),它應該能容忍錯誤,在發(fā)生錯誤時(shí)某種程度上可以繼續操作。
整個(gè)系統由分布在不同位置或者服務(wù)器上的節點(diǎn)和進(jìn)程組成,這二者是分布式系統的基本元素,而節點(diǎn)/進(jìn)程間的通信是分布式系統的核心。節點(diǎn)/進(jìn)程間通過(guò)命名服務(wù)和同步來(lái)相互協(xié)作。
一致性和復制是分布式系統要解決的二個(gè)重要問(wèn)題,對數據進(jìn)行復制是為了增強系統的可靠性或提高性能。而實(shí)現數據復制的主要難題是保證各個(gè)副本的一致性。
分布式系統體系結構
把分布式系統的邏輯組織結構看作軟件組件來(lái)分析其體系結構,則通常分布式系統可以劃分為:
基于分層的體系架構:組件組成不同的層,各層的請求自頂向下依次調用,而請求結果則從下往上。如下圖“基于分層的體系架構”所示,TCP/IP協(xié)議的模型是這種體系架構的經(jīng)典。
基于分層的體系架構
基于對象的體系架構:這是一種很松散的組織結構,每個(gè)對象是一個(gè)組件,組件間通過(guò)遠程過(guò)程調用機制來(lái)交互。如下圖“基于對象的體系架構”所示,大型軟件多采用本架構。
基于對象的體系架構
基于數據的體系架構:組件間的通信通過(guò)一個(gè)公用的數據倉庫。如下圖“基于數據的體系架構”所示,基于WEB的分布式系統大多數是以數據為中心的。
基于數據的體系架構
基于事件的體系架構:組件間的通信是通過(guò)事件來(lái)傳播的,進(jìn)程間是松耦合的。如下圖“基于事件的體系架構”所示,通常的發(fā)布/訂閱系統都屬于這類(lèi)。
基于事件的體系架構
分布式系統演進(jìn)
最出名的分布式計算模型就是Internet,它是所有分布式技術(shù)的基礎,從電子商務(wù)到云計算到面向服務(wù)到虛擬化到大數據。所有的分布式計算模型都有一個(gè)相同的特性:他們是一群協(xié)同工作的網(wǎng)絡(luò )計算機。
總體上說(shuō),整體分布式系統的演進(jìn)是從封閉到開(kāi)放的過(guò)程,是一個(gè)不斷標準化的過(guò)程。
早期是美國國防部先進(jìn)研究項目局(DARPA)的內部網(wǎng)絡(luò )和一些私企的遠程過(guò)程調用(RPC)系統,慢慢的TCP/IP協(xié)議的發(fā)展和被廣泛應用。最終夯實(shí)了分布式系統的基礎。
每個(gè)廠(chǎng)商和標準組織都在發(fā)展自己的遠程過(guò)程調用(RPC)系統,這使得任何一家公司都無(wú)法創(chuàng )建一個(gè)通用的分布式計算標準。1990年代中期,Internet協(xié)議替代了這些早期的嘗試,并成為今天分布式計算的基礎。整個(gè)演進(jìn)過(guò)程如下圖所示。

分布式計算演進(jìn)過(guò)程
典型的分布式系統案例如下:
電信通訊網(wǎng)絡(luò ):
電話(huà)網(wǎng)絡(luò )和蜂窩網(wǎng)絡(luò )
計算機網(wǎng)絡(luò ),諸如Internet
無(wú)線(xiàn)傳感器網(wǎng)絡(luò )
網(wǎng)絡(luò )應用:
廣域網(wǎng)和點(diǎn)對點(diǎn)網(wǎng)絡(luò )
在線(xiàn)游戲和虛擬現實(shí)社區
分布式數據庫
網(wǎng)絡(luò )文件系統
實(shí)時(shí)控制系統:
飛機控制系統
工業(yè)控制系統
并行計算:
科學(xué)計算,包括集群計算和網(wǎng)格計算
計算機圖形的分布式渲染
分布式系統關(guān)鍵協(xié)議和算法
在分布式系統中計算節點(diǎn)和存儲節點(diǎn)可以在同一臺物理機器上,也可以位于不同的物理機器。如果計算節點(diǎn)和存儲節點(diǎn)位于不同的物理機器則計算的數據需要通過(guò)網(wǎng)絡(luò )傳輸,此種方式的開(kāi)銷(xiāo)很大,甚至網(wǎng)絡(luò )帶寬會(huì )成為系統的總體瓶頸。另一種思路是,將計算盡量調度到與存儲節點(diǎn)在同一臺物理機器上的計算節點(diǎn)上進(jìn)行,這稱(chēng)之為本地化計算。本地化計算是計算調度的一種重要優(yōu)化,其體現了一種重要的分布式調度思想:“移動(dòng)數據不如移動(dòng)計算”,通俗說(shuō)就是計算跟著(zhù)數據走。
當數據分布到多個(gè)節點(diǎn)后,為了保證數據的安全和可靠性,必須對每份數據都有備份,也就是數據的副本。對分布式系統來(lái)說(shuō),副本數據的復制(維持多副本)和保證副本的一致性是其重點(diǎn)要解決的兩個(gè)問(wèn)題。進(jìn)行數據復制主要是為了提升系統的可靠性和性能。如果一個(gè)文件系統已實(shí)現數據復制,則當一個(gè)副本被破壞后,文件系統只需要轉換到另一個(gè)數據副本就可繼續運轉,從而使得系統更加可靠。同樣,當分布式系統需要在服務(wù)器數量和地理區域上進(jìn)行擴展時(shí),復制對于提高性能也是非常重要的,通過(guò)對服務(wù)器進(jìn)行復制,讓他們分擔工作負荷,就可以提高性能。雖然復制能提升系統可靠性和性能,但是復制是有代價(jià)的。首先,維持多副本需要更多的存儲空間,所有副本的更新需要更多的網(wǎng)絡(luò )帶寬,另外,多個(gè)副本可能導致一致性方面的問(wèn)題,一旦某個(gè)副本被修改了,那么它將不同于其他所有的副本。因此,必須對所有副本進(jìn)行同樣的修改以確保一致性。
綜上,一個(gè)分布式系統的關(guān)鍵協(xié)議和算法主要有兩類(lèi):
如何拆解分布式系統的輸入數據,即數據的分布方式;
數據的副本是如何創(chuàng )建的,并且如何保證其一致性。
數據分布方式
對系統的輸入數據進(jìn)行分解并分布到不同的節點(diǎn)的方式就是數據的分布方式,通常用下面的方法:
a) 哈希方式
哈希方式是最常見(jiàn)的數據分布方式,其方法是按照數據的某一特征計算哈希值,并將哈希值與機器中的機器建立映射關(guān)系,從而將不同哈希值的數據分布到不同的機器上。所謂數據特征可以是key-value 系統中的 key,也可以是其他與應用業(yè)務(wù)邏輯相關(guān)的值。下圖“哈希算法數據分布示意圖”給出了哈希方式分數據的一個(gè)例子,將數據按哈希值分配到3個(gè)節點(diǎn)上。

哈希算法數據分布示意圖
b) 按數據范圍分布
按數據范圍分布是另一個(gè)常見(jiàn)的數據分布式,將數據按特征值的值域范圍劃分為不同的區間,使得集群中每臺(組)服務(wù)器處理不同區間的數據。下圖“按數據范圍分布的示意圖”展示了這種數據發(fā)布方式。

按數據范圍分布的示意圖
c) 按數據量分布
按數據量分布數據與具體的數據特征無(wú)關(guān),而是將數據視為一個(gè)順序增長(cháng)的文件,并將這個(gè)文件按照某一較為固定的大小劃分為若干數據塊(chunk),不同的數據塊分布到不同的服務(wù)器上。下圖“按數據量分布的示意圖”就是一個(gè)簡(jiǎn)單的樣例。

按數據量分布的示意圖
d) 一致性哈希
使用一個(gè)哈希函數計算數據或數據特征的哈希值,令該哈希函數的輸出值域為一個(gè)封閉的環(huán),即哈希函數輸出的最大值是最小值的前序。將節點(diǎn)隨機分布到這個(gè)環(huán)上,每個(gè)節點(diǎn)負責處理從自己開(kāi)始順時(shí)針至下一個(gè)節點(diǎn)的全部哈希值域上的數據。下圖“一致性哈希分布示意圖”是一個(gè)簡(jiǎn)單的示例。

一致性哈希分布示意圖
數據副本控制協(xié)議
副本控制協(xié)議指按一定的協(xié)議流程控制副本數據的讀寫(xiě)行為,使得副本滿(mǎn)足一定的可用性和一致性要求的分布式協(xié)議。副本控制協(xié)議要具有一定的容錯能力,從而保證系統具有一定的可用性。在分布式系統中通常有兩種方法:
a) 中心化副本控制協(xié)議
中心化副本控制協(xié)議的基本思路是由一個(gè)中心節點(diǎn)協(xié)調副本數據的更新、維護副本之間的一致性。中心化副本控制協(xié)議的優(yōu)點(diǎn)是協(xié)議相對較為簡(jiǎn)單,所有的副本相關(guān)的控制由中心節點(diǎn)完成,并發(fā)控制由中心節點(diǎn)完成,從而使得一個(gè)分布式并發(fā)控制問(wèn)題,簡(jiǎn)化為一個(gè)單機并發(fā)控制問(wèn)題。中心化副本控制協(xié)議通用架構如下圖“中心化副本控制協(xié)議示意圖”:這類(lèi)協(xié)議優(yōu)點(diǎn)是設計簡(jiǎn)單,但是存在中心節點(diǎn)使得有一定的中心節點(diǎn)異常造成的不可用問(wèn)題。

中心化副本控制協(xié)議示意圖
最常用的中心化副本控制協(xié)議就是primary-secondary協(xié)議。類(lèi)似通常的Master-Slave協(xié)議,Primary是主節點(diǎn),Secondary是若干副節點(diǎn)。這種協(xié)議中,副本被分為兩種:Primary的副本,通常只有一個(gè);除Primary 以外的副本都作為Secondary 副本。維護Primary副本的節點(diǎn)作為中心節點(diǎn),中心節點(diǎn)負責維護數據的更新、并發(fā)控制、協(xié)調副本的一致性等控制管理工作。
b) 去中心化副本控制協(xié)議
去中心化副本控制協(xié)議沒(méi)有中心節點(diǎn),協(xié)議中所有的節點(diǎn)都是完全對等的,節點(diǎn)之間通過(guò)平等協(xié)商達到一致。從而去中心化協(xié)議沒(méi)有因為中心化節點(diǎn)異常而帶來(lái)的停服務(wù)等問(wèn)題。去中心化協(xié)議的最大的缺點(diǎn)是協(xié)議過(guò)程通常比較復雜。不再就去中心化副本控制協(xié)議做進(jìn)一步詳細分析。去中心化副本控制協(xié)議通用架構如下圖“去中心化副本控制協(xié)議示意圖”:這類(lèi)協(xié)議的優(yōu)點(diǎn)是個(gè)別節點(diǎn)異常不影響整個(gè)系統,缺點(diǎn)是協(xié)議流程復雜,實(shí)現和處理效率均降低。

去中心化副本控制協(xié)議示意圖
Paxos是唯一在工程中得到應用的強一致性去中心化副本控制協(xié)議。Paxos協(xié)議算法是Lamport于1990年提出的一種基于消息傳遞的一致性算法。由于算法難以理解起初并沒(méi)有引起人們的重視。06年Google的三篇論文中的chubby鎖服務(wù)使用paxos作為chubby cell中的一致性算法,Paxos的人氣從此一路狂飆。Paxos 協(xié)議是少數在工程實(shí)踐中證實(shí)的強一致性、高可用的去中心化分布式協(xié)議。
Paxos 協(xié)議算法解決的問(wèn)題是一個(gè)分布式系統如何就某個(gè)值(決議)達成一致。一個(gè)典型的場(chǎng)景是,在一個(gè)分布式數據庫系統中,如果各節點(diǎn)的初始狀態(tài)一致,每個(gè)節點(diǎn)都執行相同的操作序列,那么他們最后能得到一個(gè)一致的狀態(tài)。為保證每個(gè)節點(diǎn)執行相同的命令序列,需要在每一條指令上執行一個(gè)“一致性算法”以保證每個(gè)節點(diǎn)看到的指令一致,是分布式計算中的重要問(wèn)題。
基于Paxos 協(xié)議中,有一組完全對等的參與節點(diǎn)(稱(chēng)為 accpetor),這組節點(diǎn)各自就某一事件做出決議,如果某個(gè)決議獲得了超過(guò)半數節點(diǎn)的同意則生效。Paxos 協(xié)議中只要有超過(guò)一半的節點(diǎn)正常,就可以工作,能很好對抗宕機、網(wǎng)絡(luò )分化等異常情況。
分布式系統和大數據
大數據作為分布式系統的最佳實(shí)踐,其核心是利用多臺計算機組成的分布式系統來(lái)協(xié)同解決單臺計算機所不能解決的大數據的計算、存儲等問(wèn)題。大數據和傳統數據分析的最大的區別就在于問(wèn)題的規模,即計算、存儲的數據量的區別。大數據將傳統的單機數據分析問(wèn)題使用分布式來(lái)解決,首先要解決的就是如何將問(wèn)題拆解為可以使用多機分布式解決,使得分布式系統中的每臺機器負責原問(wèn)題的一個(gè)子集。由于無(wú)論是計算還是存儲,其問(wèn)題輸入對象都是數據,所以如何拆解大數據依然是大數據系統的基本問(wèn)題。
大數據系統采用的數據處理方式如下圖所示:

大數據系統的數據處理方式
對于開(kāi)源大數據系統Hadoop的各個(gè)組件來(lái)說(shuō),其普遍采用中心化副本控制協(xié)議來(lái)簡(jiǎn)化系統的設計和實(shí)現,但是為了保證系統的可靠性,又在其分布式協(xié)調系統ZooKeeper中采用類(lèi)似Paxos的去中心化協(xié)議選出Primary節點(diǎn)。在完成Primary節點(diǎn)的選舉后,系統就轉為中心化的副本控制協(xié)議,即由Primary節點(diǎn)負責同步更新操作到Secondary。這樣就保證了Primary節點(diǎn)的可靠性。
綜合起來(lái),我們可以看到,無(wú)論是分布式系統還是大數據系統,其本質(zhì)都是如何對數據做合理和高效的處理。本文介紹了作為大數據基礎的分布式系統對數據的基本處理方法,包括數據的分布方式和對數據副本進(jìn)行控制的協(xié)議和算法。這些算法也是大數據各類(lèi)組件技術(shù)的基礎。

聯(lián)系客服