大型互聯網站解決海量數據的常見策略

文章來源:http://www.javabloger.com/article/big-data-architecture.html

 

大型互聯網站的數據存儲與傳統存儲環境相比不僅是一個服務器、一個數據庫那麼簡單,而是由網絡設備、存儲設備、應用服務器、公用訪問接口、應用程序 等多個部分組成的複雜系統。分爲 業務數據層、計算層、數據倉儲、數據備份,通過應用服務器軟件提供數據存儲服務,並且通過監控工具對存儲單元監控。

    隨着系統中用戶數據量的線性增長,數據量將會越來越多。在這樣一個數據不斷膨脹的環境中,數據已經如洪水般洶涌氾濫。數據查找和調用困難,在海量數據中一些用戶提交的請求往往要等到第二天才能得知結果,直接影響到了用戶滿意度的提升和新業務的佈局。在技術上而言,這一特點使得RDBMS在大型應用場景被大幅限制,唯一的可選方案是Scale Out,通過增加多個邏輯單元的資源,並使它們如同一個集中的資源那樣提供服務來實現系統的擴展性。

   系統中的數據就好比我們家裏的物品,衣服放在衣櫃裏,碟子放在碗櫥裏,數據庫、存儲系統就好比你的衣櫃和碗櫥是一個存放的容器,衣服和碟子就好比不同的數據,將不同類型的東西放入合適的存儲空間裏面,這樣系統的效率和利用率將會更高,所以我們將會做出如下設計,如圖所示:

對於大型系統存儲單元的結構模型我們分爲6個部分組成,清單如下:

1. 業務數據層
各類業務所產生的各種文件類型的數據,其中包含 用戶信息、用戶操作記錄、實時業務數據、手機客戶端升級應用程序、圖片,等。

2. 計算層
針對不同的數據格式、不同類型的數據文件,通過不同的工具、計算方法進行操作,針對大量的數據計算採用一些分佈式、並行計算的算法,例如:MapReduce,BSP。並且對一部分的數據進行緩存,緩解對存儲應用服務器的壓力。

3. 數據存儲層
對於海量數據的查詢與存儲,特別是針對用戶行爲日誌操作,需要使用到一些列式數據庫服務器,對於處理業務和一些業務規則的數據依然存放在關係型數據庫中,將採用MySQL來存儲。

4. 數據倉儲
數據存儲主要是針對於用戶行爲日誌和用戶行爲分析,也是系統中數據量產生較大的一個環節,將會採用Apache Hive、Pig、Mathout 對數據倉儲進行構建。

5. 數據備份
分爲在線數據備份和離線數據備份,數據備份環節需要經過運維經驗的積累,根據業務和用戶訪問量進行定製合理的備份規律。

6. 硬件
硬件環境是存儲單元最基礎的部分,分爲磁盤、內存、網絡設備存儲,將不同的業務數據、文件存儲在不同的硬件設備上。

技術實現
對於系統不同的業務數據和應用服務器的架構需要採用不同的讀寫方式,以及數據存儲類型存放,數據倉儲構建,數據冷熱分離、數據索引多個部分組成。例如:業務應用程序、日誌採集代理、用戶空間文件系統(Filesystem in Userspace)。Data Access Proxy Layer(DDAL/Cache Handler)、OLAP、日誌服務器、Oracle(暫定)、MySQL、Redis、Hive、HDFS、Moosefs。

如圖所示:

查看大圖請點擊這裏

針對以上設計架構,描述清單如下:

1. Data Access Proxy Layer
統稱數據訪問代理層(簡稱 DAPL),封裝了DDAL和Cache Handler層,抽象的對編寫的應用程序進行了劃分,便於擴展和維護,例如:需要對HDFS或者圖形數據庫操作,上層不需要知道HDFS具體操作,只需要關注提供的接口。DAPL封裝了很多訪問各種數據源的讀寫策略。因此,可以保證對不同數據庫、數據源操作的事務完整性。

2. DDAL
統稱分佈式數據訪問層(簡稱 DDAL)主要針對關係數據庫的讀寫分離操作,需要做到讀寫分離,首先需要對傳入的SQL語句進行解析,並且採用Round-Robin算法負載分載對數據大量讀取的操作,在代碼實現中將使用MySQL-JDBC中的參數配置實現對MySQL-Slave的讀取壓力分載。

3. Cache Handler
與DDAL的相似,具體區別在於自己實現了Round-Robin算法負載分載對數據大量讀取的操作,並且能在Redis Master當機的狀態下重新指派新的Master進行寫的操作。

4. Redis一主多從
對緩存數據進行讀寫分離,減少單臺機器的I/O瓶頸,值得一提的是Cache不是可靠的存儲,所以在設計時,需要容許Cache的數據丟失,因此,Cache的數據全部失效時,會從數據庫裏重新裝載。

5. MySQL雙主多從
這種方式是MySQL架構設計中最折中的方案,對數據的訪問壓力分載和數據的可靠性都有了相應的保障。前端2臺Master MySQL相互進行數據備份,後端大量的Slave MySQL對Master寫入的數據進行同步,所以每臺機器節點上的MySQL數據庫中的數據都是一致的,並且DDAL應用程序將數據輪詢寫入Master MySQL數據庫中。

6. 數據庫讀寫分離
主要採用mysql的策略,學習MySQL-Prxoy的策略,自己開發對MySQL書籍節點進行讀寫分離的方法,MySQL驅動支持讀寫分離的數據完整性,當數據量超大規模的時候將會採用Sharding策略。

7. 緩存讀寫分離
緩存Redis的策略,採用自己開發的應用程序需要實現Round Robin算法,對Redis Master和Slave緩存集羣進行讀寫分離操作。

8. ETL Tools
採用Apache Hadoop項目中的Pig對海量的行爲數據進行清洗,Pig可以針對有規律的半結構化數據執行類似SQL的腳本,並且可以將計算壓力分載到每臺服務器上進行分佈式、並行處理。

9. Hive集羣
針對數據倉庫的建設由Apache Hive進行構建,是一個建立在Hadoop上的數據倉庫框架,它提供了一個方便的數據集成方法和類似SQL的Hive QL查詢語言,實現了Map/Reduce算法支持在Hadoop框架上進行大規模數據分析。

10. HDFS分佈式文件系統
Hive中的數據全部存儲在Hadoop分佈式文件系統中,所有被存儲的數據都會有數據的存儲副本,這樣對數據的可靠性有了保障。

11. Moosefs分佈式文件系統
與上面提到的HDFS一個文件系統是有區別的,Moosefs不需要任何客戶端程序對分佈式文件進行操作的服務器,可以直接與任何運行環境進行對接,而且服務端也有副本複製的功能。

12. 冷熱數據分離
將系統中產生的進行歸類存放,將用戶更多關心、熱門話題等內容 抽象爲“最近幾天”的“熱數據”,而越早的數據我們在設計中抽象的分爲“冷數據”。由此可見,“熱節點”存放最新的、被訪問頻率較高的數據。對於這部分數據,我們希望能給用戶提供儘可能快的查詢速度,因此無論在硬件還是軟件的選擇上都會有了明顯的區分,例如:最近常訪問頻率高的數據將會存儲在系統緩存中,需要經常性被的業務數據將會存儲在MySQL或者Oracle數據庫系統中,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章