欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

HBase高并發(fā)原由之MySQL讀寫流程解析

2018-03-29 17:30:00 1439瀏覽

數(shù)據(jù)庫作為存儲系統(tǒng),所有業(yè)務訪問數(shù)據(jù)的操作都會轉(zhuǎn)化為底層數(shù)據(jù)庫系統(tǒng)的IO行為(緩存系統(tǒng)也可以當做是key-value的數(shù)據(jù)庫),本文主要介紹訪問MySQL數(shù)據(jù)庫的IO流程以及IO相關(guān)的參數(shù)。

一、MySQL的文件

首先簡單介紹一下MySQL的數(shù)據(jù)文件,MySQL 數(shù)據(jù)庫包含如下幾種文件類型:

1)數(shù)據(jù)文件 (datafile)

存放表中的具體數(shù)據(jù)的文件。

2)數(shù)據(jù)字典

記錄數(shù)據(jù)庫中所有innodb表的信息。

3)重做日志 (redolog)

記錄數(shù)據(jù)庫變更記錄的文件,用于系統(tǒng)異常crash(掉電)后的恢復操作,可以配置多個(配置這個參數(shù)innodb_log_files_in_group)比如 ib_logfile0、 ib_logfile1。

4)回滾日志 (undolog)

也存在于mysql 的ibdata文件,用戶記錄事務的回滾操作。注在mysql5.6以上版本可以拆開出來,單獨文件夾存在。

5)歸檔日志 (binlog)

事務提交之后,記錄到歸檔日志中。

6)中繼日志 (relaylog)

從master獲取到slave的中轉(zhuǎn)日志文件,sql_thread則會應用relay log并重放于從機器。

7)其他日志slowlolg, errorlog, querylog

這里慢日志也經(jīng)常用。可以結(jié)合pt-query-digest工具和anemometer一起展示出來。

對于以上文件的IO訪問順序可以分為順序訪問 比如binlog ,redolog ,relay log是順序讀寫,datafile,ibdata file是隨機讀寫,這些IO訪問的特點決定了在os 配置磁盤信息時候,如何考慮分區(qū) ,比如順序?qū)懣梢缘膌og可以放到SAS盤 ,隨機讀寫的數(shù)據(jù)文件可以放到ssd或者fio高性能的存儲。

二、數(shù)據(jù)訪問流程

數(shù)據(jù)庫訪問分為兩種類型, 一種是讀操作,另外一種是寫操作。

1)讀操作

create table t (

id int not null primary key ,

k1 int not null,

data varchar(50),

key ind_k1(k1)

) engine=innodb default charset=utf8;

以select * from tab where k1=1 ;為例。


讀操作的IO流程

1、查看緩存中是否存在id,

2、如果有則從內(nèi)存中訪問,否則要訪問磁盤,

3、并將索引數(shù)據(jù)存入內(nèi)存,利用索引來訪問數(shù)據(jù),

4、對于數(shù)據(jù)也會檢查數(shù)據(jù)是否存在于內(nèi)存,

5、如果沒有則訪問磁盤獲取數(shù)據(jù),讀入內(nèi)存。

6、返回結(jié)果給用戶。

2)寫操作

為了保證數(shù)據(jù)寫入操作的安全性,數(shù)據(jù)庫系統(tǒng)設置了 undo,redo 保護機制,避免因為os或者數(shù)據(jù)庫系統(tǒng)異常導致的數(shù)據(jù)丟失或者不一致的異常情況發(fā)生。

以insert into t values(1,1,’shuiyi’);為例。


寫操作的IO流程

我們假定數(shù)據(jù)在內(nèi)存中,不考慮從磁盤中獲取數(shù)據(jù)的情形,大致的寫操作步驟:

1、先寫undo log,

2、在內(nèi)存更新數(shù)據(jù),這步操作就在內(nèi)存中形成了臟頁,如果臟頁過多,checkpoint機制進行刷新,innodb_max_dirty_pages_pct決定了刷新臟頁比例。innodb_io_capacity參數(shù)可以動態(tài)調(diào)整刷新臟頁的數(shù)量,innodb_lru_scan_depth這個參數(shù)決定了刷新每個innodb_buffer_pool的臟頁數(shù)量。

3、記錄變更到redo log,prepare這里會寫事務id。innodb_flush_log_at_trx_commit決定了事務的刷盤方式。為0時,log buffer將每秒一次地寫入log file中,并且log file的flush(刷到磁盤)操作同時進行。該模式下,在事務提交的時候,不會主動觸發(fā)寫入磁盤的操作。為1,每次事務提交時MySQL都會把log buffer的數(shù)據(jù)寫入log file,并且flush(刷到磁盤)中去.為2,每次事務提交時MySQL都會把log buffer的數(shù)據(jù)寫入log file.但是flush(刷到磁盤)操作并不會同時進行。該模式下,MySQL會每秒執(zhí)行一次 flush(刷到磁盤)操作。

4、寫入binlog這里會寫入一個事務id這里有個sync_binlog參數(shù)決定多個事務進行一次性提交。

5、redo log第二階段,這里會進行判斷前2步是否成功,成功則默認commit,否則rollback。刷入磁盤操作。這里是先從臟頁數(shù)據(jù)刷入到內(nèi)存2M大小的doublewrite buffer,然后是一次性從內(nèi)存的doublewrite buffer刷新到共享表空間的doublewrite buffer,這里產(chǎn)生了一次IO。然后從內(nèi)存的內(nèi)存的doublewrite buffer刷新2m數(shù)據(jù)到磁盤的ibd文件中,這里需要發(fā)生128次io。然后校驗,如果不一致,就由共享表空間的副本進行修復。這里有個參數(shù)innodb_flush_method決定了數(shù)據(jù)刷新直接刷新到磁盤,繞后os cache。

6、返回給client。

如果有slave

第4步之后經(jīng)過slave服務線程io_thread寫到從庫的relay log ,再由sql thread應用relay log到從庫中。

關(guān)于性能?

寫undo redo log ,binlog的過程中都是順序?qū)懀紩芸斓耐瓿?隨機寫操作,inset_buffer功能。

對于非聚集類索引的插入和更新操作(5.5 版本及以上支持Update/Delete/Purge等操作的buffer功能),不是每一次都直接插入到索引頁中,而是先插入到內(nèi)存中。具體做法是:如果該索引頁在緩沖池中,直接插入;否則,先將其放入插入緩沖區(qū)中,再以一定的頻率和索引頁合并,就可以將同一個索引頁中的多個插入合并到一個IO操作中,改隨機寫為順序?qū)懀蟠筇岣邔懶阅堋?/span>

關(guān)于數(shù)據(jù)安全,這是數(shù)據(jù)庫寫入的重點?

1,2,3過程失敗就是事務失敗,因為此時還未寫入磁盤,對磁盤中的數(shù)據(jù)無影響,返回事務失敗給client,從庫也不會受到影響。 4,5過程失敗的時候或者已經(jīng)將寫成功返回給客戶,可以根據(jù)redo log的記錄來進行恢復,如果出現(xiàn)部分寫失效請參考《double write》。

MySQL的寫redo log的第一個階段會把所有需要做的操作做完,記錄數(shù)據(jù)變更,第二階段的工作比較簡單 ,只做事務提交確認。如果寫入binlog成功,而第二階段失敗,MySQL啟動時也會將事務進行重做,最終更新到磁盤中。MySQL 5.5 +的smei sync可以更好的保障主從的事務一致性。

三、文件訪問方式

IO 訪問的方式分為兩種順序讀寫和隨機讀寫, 在mysql 的io過程中可以以此來將數(shù)據(jù)庫文件分類

順序讀寫:

重做日志ib_logfile*,binlog file。

隨機讀寫:

innodb表數(shù)據(jù)文件,ibdata文件。

根據(jù)系統(tǒng)的訪問類型,對硬件做如下分類:

讀多SSD+RAID

寫多FIO(flashcache)

容量密集fio + flashcache

由于隨機io會嚴重降低系統(tǒng)的性能,在當前的硬件水平下,可以考慮選擇獎數(shù)據(jù)庫服務器配置ssd/fusionio。

四、影響IO的參數(shù)和策略

影響mysql io的參數(shù)有很多個,這里羅列幾個重要的參數(shù)。

innodb_buffer_pool_size

該參數(shù)控制innodb 緩存大小,用于緩存應用訪問的數(shù)據(jù),推薦配置為系統(tǒng)可用內(nèi)存的80%。

binlog_cache_size

該參數(shù)控制二進制日志緩沖大小,當事務還沒有提交時,事務日志存放于cache,當遇到大事務cache不夠用的時,mysql會把uncommitted的部分寫入臨時文件,等到committed的時候才會寫入正式的持久化日志文件。

innodb_max_dirty_pages_pct

該參數(shù)可以直接控制Dirty Page在BP中所占的比率,當dirty page 達到了該參數(shù)的閾值,就會觸發(fā)MySQL 系統(tǒng)刷新數(shù)據(jù)到磁盤。

innodb_flush_log_at_trx_commit

該參數(shù)確定日志文件何時write、flush。

為0,log buffer將每秒一次地寫入log file中,并且log file的flush(刷到磁盤)操作同時進行.該模式下,在事務提交的時候,不會主動觸發(fā)寫入磁盤的操作。

為1,每次事務提交時MySQL都會把log buffer的數(shù)據(jù)寫入log file,并且flush(刷到磁盤)中去.

為2,每次事務提交時MySQL都會把log buffer的數(shù)據(jù)寫入log file.但是flush(刷到磁盤)操作并不會同時進行。該模式下,MySQL會每秒執(zhí)行一次 flush(刷到磁盤)操作。

注意:

由于進程調(diào)度策略問題,這個“每秒執(zhí)行一次flush(刷到磁盤)操作”并不是保證100%的“每秒”。

sync_binlog

sync_binlog的默認值是0,像操作系統(tǒng)刷其他文件的機制一樣,MySQL不會同步到磁盤中去而是依賴操作系統(tǒng)來刷新binary log。

當sync_binlog =N (N>0) ,MySQL 在每寫 N次 二進制日志binary log時,會使用fdatasync()函數(shù)將它的寫二進制日志binary log同步到磁盤中去。

innodb_flush_method

該參數(shù)控制日志或數(shù)據(jù)文件如何write、flush。可選的值為 fsync, o_dsync ,o_direct,littlesync,nosync

fdatasync模式:寫數(shù)據(jù)時,write這一步并不需要真正寫到磁盤才算完成(可能寫入到操作系統(tǒng)buffer中就會返回完成),真正完成是flush操作,buffer交給操作系統(tǒng)去flush,并且文件的元數(shù)據(jù)信息也都需要更新到磁盤。

O_DSYNC模式:寫日志操作是在write這步完成,而數(shù)據(jù)文件的寫入是在flush這步通過fsync完成。

O_DIRECT模式:數(shù)據(jù)文件的寫入操作是直接從mysql innodb buffer到磁盤的,并不用通過操作系統(tǒng)的緩沖,而真正的完成也是在flush這步,日志還是要經(jīng)過OS緩沖。

注意:關(guān)于mysql 和io相關(guān)的參數(shù),并不是一成不變的,需要根據(jù)自身業(yè)務系統(tǒng)和硬件系統(tǒng)做相應調(diào)整,系統(tǒng)上線之前,測試出一個最佳值。

五、小結(jié)

數(shù)據(jù)庫的io是一個很復雜和細致的知識層面,涉及數(shù)據(jù)庫層和OS層面的IO寫入策略,也和硬件的配置有關(guān),最后想要了解更多關(guān)于大數(shù)據(jù)發(fā)展前景趨勢,請關(guān)注扣丁學堂大數(shù)據(jù)培訓官網(wǎng)、微信等平臺,扣丁學堂IT職業(yè)在線學習教育平臺為您提供權(quán)威的大數(shù)據(jù)視頻教程系統(tǒng),通過千鋒旗下金牌講師在線錄制的大數(shù)據(jù)視頻教程系統(tǒng),讓你快速掌握大數(shù)據(jù)從入門到精通大數(shù)據(jù)開發(fā)實戰(zhàn)技能??鄱W堂大數(shù)據(jù)學習群:209080834。



扣丁學堂微信公眾號



關(guān)注微信公眾號獲取更多學習資料



查看更多關(guān)于“大數(shù)據(jù)培訓資訊的相關(guān)文章>>


標簽: 大數(shù)據(jù)分析 大數(shù)據(jù)培訓 大數(shù)據(jù)視頻教程 Hadoop視頻教程 大數(shù)據(jù)開發(fā)工程師 大數(shù)據(jù)在線視頻

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部