国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MySQL如何保證數(shù)據(jù)的可靠性(保證數(shù)據(jù)不丟失)

這篇具有很好參考價(jià)值的文章主要介紹了MySQL如何保證數(shù)據(jù)的可靠性(保證數(shù)據(jù)不丟失)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 結(jié)論:

只要redo logbinlog 保證持久化到磁盤(pán),就能確保MySQL異常重啟后,數(shù)據(jù)可以恢復(fù)。

2. 機(jī)制

WAL機(jī)制,(Write Ahead Log): 事務(wù)先寫(xiě)入日志,后持久化到磁盤(pán)。

3. binlog 寫(xiě)入機(jī)制

MySQL如何保證數(shù)據(jù)的可靠性(保證數(shù)據(jù)不丟失)

流程

  • 每個(gè)線程內(nèi)都有一個(gè)binlog cache,記錄先寫(xiě)入binlog cache,所有線程共享一個(gè)binlog文件
  • binlog cache write into binlog file, binlog file 是存儲(chǔ)在文件操作系統(tǒng)的page cache中。
  • binlog file 通過(guò) fsync持久化到磁盤(pán)。

解釋

  • write是內(nèi)存之間的操作,速度很快。
  • fsync是內(nèi)存和磁盤(pán)之間的操作,速度慢,占據(jù)磁盤(pán)的IOPS。

寫(xiě)入控制策略

write和fsync的時(shí)機(jī)可調(diào),參數(shù)sync_binlog可以控制

  1. sync_binlog = 0 ,每次提交事務(wù)只write, 不fsync.
  2. sync_binlog = 1, 每次提交事務(wù)都會(huì)執(zhí)行fsync。
  3. sync_binlog= N, 每次提交事務(wù)都write, 但累積N個(gè)事務(wù)后才fsync,N 的取值范圍為(100,1000)。
    通俗理解,sync_binlog 控制的是fsync的時(shí)機(jī),處于數(shù)據(jù)恢復(fù)和效率,一般不取0和1,

4. redo log 寫(xiě)入機(jī)制

MySQL如何保證數(shù)據(jù)的可靠性(保證數(shù)據(jù)不丟失)

流程

  1. redo log 先寫(xiě)入 redo log buffer中,存儲(chǔ)在mysql的進(jìn)程中。(內(nèi)存)
  2. 寫(xiě)到(write)page cache, 存儲(chǔ)在文件系統(tǒng)的頁(yè)緩存中。(內(nèi)存)
  3. 持久化(fsync)到磁盤(pán)。

寫(xiě)入控制策略

redo log的寫(xiě)入控制同樣是通過(guò)參數(shù)去調(diào)整:innodb_flush_log_at_trx_commit
從參數(shù)名就可以看出, 是innodb提供的在事務(wù)提交時(shí)redo_log的刷盤(pán)策略

  1. 設(shè)置為0表示 每次事務(wù)提交時(shí)都把redo log留在 redo log buffer。
  2. 設(shè)置為1表示 每次事務(wù)提交時(shí)都將 redo log 直接持久化到磁盤(pán)中。
  3. 設(shè)置為2表示 每次事務(wù)提交時(shí)都只是把redo log 寫(xiě)到page cache。

此外,Innodb存在一個(gè)后臺(tái)線程,每隔1秒,機(jī)會(huì)將redo lo個(gè)buffer中的日志,刷盤(pán)到page cache,然后持久化到磁盤(pán)中。

5. 兩階段提交機(jī)制

MySQL如何保證數(shù)據(jù)的可靠性(保證數(shù)據(jù)不丟失)
MySQL一般采用的是雙“1”策略,就是sync_binlog 和 innodb_flush_log_at_trx_commit都為1。
換言之,一次完整的事務(wù)提交需要等待兩次刷盤(pán),一次是在redo log(prepare) fsync,一次是在寫(xiě)binlog中fsync。
引發(fā)新的問(wèn)題:
如果MySQL的TPS為每秒2萬(wàn),按照兩階段提交,每秒機(jī)會(huì)有四萬(wàn)次寫(xiě)磁盤(pán),但是
磁盤(pán)能力就2萬(wàn)每秒,如何實(shí)現(xiàn)兩萬(wàn)的TPS?
換言之:就是在遇到磁盤(pán)瓶頸時(shí),如何優(yōu)化,減少刷盤(pán)次數(shù)

組提交機(jī)制(group commit)

LSN

在介紹組提交之前,需要了解日志邏輯序列號(hào)(log sequence number, LSN),這是一個(gè)單調(diào)遞增,且對(duì)應(yīng)redo log的寫(xiě)入點(diǎn),每次寫(xiě)入長(zhǎng)度為length的redo log, LSN的值就會(huì)加上length。
這段話比較難理解,可以看圖理解。
MySQL如何保證數(shù)據(jù)的可靠性(保證數(shù)據(jù)不丟失)

redo log 采用組提交的示例

圖片來(lái)自《MySQL45講》
MySQL如何保證數(shù)據(jù)的可靠性(保證數(shù)據(jù)不丟失)

  1. trx1 是第一個(gè)到達(dá)的,會(huì)被選為這組的 leader;
  2. 等 trx1 要開(kāi)始寫(xiě)盤(pán)的時(shí)候,這個(gè)組里面已經(jīng)有了三個(gè)事務(wù),這時(shí)候 LSN 也變成了 160;
  3. trx1 去寫(xiě)盤(pán)的時(shí)候,帶的就是 LSN=160,因此等 trx1 返回時(shí),所有 LSN 小于等于 160 的 redo log,都已經(jīng)被持久化到磁盤(pán);
  4. 這時(shí)候 trx2 和 trx3 就可以直接返回。

總結(jié):一次組提交里面,組員越多,節(jié)約磁盤(pán) IOPS 的效果越好。
在并發(fā)場(chǎng)景下,為了盡可能多的的在一次組提交內(nèi)包含更多的組員,第一個(gè)事務(wù)在寫(xiě)完redo log buffer之后,接下來(lái)的fsync需要盡可能的晚調(diào)用。

優(yōu)化

在MySQL 中就有這樣的優(yōu)化:為了讓一次fsync帶的組員更多,采取拖時(shí)間。
將redo log prepare分成兩個(gè)階段

  • write: 將redolog cache 寫(xiě)入 page cache
  • fsync:: 將page cache中的redo log 日志持久化到磁盤(pán)中。
    將binlog 分成兩個(gè)階段:
  • write : 將日志從binlog cache寫(xiě)入page cache中的binlog文件
  • fsync: 將binlog文件持久化到磁盤(pán)。

MySQL如何保證數(shù)據(jù)的可靠性(保證數(shù)據(jù)不丟失)
本著拖時(shí)間的原則來(lái)分析:
將 prepare 階段的 fsync 拖到binlog的write之后,
同樣binlog的fsync 拖到了 redo log的fsync之后,
優(yōu)化后的方案:redo log 和bin log 都實(shí)現(xiàn)了組提交。
區(qū)別在于 binlog的組提交帶來(lái)的優(yōu)化效果不如 redo log,主要原因是拖的時(shí)間不長(zhǎng)
大佬原話:
MySQL如何保證數(shù)據(jù)的可靠性(保證數(shù)據(jù)不丟失)
但是可以通過(guò)參數(shù)來(lái)控制:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-484957.html

  1. binlog_group_commit_sync_delay ;表示延遲多少微秒后才調(diào)用 fsync;
  2. binlog_group_commit_sync_no_delay_count ,表示累積多少次以后才調(diào)用 fsync。
    兩條件是或的關(guān)系,滿足一個(gè)就會(huì)調(diào)用fsync。

到了這里,關(guān)于MySQL如何保證數(shù)據(jù)的可靠性(保證數(shù)據(jù)不丟失)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • rabbitmq如何保證消息的可靠性

    RabbitMQ可以通過(guò)以下方式來(lái)保證消息的可靠性: 在發(fā)布消息時(shí),可以設(shè)置消息的delivery mode為2,這樣消息會(huì)被持久化存儲(chǔ)在磁盤(pán)上,即使RabbitMQ服務(wù)器重啟,消息也不會(huì)丟失。 可以創(chuàng)建持久化的隊(duì)列,這樣即使RabbitMQ服務(wù)器重啟,隊(duì)列也不會(huì)丟失。 在消費(fèi)者端,可以 設(shè)置手動(dòng)

    2024年01月23日
    瀏覽(26)
  • 如何保證 RabbitMQ 的消息可靠性?

    如何保證 RabbitMQ 的消息可靠性?

    項(xiàng)目開(kāi)發(fā)中經(jīng)常會(huì)使用消息隊(duì)列來(lái) 完成異步處理、應(yīng)用解耦、流量控制等功能 。雖然消息隊(duì)列的出現(xiàn)解決了一些場(chǎng)景下的問(wèn)題,但是同時(shí)也引出了一些問(wèn)題,其中使用消息隊(duì)列時(shí)如何保證消息的可靠性就是一個(gè)常見(jiàn)的問(wèn)題。 如果在項(xiàng)目中遇到需要保證消息一定被消費(fèi)的場(chǎng)景

    2024年02月07日
    瀏覽(27)
  • 如何保證消息的可靠性(面試題)

    如何保證消息的可靠性(面試題)

    面試題 :Rebbitmq怎么保證消息的可靠性 消費(fèi)者在接收到消息后,默認(rèn)情況下RabbitMQ會(huì)自動(dòng)確認(rèn)消息(autoAck=true)。為保證消息可靠性,可以設(shè)置autoAck=false,使得消費(fèi)者在處理完消息后手動(dòng)發(fā)送確認(rèn)(basicAck)。如果消費(fèi)者在處理過(guò)程中發(fā)生異?;蛘呶赐瓿商幚砭徒K止運(yùn)行,那

    2024年04月14日
    瀏覽(26)
  • TCP如何保證服務(wù)的可靠性

    TCP如何保證服務(wù)的可靠性

    TCP保證可靠性一般有以下幾種方法: (1) 確認(rèn)應(yīng)答 :ACK和序列號(hào) (2) 超時(shí)重傳 :發(fā)送數(shù)據(jù)包在一定的時(shí)間周期內(nèi)沒(méi)有收到相應(yīng)的ACK,等待一定的時(shí)間,超時(shí)之后就認(rèn)為這個(gè)數(shù)據(jù)包丟失,就會(huì)重新發(fā)送 (3) 流量控制 :控制發(fā)送方發(fā)送窗口的大小來(lái)實(shí)現(xiàn)流量控制 (4) 擁

    2024年02月15日
    瀏覽(20)
  • Kafka—工作流程、如何保證消息可靠性

    Kafka—工作流程、如何保證消息可靠性

    分布式事件流平臺(tái) 。希望不僅僅是存儲(chǔ)數(shù)據(jù),還能夠數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)分析、數(shù)據(jù)集成等功能。消息隊(duì)列(把數(shù)據(jù)從一方發(fā)給另一方),消息生產(chǎn)好了但是消費(fèi)方不一定準(zhǔn)備好了(讀寫(xiě)不一致),就需要一個(gè)中間商來(lái)存儲(chǔ)信息,kafka就是中間商 架構(gòu)圖如下: 名稱 解釋 Broker 消

    2024年02月11日
    瀏覽(26)
  • 【HBZ分享】TCP可靠性傳輸如何保證的?

    ACK機(jī)制是發(fā)送方與接收方的一個(gè)相互確認(rèn) 客戶端向服務(wù)端發(fā)送連接請(qǐng)求,此時(shí)服務(wù)端要回饋給客戶端ACK,以表示服務(wù)端接到了客戶端請(qǐng)求,這是第一和的第二次握手 客戶端接收到服務(wù)端響應(yīng)后,同樣也要回饋服務(wù)端的響應(yīng),告知服務(wù)端我收到了你的回饋,我們可以進(jìn)行傳輸

    2024年02月10日
    瀏覽(20)
  • 計(jì)算機(jī)網(wǎng)絡(luò)-TCP如何保證傳輸可靠性

    計(jì)算機(jī)網(wǎng)絡(luò)-TCP如何保證傳輸可靠性

    TCP協(xié)議傳輸?shù)奶攸c(diǎn)主要就是面向字節(jié)流、傳輸可靠、面向連接。 TCP協(xié)議如何確保傳輸?shù)目煽啃缘? TCP協(xié)議保證數(shù)據(jù)傳輸可靠性的方式主要有: 1.校驗(yàn)和 2.序列號(hào) 3.確認(rèn)應(yīng)答 4.超時(shí)重傳 5.連接管理 6.流量控制 7.擁塞控制 1.校驗(yàn)和 發(fā)送方:在發(fā)送數(shù)據(jù)之前計(jì)算檢驗(yàn)和,并進(jìn)行校驗(yàn)

    2024年02月05日
    瀏覽(25)
  • rabbitmq如何保證消息的可靠性傳輸(簡(jiǎn)述版本)?

    我需要從三點(diǎn)去考慮, 生產(chǎn)者弄丟了數(shù)據(jù),生產(chǎn)者將消息發(fā)送的Exchange并且路由到隊(duì)列 隊(duì)列需要將消息給它持久化 消費(fèi)者要成功消費(fèi)隊(duì)列中的消息 RabbitMQ提供了confirm機(jī)制,保證了消息消息發(fā)送的Exchange交換機(jī),那么還提供了return機(jī)制,可以保證消息從exchange路由到隊(duì)列中,如

    2024年02月13日
    瀏覽(23)
  • RabbitMQ如何保證消息的可靠性6000字詳解

    RabbitMQ如何保證消息的可靠性6000字詳解

    RabbitMQ通過(guò)生產(chǎn)者、消費(fèi)者以及MQ Broker達(dá)到了解耦的特點(diǎn),實(shí)現(xiàn)了異步通訊等一些優(yōu)點(diǎn),但是在消息的傳遞中引入了MQ Broker必然會(huì)帶來(lái)一些其他問(wèn)題,比如如何保證消息在傳輸過(guò)程中可靠性(即不讓數(shù)據(jù)丟失,發(fā)送一次消息就會(huì)被消費(fèi)一次)?這篇博客將詳細(xì)從生產(chǎn)者,MQ B

    2024年02月16日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包