百度Tera數據庫介紹——類似cassandra,levelDB


轉自:https://my.oschina.net/u/2982571/blog/775452 

設計背景

百度的鏈接處理系統每天處理萬億級的超鏈數據,在過去,這是一系列Mapreduce的批量過程,對時效性收錄很不友好。在新一代搜索引擎架構設計中,我們采用流式、增量處理替代了之前的批量、全量處理。鏈接從被發現到存入鏈接庫再到被調度程序選出,變成一個全實時的過程。在這個實時處理過程中,無論鏈接的入庫還是選取,都需要對鏈接庫進行修改,存儲系統需要支持千萬甚至上億QPS的隨機讀寫。舊的存儲系統無論在單機性能,還是在擴展性方面,都無法滿足,所以我們設計了Tera。

鏈接存儲的需求

1. 數據按序存儲

        支持主域、站點和前綴等多維度統計、讀取。

2. 自動負載均衡  

        分區可以動態調整,在一個分區數據量變大或者訪問頻率過高時,可以自動切分,小的分區也可以自動合並。

3. 記錄包含時間戳和多個版本

        對於鏈接歷史抓取狀態等記錄,需要保留多個版本,對於策略回灌等場景,需要根據時間戳判斷,避免舊的數據覆蓋新的。

4. 強一致性

        寫入成功,立即可被所有的用戶看到。

5. 支持列存儲  

        在用戶只訪問固定的少數幾列時,能使用更小的IO,提供更高的性能(相對於訪問全記錄),要求底層存儲將這部分列在物理上單獨存儲。

設計目標

功能目標

1. 全局有序  

        key可以是任意字符串(二進制串),不限長度,比較邏輯可由用戶定義,按Key的范圍分區,分區內由單機維護有序,分區間由Master維護有序。

2. 多版本  

        每個字段(單元格)都可以保留指定多個版本,系統自動回收過期版本,用戶可以按時間戳存取

3. 自動分片  

        用戶不需要關心分片信息,系統自動處理熱點區間的分裂,數據稀疏區間的合並。
        單個分區的數據量超過閾值,自動切分為多個,單個分區的讀寫頻率增高時,自動切分

4. 自動負載均衡和擴容  

        單機上保存多個分區,分區的總大小和總訪問量達到閾值時,可以觸發將部分分區遷移到空閑的機器。

 

性能指標

Tera設計使用SSD+SATA磁盤混布機型。  

1. 單機吞吐  

        順序讀寫: 100MB/S  
        隨機讀1KB: 30000QPS  
        隨機寫1KB: 30000QPS  

2. 延遲  

        延遲和吞吐需要折衷考慮,在延遲敏感性不高的場合,使用延遲換吞吐策略,延遲定位在10ms級,寫操作延遲<50ms,讀延遲<10ms。  
        對於對延遲要求高的場合,讀寫延遲定位在<1ms,但吞吐會有損失,初期不做優化重點。  

3. 擴展性  

        水平擴展至萬台級別機器,單機管理百級別數據分片。

  數據量 系統吞吐
站點信息服務 10TB 百億次/天
用戶行為分析 1PB 百億次/天
超鏈存儲 10PB 萬億次/天
頁面存儲 100PB 萬億次/天

設計思路

數據存儲

1. 數據持久性

        為保證數據安全性,要使用三副本存儲,但維護副本的一致性與副本丟失恢復需要處理大量細節,基於一個分布式的文件系統構建,可以顯著降低開發代價,所以我們選擇了使用DFS(如BFS)
        系統的所有數據(用戶數據和系統元數據)都存儲在DFS上,通過DFS+WriteAheadLog保證數據的持久性,每次寫入,保證在DFS上三副本落地后,才返回成功。

2. 強一致性

        數據會按key分區存儲在DFS上,分區信息由Master統一管理,Master保證每個分區同一時間只由一個數據節點提供讀寫服務,保證一致性

3. 延遲換吞吐

        每次寫操作落地一次導致的性能問題可以通過批量落地實現,比如每10ms數據落地一次,在數據落地前寫操作不返回,代價是增加了5ms的平均響應時間

4. 存儲接口封裝

        Tera不會以某一種DFS作為唯一選擇,而是通過底層存儲接口的封裝,使其可搭建在其他分布式存儲之上,方便用戶根據個性化需求靈活地部署Tera。

 

希望了解更多?請點擊 https://github.com/baidu/tera


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM