1. 分布式存儲概念
大規模分布式存儲系統的定義如下:
????????“分布式存儲系統是大量普通PC服務器通過Internet互聯,對外作為一個整體提供存儲服務。”
分布式存儲系統具有如下幾個特性:
- 可擴展。分布式存儲系統可以擴展到幾百臺甚至幾千臺的集群規模,而且,隨著集群規模的增長,系統整體性能表現為線性增長。
- 低成本。分布式存儲系統的自動容錯、自動負載均衡機制使其可以構建在普通PC機之上。另外,線性擴展能力也使得增加、減少機器非常方便,可以實現自動運維。
- 高性能。無論是針對整個集群還是單臺服務器,都要求分布式存儲系統具備高性能。
- 易用。分布式存儲系統需要能夠提供易用的對外接口,另外,也要求具備完善的監控、運維工具,并能夠方便地與其他系統集成,例如,從Hadoop云計算系統導入數據。
????????分布式存儲系統的挑戰主要在于數據、狀態信息的持久化,要求在自動遷移、自動容錯、并發讀寫的過程中保證數據的一致性。分布式存儲涉及的技術主要來自兩個領域?:?分布式系統以及數據庫,如下所示:
- 數據分布:如何將數據分布到多臺服務器才能夠保證數據分布均勻?數據分布到多臺服務器后如何實現跨服務器讀寫操作?
- 一致性:如何將數據的多個副本復制到多臺服務器,即使在異常情況下,也能夠保證不同副本之間的數據一致性?
- 容錯:如何檢測到服務器故障?如何自動將出現故障的服務器上的數據和服務遷移到集群中其他服務器?
- 負載均衡:新增服務器和集群正常運行過程中如何實現自動負載均衡?數據遷移的過程中如何保證不影響已有服務?
- 事務與并發控制:如何實現分布式事務?如何實現多版本并發控制?
- 易用性:如何設計對外接口使得系統容易使用?如何設計監控系統并將系統的內部狀態以方便的形式暴露給運維人員?
- 壓縮/解壓縮:如何根據數據的特點設計合理的壓縮/解壓縮算法?如何平衡壓縮算法節省的存儲空間和消耗的CPU計算資源?
????????分布式存儲系統挑戰大,研發周期長,涉及的知識面廣。一般來講,工程師如果能夠深入理解分布式存儲系統,理解其他互聯網后臺架構不會再有任何困難。
2.?分布式存儲分類
分布式存儲面臨的數據需求比較復雜,大致可以分為三類:
- 非結構化數據?: 包括所有格式的辦公文檔、文本、圖片、圖像、音頻和視頻信息等。
- 結構化數據?: 一般存儲在關系數據庫中,可以用二維關系表結構來表示。結構化數據的模式(Schema,包括屬性、數據類型以及數據之間的聯系)和內容是分開的,數據的模式需要預先定義。
- 半結構化數據?: 介于非結構化數據和結構化數據之間,HTML文檔就屬于半結構化數據。它一般是自描述的,與結構化數據最大的區別在于,半結構化數據的模式結構和內容混在一起,沒有明顯的區分,也不需要預先定義數據的模式結構。
????????
????????不同的分布式存儲系統適合處理不同類型的數據,可以將分布式存儲系統分為四類分布式文件系統、分布式鍵值(Key-Value)系統、分布式表格系統和分布式數據庫。
1.分布式文件系統
????????互聯網應用需要存儲大量的圖片、照片、視頻等非結構化數據對象,這類數據以對象的形式組織,對象之間沒有關聯,這樣的數據一般稱為Blob(BinaryLarge Object,二進制大對象)數據。
????????分布式文件系統用于存儲Blob對象,典型的系統有FacebookHaystack以及TaobaoFile System(TFS)。另外,分布式文件系統也常作為分布式表格系統以及分布式數據庫的底層存儲,如谷歌的GFS(GoogleFile System,存儲大文件)可以作為分布式表格系統 Google Bigtable的底層存儲。
總體上看,分布式文件系統存儲三種類型的數據 :?Blob對象、定長塊以及大文件。在系統實現層面,分布式文件系統內部按照數據塊(chunk)來組織數據,每個數據塊的大小大致相同,每個數據塊可以包含多個Blob對象或者定長塊,一個大文件也可以拆分為多個數據塊,如圖1-1所示。分布式文件系統將這些數據塊分散到存儲集群,處理數據復制、一致性、負載均衡、容錯等分布式系統難題,并將用戶對 Blob 對象、定長塊以及大文件的操作映射為對底層數據塊的操作。
2.分布式鍵值系統
????????分布式鍵值系統用于存儲關系簡單的半結構化數據,它只提供基于主鍵的CRUD(Create/Read/Update/Delete)功能,即根據主鍵創建、讀取、更新或者刪除一條鍵值記錄。
????????典型的系統有 Amazon Dynamo以及 Taobao Tair。從數據結構的角度看,分布式鍵值系統與傳統的哈希表比較類似,不同的是,分布式鍵值系統支持將數據分布到集群中的多個存儲節點。分布式鍵值系統是分布式表格系統的一種簡化實現,一般用作緩存比如淘寶 Tair 以及 Memcache。一致性哈希是分布式鍵值系統中常用的數據分布技術因其被 Amazon DynamoDB系統使用而變得相當有名。
????????分布式鍵值系統是一種存儲和檢索鍵值對數據的分布式系統。它們通常用于需要高性能、可伸縮性和低延遲的應用程序。以下是分布式鍵值系統的一些優點、缺點和使用場景:
優點:
- 高性能:?分布式鍵值系統通常設計用于快速的數據訪問。由于數據存儲在內存中或者分布式存儲系統中,因此可以實現高速的讀寫操作。
- 可伸縮性:?分布式鍵值系統可以水平擴展,即通過增加更多的節點來處理更多的請求負載。這種可伸縮性使得系統能夠應對持續增長的數據量和用戶請求。
- 簡單的數據模型:?鍵值對是一種簡單的數據模型,易于理解和使用。這種簡單性使得開發人員能夠快速構建和維護應用程序。
- 靈活性:?鍵值對數據模型的靈活性使得它適用于多種用途,包括緩存、會話存儲、配置管理等。
缺點:
- 一致性和可用性權衡:?一些分布式鍵值系統在保證一致性的同時會犧牲一定程度的可用性,而一些系統則相反。這種一致性和可用性之間的權衡需要根據應用程序的需求進行選擇。
- 數據一致性:?在分布式環境中,確保數據的一致性是一個挑戰。一些系統可能會選擇犧牲一致性以獲得更高的性能【Redis】,而另一些系統則可能采用一致性協議來確保數據的一致性【Zookeeper】。
- 維護復雜性:?分布式系統的維護和管理比單機系統更加復雜。需要考慮到節點的故障處理、負載均衡、數據分區等問題。
- 網絡延遲和故障:?分布式系統通常依賴于網絡通信,在網絡延遲或者故障發生時,可能會影響系統的性能和可用性。
使用場景:
分布式鍵值系統在許多領域都有廣泛的應用,以下是一些常見的應用場景:
- 緩存:?分布式鍵值系統常用作緩存存儲,例如使用Redis或Memcached。它們能夠快速地存儲和檢索數據,從而提高應用程序的性能和響應速度。
- 會話存儲:?在分布式應用程序中,需要跨多個請求或服務之間共享會話信息。分布式鍵值系統可以用來存儲會話數據,確保用戶的會話狀態在整個應用程序集群中是一致的。【ZooKeeper等】
- 配置管理:?將應用程序的配置信息存儲在分布式鍵值系統中,可以實現配置的集中管理和動態更新。這樣可以簡化配置的部署和維護,同時保證配置的一致性。【ZooKeeper等】
- 元數據存儲:?許多分布式系統需要存儲元數據信息,例如文件系統、數據庫等。分布式鍵值系統可以用來存儲這些元數據,提供高性能和可伸縮的元數據訪問服務。【ZooKeeper等】
- 分布式鎖:?在分布式系統中,可能需要實現分布式鎖以確保對共享資源的并發訪問是安全的。分布式鍵值系統可以提供基于鎖的機制,用來實現分布式鎖。【ZooKeeper和Redis都可】
- 消息隊列:?一些分布式鍵值系統具有隊列功能,可以用作簡單的消息隊列。這樣可以實現消息的異步傳遞和處理,從而解耦應用程序的不同組件。【Redis和kafka等】
- 分布式計算:?在分布式計算任務中,需要對中間結果進行存儲和共享。分布式鍵值系統可以用來存儲這些中間結果數據,以便后續的計算任務使用。【Hive和Spark、Flink等】
????????總的來說,分布式鍵值系統具有高性能、可伸縮性和簡單的數據模型,適用于許多分布式應用場景。它們可以幫助提高應用程序的性能、可靠性和擴展性,從而滿足不同應用的需求。
3.分布式表格系統
分布式表格系統用于存儲關系較為復雜的半結構化數據,與分布式鍵值系統相比,分布式表格系統不僅僅支持簡單的CRUD操作,而且支持掃描某個主鍵范圍。分布式表格系統以表格為單位組織數據,每個表格包括很多行,通過主鍵標識一行,支持根據主鍵的 CRUD 功能以及范圍查找功能。
分布式表格系統借鑒了很多關系數據庫的技術,例如支持某種程度上的事務,比如單行事務,某個實體組(Entity Group,一個用戶下的所有數據往往構成一個實體組)下的多行事務。典型的系統包括GoogleBigtable以及Megastore,Microsoft Azure TableStorage,Amazon DynamoDB等。與分布式數據庫相比,分布式表格系統主要支持針對單張表格的操作,不支持一些特別復雜的操作,比如多表關聯,多表聯接,嵌套子查詢;另外,在分布式表格系統中,同一個表格的多個數據行也不要求包含相同類型的列,適合半結構化數據。分布式表格系統是一種很好的權衡,這類系統可以做到超大規模而且支持較多的功能,但實現往往比較復雜,而且有一定的使用門檻。
4.分布式數據庫
????????分布式數據庫一般是從單機關系數據庫擴展而來,用于存儲結構化數據。分布式數據庫采用二維表格組織數據,提供SQL關系查詢語言,支持多表關聯,嵌套子查詢等復雜操作,并提供數據庫事務以及并發控制。
????????典型的系統包括MYSQL數據庫分片(MYSQLSharding)集群,AmazonRDS以及Microsoft SQL Azure。分布式數據庫支持的功能最為豐富,符合用戶使用習慣,但可擴展性往往受到限制。當然,這一點并不是絕對的。GoogleSpanner系統是一個支持多數據中心的分布式數據庫,它不僅支持豐富的關系數據庫功能,還能擴展到多個數據中心的成千上萬臺機器。除此之外,阿里巴巴OceanBase系統也是一個支持自動擴展的分布式關系數據庫。
????????關系數據庫是目前為止最為成熟的存儲技術,它的功能極其豐富。然而,關系數據庫在可擴展性上面臨著巨大的挑戰。
????????傳統關系數據庫的事務以及二維關系模型很難高效地擴展到多個存儲節點上,另外,關系數據庫對于要求高并發的應用在性能上優化空間較大。
????????為了解決關系數據庫面臨的可擴展性、高并發以及性能方面的問題,各種各樣的非關系數據庫噴涌而現,這類系統成為NoSQL 系統,可以理解為“Not Only SQL”系統。