簡介
谷歌在2003到2006年間發表了三篇論文,《MapReduce: Simplified Data Processing on Large Clusters》,《Bigtable: A Distributed Storage System for Structured Data》和《The Google File System》介紹了Google如何對大規模數據進行存儲和分析。這三篇論文開啟了工業界的大數據時代。本文簡單談談自己對於這幾篇論文的理解。
背景
本質是由於在21世紀的數據巨量增加,Google的單機或簡單的分布式方案滿足不了用戶需求,所以出現的新的數據處理方案,其產物就是GFS(Google File System)。但GFS只負責文件的存儲而不能提供數據庫服務(基於內容的檢索功能),所以進而Google開發了Bigtable作為數據庫,向上層服務提供基於內容的各種功能。他們還開發了對於的數據處理工具MapReduce,在讀取了Bigtable數據的技術上,根據業務需求,對數據內容進行運算。
GFS
前置概念-分布式儲存
題外:GFS論文一定程度催生了HDFS
文件系統
文件系統是負責管理和存儲文件的系統軟件,它是操作系統和硬件驅動之間的橋梁,操作系統通過文件系統提供的接口去存取文件,用戶通過操作系統訪問磁盤上的文件。
什么是分布式文件系統
分布式文件系統(Distributed File System)是一種允許文件通過網絡在多台主機上共享的文件系統,可以讓多機器上的多用戶進行文件分享和存儲。 在這樣的文件系統中,客戶端並非直接訪問底層的數據存儲區塊,而是通過網絡,以特定的通信協議和服務器溝通
什么是分布式存儲
通過網絡使用企業中的每台機器上的磁盤空間,並將這些分散的存儲資源構成一個虛擬的存儲設備,數據分散的存儲在企業的各個角落。
分布式儲存的特點
- 可擴展:分布式存儲系統可以擴展到數百甚至數千個這樣的集群大小,並且系統的整體性能可以線性增長。
- 高可用性:在分布式文件系統中,高可用性包含兩層,一是整個文件系統的可用性,二是數據的完整和一致性
- 低成本:分布式存儲系統的自動容錯和自動負載平衡允許在成本較低服務器上構建分布式存儲系統。此外,線性可擴展性還能夠增加和降低服務器的成本。
- 彈性存儲: 可以根據業務需要靈活地增加或縮減數據存儲以及增刪存儲池中的資源,而不需要中斷系統運行
設計概述
設計預期
- 由於使用的機器是廉價的商業化機器,那么機器崩潰被認為是一種常態。
- 系統存儲以大文件為主,但也支持小文件。文件大小通常在100MB左右並且需要高效的操作幾個GB的文件。
- 系統需要支持大規模的連續讀取和小規模的隨機讀取,以及大規模的追加寫。
- 高性能穩定的網絡帶寬比延遲更重要。
- 以及最重要的,能在分布式的系統上運行。
分布式文件系統GFS
GFS是一個可擴展的分布式文件系統,用於大型的、分布式的、對大量數據進行訪問的應用。它運行於廉價的普通硬件上,通過軟件的方式自動容錯,它將服務器故障視為正常現象,通過軟件的方式自動容錯,在保證系統可靠性和可用性的同時,大大降低系統的成本。另一方面,它擁有着數據完整性,用於大型的、分布式的、對大量數據進行訪問的應用。它又有着有效的診斷工具,廣泛而細致的診斷日志以微小的代價換取了在問題隔離、診斷、性能分析方面起到了重大的作用。GFS服務器用日志來記錄顯著的事件,如服務器停機和啟動和遠程的應答。遠程日志記錄機器之間的請求和應答,通過收集不同機器上的日志記錄,對它們進行分析恢復,就可以完整地重現活動的場景,並用此來進行錯誤分析。這些都給用戶提供了總體性能較高的服務,比較方便快捷。從根本上說:文件被分割成很多塊,使用冗余的方式儲存於商用機器集群上。
架構
GFS chunkserver
在GFS chunkserver中,文件都是分成固定大小的chunk來存儲的,每個chunk通過全局唯一的64位的chunk handle來標識,chunk handle在chunk創建的時候由GFS master分配。GFS chunkserver把文件存儲在本地磁盤中,讀或寫的時候需要指定文件名和字節范圍,然后定位到對應的chunk。為了保證數據的可靠性,一個chunk一般會在多台GFS chunkserver上存儲,默認為3份,但用戶也可以根據自己的需要修改這個值。
GFS master
GFS master管理所有的元數據信息,包括namespaces,訪問控制信息,文件到chunk的映射信息,以及chunk的地址信息(即chunk存放在哪台GFS chunkserver上)。
GFS client
GFS client是GFS應用端使用的API接口,client和GFS master交互來獲取元數據信息,但是所有和數據相關的信息都是直接和GFS chunkserver來交互的
Application
Application為使用gfs的應用,應用通過GFS client於gfs后端(GFS master和GFS chunkserver)打交道。
具體流程:
- 應用調用GFS Client的函數,要求其讀取具體的文件/foo/bar,假設大小為50MB。
- GFS Client根據Chunk的固定大小計算出/foo/bar的Chunk的Index,即64/50向上取整,Chunk Index=1。以及其在Chunk內的偏移量Byte Range[0,50],並將File Name和Chunk Index作為參數發送給GFS Master
- Master返回了對應的Chunk Handle(也就是Chunk的ID,上圖中的2ef0)和Chunk Locations(Chunk Server和其副本的IP)
- GFS Client根據返回的Chunk Locations找到最近的Chunk Server,然后根據Chunk Handle找到對應的Chunk,最后按照這個文件在Chunk中偏移量Byte Range讀取文件。
- Chunk Server按照其要求返回文件數據。
系統交互
最小化所有操作和Master節點的交互
lease
寫入操作流程圖
snapshot
定義
關於指定數據集合的一個完全可用拷貝,該拷貝包括相應數據在某個時間點(拷貝開始的時間點)的映像。快照可以是其所表示的數據的一個副本(duplicate),也可以是數據的一個復制品(replicate)。
論文原文引用:
快照操作幾乎可以瞬間完成對一個文件或者目錄樹(“源”)做一個拷貝,並且幾乎不會對正在進行的其它操作造成任何干擾。我們的用戶可以使用快照迅速的創建一個巨大的數據集的分支拷貝(而且經常是遞歸的拷貝拷貝),或者是在做實驗性的數據操作之前,使用快照操作備份當前狀態,這樣之后就可以輕松的提交或者回滾到備份時的狀態。
個人理解:快照可以在一個副本損壞時,從Primary Replica或者其他副本復制數據,然后用新的節點代替損壞的節點。
快照與備份
快照是數據存儲的某一時刻的狀態記錄;備份則是數據存儲的某一個時刻的副本。這是兩種完全不同的概念。
[關於快照:](快照與備份有什么區別?快照是備份的其中一種么?還是兩種不同的概念? - 木頭龍的回答 - 知乎 https://www.zhihu.com/question/20374919/answer/499376887)
Map Reduce(略)
分布式處理模型MapReduce
2004年公布的 MapReduce論文,論文描述了大數據的分布式計算方式,主要思想是將任務分解然后在多台處理能力較弱的計算節點中同時處理,然后將結果合並從而完成大數據處理。
對於TFS
將大數據由集中式計算過渡到分布式計算,以前提升算力的思路是讓服務器越來越強,而分布式只需要增加服務器節點的數量,就能處理更大的數據量。
Bigtable(略)
分布式結構化表Bigtable
谷歌發布於2006年的Bigtable,其啟發了無數的NoSQL數據庫,比如:Cassandra、HBase等等。Cassandra架構中有一半是模仿Bigtable,包括了數據模型、SSTables以及提前寫日志(另一半是模仿Amazon的Dynamo數據庫,使用點對點集群模式)。
總結
說到此,另兩個產品Map Reduce和Big Table,它們則是基於GFS研發的。這三大基礎核心技術構建出了完整的分布式運算架構。像Map Reduce,它是一種編程模型,用於大規模數據集的並行運算。Map(映射)和Reduce(歸約),是它們的主要思想概念,這是從函數式編程語言借鑒的,並且還有矢量編程語言里的特性。它極大地方便了編程人員在不會分布式並行編程的情況下,將其程序運行在分布式系統上。 目前軟件實現是指定一個Map函數,把一組鍵值對映射成一組新的鍵值對,指定並發的Reduce函數,用來保證所有映射的鍵值對中的每一個共享相同的鍵組。而Big Table則是分布式數據存儲系統,用來處理海量的數據的一種非關系型的數據庫。Bigtable是非關系型數據庫,是一個稀疏的、分布式的和持久化存儲的多維度排序Map。它適用於廉價設備,適合大規模海量數據以及分布式、並發數據處理,易於擴展,效率極高,支持動態伸縮。