免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

淺談MySQL、Hadoop、BigTable、Clickhouse數(shù)據(jù)讀寫機(jī)制

個(gè)人理解 , 歡迎指正
數(shù)據(jù)庫引擎寫數(shù)據(jù)讀數(shù)據(jù)補(bǔ)充MySqlInnoDB:支持事務(wù) , 高速讀寫性能一般
Myisam:不支持事務(wù) , 高速讀寫性能好
以InnoDB更新一條記錄為例
1、B+Tree搜索找到這行記錄 , 如果數(shù)據(jù)頁在內(nèi)存直接返回給【執(zhí)行器】 , 否則從磁盤讀入內(nèi)存再返回
2、【執(zhí)行器】更新數(shù)據(jù) , 再調(diào)用【引擎】接口寫入這行新數(shù)據(jù)
3、【引擎】將舊數(shù)據(jù)備份到undo log , 然后更新內(nèi)存中數(shù)據(jù)頁的這行數(shù)據(jù) , 同時(shí)將操作記錄寫到redo log里 , 此時(shí)redo log 處于prepare狀態(tài)
4、【執(zhí)行器】記錄binlog日志
5、【執(zhí)行器】調(diào)用引擎接口 , 【引擎】將redo log改成commit狀態(tài)
6、此時(shí)更新就算完成了 , 【InnoBD引擎】會(huì)在適當(dāng)?shù)臅r(shí)候?qū)⒉僮饔涗浥克⒌酱疟P , 并清理redo log
其基本流程是:先去緩存頁查找 , 若沒有則通過B+Tree檢索到葉子節(jié)點(diǎn)對(duì)應(yīng)的數(shù)據(jù)頁 , 然后加到緩存頁并返回redo log(重做日志)和 binlog(歸檔日志)
1、redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 層實(shí)現(xiàn)的 , 所有引擎都可以使用 。
2、redo log 是物理日志 , 記錄的是“在某個(gè)數(shù)據(jù)頁上做了什么修改”;binlog 是邏輯日志 , 記錄的是這個(gè)語句的原始邏輯 , 比如“給 ID=2 這一行的 c 字段加 1 ” 。
3、redo log 是循環(huán)寫的 , 空間固定會(huì)用完;binlog 是可以追加寫入的 。“追加寫”是指 binlog 文件寫到一定大小后會(huì)切換到下一個(gè) , 并不會(huì)覆蓋以前的日志 。
Hadoop存儲(chǔ):HDFS
【淺談MySQL、Hadoop、BigTable、Clickhouse數(shù)據(jù)讀寫機(jī)制】計(jì)算:MapReduce
HDFS寫數(shù)據(jù)
1、Client向NameNode請(qǐng)求上傳Block(文件塊)
2、NameNode向Client返回DataNode地址
3、Client以Package為單位向DataNode依次寫入 , 直到寫完整個(gè)Block
4、每傳輸完一個(gè)Package , DataNode會(huì)向Clent返回一個(gè)ack , 若失敗會(huì)重試
HDFS讀數(shù)據(jù)
1、Client向NameNode請(qǐng)求下載文件
2、NameNode按負(fù)載均衡和節(jié)點(diǎn)距離返回DataNode給Client
3、Client讀取DataNode , 以Package為單位拉取 , 先存入緩存 , 最后生成文件 , 中間有checksum校驗(yàn)
MapReduce運(yùn)算
1、InputFormat會(huì)從DataNode拉取一個(gè)個(gè)Bolck塊
2、然后啟動(dòng)若干個(gè)MapTask對(duì)Block數(shù)據(jù)做運(yùn)算
3、運(yùn)算后的結(jié)果經(jīng)過Shuffer落到磁盤
4、然后啟動(dòng)若干個(gè)ReduceTask從磁盤讀取數(shù)據(jù)進(jìn)行聚合
5、最后通過OutputFormat把結(jié)果寫到HDFS或其他存儲(chǔ)介質(zhì)里
BigTableSSTable其實(shí)SSTable文件也是存在GFS上 , 但GFS不支持隨機(jī)寫【增刪改】 , 那么BigTable是如何實(shí)現(xiàn)的呢?
1、其實(shí)BigTable在內(nèi)存里維護(hù)了一個(gè)內(nèi)存表(MemTable) , 每次數(shù)據(jù)【增刪改】都會(huì)增加一條記錄 , 并附帶版本 。當(dāng)容量到達(dá)閥值的時(shí)候會(huì)把MemTable轉(zhuǎn)成SSTable【順序?qū)憽康紾FS上 , 后續(xù)數(shù)據(jù)繼續(xù)寫新的MemTable
2、另外 , 會(huì)啟動(dòng)一個(gè)后臺(tái)進(jìn)程(Major Compaction機(jī)制) , 不斷的合并SSTable , 只保留【增刪改】的最終數(shù)據(jù) , 老版本的數(shù)據(jù)被刪除
當(dāng)查詢數(shù)據(jù)時(shí) , 會(huì)去讀取索引數(shù)據(jù) , 找到數(shù)據(jù)塊返回給Tablet Server , 再從這個(gè)數(shù)據(jù)塊里提取出對(duì)應(yīng)的 KV 數(shù)據(jù)返回給客戶端
1、內(nèi)存里緩存 BloomFilter , 使得對(duì)于不存在于 SSTable 中的行鍵 , 可以直接過濾掉 , 無需訪問 SSTable 文件才能知道它并不存在

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀