淺談MySQL、Hadoop、BigTable、Clickhouse數據讀寫機制

個人理解 , 歡迎指正
數據庫引擎寫數據讀數據補充MySqlInnoDB:支持事務,高速讀寫性能一般
Myisam:不支持事務,高速讀寫性能好
以InnoDB更新一條記錄為例
1、B+Tree搜索找到這行記錄,如果數據頁在內存直接返回給【執行器】,否則從磁盤讀入內存再返回
2、【執行器】更新數據,再調用【引擎】接口寫入這行新數據
3、【引擎】將舊數據備份到undo log,然后更新內存中數據頁的這行數據 , 同時將操作記錄寫到redo log里,此時redo log 處于prepare狀態
4、【執行器】記錄binlog日志
5、【執行器】調用引擎接口,【引擎】將redo log改成commit狀態
6、此時更新就算完成了 , 【InnoBD引擎】會在適當的時候將操作記錄批量刷到磁盤,并清理redo log
其基本流程是:先去緩存頁查找,若沒有則通過B+Tree檢索到葉子節點對應的數據頁,然后加到緩存頁并返回redo log(重做日志)和 binlog(歸檔日志)
1、redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 層實現的,所有引擎都可以使用 。
2、redo log 是物理日志 , 記錄的是“在某個數據頁上做了什么修改”;binlog 是邏輯日志,記錄的是這個語句的原始邏輯,比如“給 ID=2 這一行的 c 字段加 1 ” 。
3、redo log 是循環寫的,空間固定會用完;binlog 是可以追加寫入的 。“追加寫”是指 binlog 文件寫到一定大小后會切換到下一個,并不會覆蓋以前的日志 。
Hadoop存儲:HDFS
計算:MapReduce
HDFS寫數據
【淺談MySQL、Hadoop、BigTable、Clickhouse數據讀寫機制】1、Client向NameNode請求上傳Block(文件塊)
2、NameNode向Client返回DataNode地址
3、Client以Package為單位向DataNode依次寫入,直到寫完整個Block
4、每傳輸完一個Package,DataNode會向Clent返回一個ack,若失敗會重試
HDFS讀數據
1、Client向NameNode請求下載文件
2、NameNode按負載均衡和節點距離返回DataNode給Client
3、Client讀取DataNode,以Package為單位拉取 , 先存入緩存,最后生成文件,中間有checksum校驗
MapReduce運算
1、InputFormat會從DataNode拉取一個個Bolck塊
2、然后啟動若干個MapTask對Block數據做運算
3、運算后的結果經過Shuffer落到磁盤
4、然后啟動若干個ReduceTask從磁盤讀取數據進行聚合
5、最后通過OutputFormat把結果寫到HDFS或其他存儲介質里
BigTableSSTable其實SSTable文件也是存在GFS上,但GFS不支持隨機寫【增刪改】,那么BigTable是如何實現的呢?
1、其實BigTable在內存里維護了一個內存表(MemTable),每次數據【增刪改】都會增加一條記錄 , 并附帶版本 。當容量到達閥值的時候會把MemTable轉成SSTable【順序寫】到GFS上,后續數據繼續寫新的MemTable
2、另外,會啟動一個后臺進程(Major Compaction機制),不斷的合并SSTable,只保留【增刪改】的最終數據,老版本的數據被刪除
當查詢數據時,會去讀取索引數據,找到數據塊返回給Tablet Server,再從這個數據塊里提取出對應的 KV 數據返回給客戶端
1、內存里緩存 BloomFilter , 使得對于不存在于 SSTable 中的行鍵,可以直接過濾掉,無需訪問 SSTable 文件才能知道它并不存在
2、通過 Scan Cache 和 Block Cache 這兩層緩存,利用局部性原理,使得查詢結果可以在緩存中找到,而無需訪問 GFS 上的硬盤
3、經過前2步還沒找到 , 會通過SSTable索引來查找,底層是AVL紅黑樹或跳表,隨機讀寫都是O(log n)
1、SSTable 的文件格式是由兩部分組成:
數據塊(data block),就是實際要存儲的行鍵、列、值以及時間戳 , 這些數據會按照行鍵排序分成一個個固定大小的塊(block)來進行存儲 。
元數據塊(meta block),是一系列的元數據和索引信息 , 這其中包括用來快速過濾當前 SSTable 中不存在的行鍵的布隆過濾器 , 以及整個數據塊的一些統計指標 。
另外還有針對數據塊和元數據塊的索引(index),這些索引內容,則分別是元數據索引塊(metaindex block)和數據索引塊(index block)
2、因為 SSTable 里面的數據塊是順序存儲的,所以Major Compaction做的是一個有序鏈表的多路歸并,這個過程中在磁盤上是順序讀寫
Clickhouse表引擎主要是MergeTree系列 , 還有Log系列等其他引擎1、一個Table是由多個Partition組成,一個Partition是由多個Part組成,Part里按column【列式存儲】
2、舊數據在一個Part , 新數據會寫另一個Part,然后通過MergeTree引擎將多個Part異步合并(按排序鍵歸并排序)

推薦閱讀