傳統的關係型數據庫無法存放海量數據,因此HBase誕生,解決海量數據存取難題。當然除了HBase,還有很多其他類型的數據庫解決不同的問題。HBase的誕生參考了谷歌的這兩篇論文,值得閱讀:
HBase應用邏輯的基本概念有:
- 表:表有表名,其含有多個row
- row:由row key和多個column組成。行級別的數據是原子性的。
- column:儲存任意二進制數據。column可以達到上百萬個。數據可以有多個版本,每個版本的數據存在cell中。版本可以設置刪除策略,支持數量、過期時間策略。
- column family:由多個column組成。column family只能有幾十個。
HBase支持的操作有:對數據的CRUD、scan、CAS、計數器、coprocessor,還有建表、刪表、增加列族、修改列族、刪除列族。
- CURD:用row key去增刪改查
- scan:指定row key的範圍,批量取數據
- CAS:爲確保一致性而提供的操作,check and set,確認版本沒變過的情況下寫入數據
- 計數器:支持原子性的計數器操作
- coprocessor:協處理器,客戶端提交代碼在服務端運行,更快的處理數據
HBase運維層面的基本概念有:
- master節點:負責協調region在各個節點中的分佈,並將信息儲存在zookeeper中,一個集羣內可以起多個master節點,但同一時間只能有一個master掌握實權,其餘都是替補。
- region server:負責處理針對region的請求。一個region server內可以包含多個region。通常10~1000個region性能最優。客戶端直接與region server相連,請求直接發給它。
- region:最小負載單元,每個region包含表名、首行key、末行key。也就是說每個region負責一張表的一部分內容。如果region中數據量過多,則會進行自動拆分,分成兩個region,然後遷移到別的節點。
- HFile:包含多個塊,每個塊中儲存某個column數據的一部分。文件末尾是塊的索引。服務啓動時將塊索引加載到內存中。HFile儲存在HDFS中。
架構參考了LSM樹(log-structured sort-and-merge-map)。在HBase中,寫入的數據先寫到write-ahead log,然後放在內存memstore中,等到內存佔用達到閾值,做flush,將memstore中的內容寫到HDFS成爲HFile。當HFile數量較多時,做compation操作,將小文件合併成大文件。這種架構也被ElasticSearch、Cassandra、InfluxDB採用。