《MySQL——redo log 與 binlog 寫入機制》

目錄

    • binlog寫入機制
    • redo log寫入機制
    • 組提交機制實現大量的TPS
    • 理解WAL機制
    • 如何提升IO性能瓶頸

WAL機制告訴我們:只要redo log與binlog保證持久化到磁盤里,就能確保MySQL異常重啟后,數據可以恢復。

下面主要記錄一下MySQL寫入binlog和redo log的流程。

binlog寫入機制

1、事務執行過程中,先把日志寫到binlog cache,事務提交的時候,再把binlog cache寫到binlog文件中。

2、binlog cache,系統為每個線程分配了一片binlog cache內存,參數binlog_cache_size控制單個線程內binlog cache大小。如果超過了這個大小就要暫存磁盤

3、事務提交的時候,執行器把binlog cache里完整的事務寫入binlog中。并清空binlog cache

4、每個線程都有自己的binlog cache,共用一份binlog文件

5、write,是把日志寫入到文件系統的page cache,內存中,沒有持久化到磁盤,所以速度比較快,圖中的fsync是將數據持久化到磁盤,占用磁盤的IOPS
在這里插入圖片描述

關于何時write、fsync是由參數sync_binlog控制的:

1、sync_binlog = 0時,每次提交事務都只write,不fsync;
2、sync_binlog = 1時,每次提交事務都會執行fsync;
3、sync_binlog = N(N>1)時,表示每次提交事務都write,但累積N個事務后才fsync。

sync_binlog控制binlog真正刷盤的頻率,對于一個IO非常大的情景,這個數字調大可以提高性能,但是如果容錯率非常低的情況下,必須設為1.(sync_binlog設置為N對應的風險是:如果主機發生異常重啟,會丟失最近N個事務的binlog日志)

redo log寫入機制

事務在執行過程中,生成的redo log是要先寫到redo log buffer的。

redo log buffer里面的內容并不需要每次生成后都要持久化到磁盤中。

如果事務執行期間MySQL發生異常重啟,那么這部分日志就丟了。由于事務并沒有提交,所以這時日志丟了也不會有損失。

事務沒提交的時候,redo log buffer部分日志也是有可能被持久化到磁盤中的。
在這里插入圖片描述
上面三個顏色表征了redo log可能的三種狀態:

1、存在redo log buffer中,物理上是在MySQL進程內存中,即紅色部分;

2、寫到磁盤(write),但是沒有持久化(fsync),物理上實在文件系統的page cache里面,即黃色部分;

3、持久化到磁盤,對應的是hard disk,也就是圖中的綠色部分;

前兩步是寫內存,最后一步是磁盤IO,所以要在page cache夠大且不影響寫入page cache前將redo log 持久化到磁盤 。

為了控制redo log 的寫入策略,InnoDB提供了innodb_flush_log_at_trx_commit參數,他有三種可能取值:

1、設置為0,每次事務提交的時候都只是把redo log留在redo log buffer中;
2、設置為1,每次事務提交的時候都只是把redo log直接持久化到磁盤;
3、設置為2,每次事務提交時都只是把redo log寫到page cache;

與binlog不同,binlog是每個線程都有一個binlog cache,而redo log是多個線程共用一個redo log buffer。

InnoDB有一個后臺線程,每隔1s,就會把redo log buffer中的日志,調用write寫到文件系統的page cache,然后調用fsync持久化到磁盤,事務執行過程中的redo log也是直接寫在redo log buffer上的,所以,未提交的事務的redolog也可能被持久化到磁盤。

還有兩種場景也會導致沒有提交的事務的redo log寫入到磁盤中:

情形1:

redo log buffer占用的空間即將達到innodb_log_buffer_size一半的時候,后臺線程會主動寫盤。

(這里只是write,沒有fsync)

情形2:

并行的事務提交的時候,順帶將這個事務的redo log buffer持久化到磁盤。

(事務A執行一半,部分redo log到buffer中;事務B提交,且 innodb_flush_log_at_trx_commit ,會把redo log buffer里的log全部持久化到磁盤中)

補充說明

兩階段提交在時序上redo log先prepare 再寫binlog,最后再把redo log commit;

innodb_flush_log_at_trx_commit 設置成 1,prepare階段redo log就已經落盤。所以redo log再commit的時候就不需要fsync了,只會write到文件系統的page cache中就夠了。

sync_binlog 和 innodb_flush_log_at_trx_commit都設置為1,即一個事務完整提交前,需要等待兩次刷盤,一次是redo log(prepare階段),一次是binlog。

組提交機制實現大量的TPS

首先介紹日志邏輯序列號(log sequence number,LSN)的概念。LSN是單調遞增的,每次寫入長度length的redo log,LSN的值就會加上length。

三個并發事務(trx1,trx2,trx3)在prepare階段,都寫完redo buffer,并持久化到磁盤。

對應的LSN為50、120、160.

對應流程:

1、trx1第一個到達,被選為這組的leader;

2、等trx1要開始寫盤的時候,這個組里面已經有三個事務,這時候LSN也變成了160;

3、trx1去寫盤的時候,LSN=160;trx1返回時,所有LSN<= 160的redo log都被持久化到磁盤中;

4、trx2與trx3直接返回。

總結:

一次組提交中,組員越多,節約磁盤IOPS的效果越好。如果是單線程,就只能一個事務對應一次持久化操作

兩階段提交
兩階段提交細化

這樣保證binlog也可以組提交了。由于step3速度快,所以集合到一起的binlog比較少,所以binlog的組提交效果不如redo log組提交。

提升binlog效果:

--1.binlog_group_commit_sync_delay :b表示延遲多少微秒后才調用fsync;
--2.binlog_group_commit_sync_no_delay_count :表示累積多少次以后才調用fsync;

理解WAL機制

WAL機制是減少磁盤寫,可是每次提交事務都要寫redo log和binlog ,磁盤讀寫次數沒有變少。

所以WAL機制主要得益于兩個方面:

--1、redo log和binlog都是順序寫,磁盤的順序寫比隨機寫速度要快
--2、組提交機制,可以降低磁盤IOPS消耗

如何提升IO性能瓶頸

1、設置binlog_group_commit_sync_delaybinlog_group_commit_sync_no_delay_count參數,減少binlog的寫盤次數。這個方法是基于“額外故意等待”來實現的,可能會增加語句的響應時間,但是不會丟失數據

2、將sync_binlog設置為大于1的值(100~1000)。不過會有主機掉電時丟binlog日志的風險

3、將 innodb_flush_log_at_trx_commit 設置為2。會有主機掉電丟數據的風險

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377199.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377199.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377199.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BBIAB的完整形式是什么?

BBIAB&#xff1a;再回來一點 (BBIAB: Be Back In A Bit) BBIAB is an abbreviation of "Be Back In A Bit". BBIAB是“ Be Back in A Bit”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites lik…

字符串:KMP Eentend-Kmp 自動機 trie圖 trie樹 后綴樹 后綴數組

涉及到字符串的問題&#xff0c;無外乎這樣一些算法和數據結構&#xff1a;自動機 KMP算法 Extend-KMP 后綴樹 后綴數組 trie樹 trie圖及其應用。當然這些都是比較高級的數據結構和算法&#xff0c;而這里面最常用和最熟悉的大概是kmp&#xff0c;即使如此還是有相當一部分人也…

WPF CanExecuteChanged

繼承ICommand ,RelayCommand命令 1 public class RelayCommand : ICommand2 {3 private readonly Action _execute;4 private readonly Func<bool> _canExecute;5 public event EventHandler CanExecuteChanged;6 public RelayComma…

《MySQL——主備一致性六問六答》

目錄備庫為什么要設置為只讀模式&#xff1f;備庫設置為只讀&#xff0c;如何與主庫保持同步更新&#xff1f;A到B的內部流程如何&#xff1f;binlog內容是什么&#xff1f;row格式對于恢復數據有何好處M-M結構的循環復制問題以及解決方案備庫為什么要設置為只讀模式&#xff1…

代碼管理工具

http://blogs.msdn.com/b/visualstudio/archive/2012/06/11/world-of-samples-at-your-fingertips.aspx轉載于:https://www.cnblogs.com/hebeiDGL/archive/2012/09/25/2700961.html

fyi 在郵件里是什么意思_FYI的完整形式是什么?

fyi 在郵件里是什么意思僅供參考&#xff1a;供您參考 (FYI: For Your Information) FYI is an acronym of "For Your Information". It is a widespread internet slang used these days in text messaging, instant messaging, and chatting on Facebook, WhatsApp…

Hyper-V 替換 vmwp

要激活 Hyper-V 下的虛機 最簡單的方法是用帶證書的vmwp替換掉原來的 帶證書的vmwp參見&#xff1a;http://bbs.pcbeta.com/viewthread-1408240-1-1.html 下載后腰替換 先把 Hyper-V 的倆服務停止掉 然后找到 C:\Windows\System32\vmwp.exe 右鍵--安全 替換掉所有者 然后給自己…

《MySQL——主備切換流程與主備延遲》

目錄主備切換主備延遲的原因可靠性優先策略的主備切換流程可用性優先策略的主備切換流程主備切換 主備切換分為主動運維與被動操作。 軟件升級、主庫所在機器按計劃下線為主動運維。 主庫所在機器掉電為被動操作。 同步延遲 1、主庫A執行完一個事務&#xff0c;寫入binlog…

ejb模式_EJB的完整形式是什么?

ejb模式EJB&#xff1a;企業Java Bean (EJB: Enterprise Java Bean) EJB is an abbreviation of Enterprise Java Bean. EJB is one of many Java application programming interfaces (API) for flexible and manageable structuring of Java Platform, Enterprise Edition (J…

Android之PreferenceActivity

http://www.cnblogs.com/wservices/archive/2010/07/08/1773449.html 看到很多書中都沒有對PreferenceActivity做介紹&#xff0c;而我正好又在項目中用到&#xff0c;所以就把自己的使用的在這總結一下&#xff0c;也方便日后查找。 PerferenceActivity是什么&#xff0c;看下…

淺談算法和數據結構: 七 二叉查找樹

前文介紹了符號表的兩種實現&#xff0c;無序鏈表和有序數組&#xff0c;無序鏈表在插入的時候具有較高的靈活性&#xff0c;而有序數組在查找時具有較高的效率&#xff0c;本文介紹的二叉查找樹(Binary Search Tree&#xff0c;BST)這一數據結構綜合了以上兩種數據結構的優點。…

scala部分應用函數_Scala中的部分函數

scala部分應用函數Scala部分功能 (Scala partial functions) A partial function is a function that returns values only for a specific set of values i.e. this function is not able to return values for some input values. This function is defined so that only som…

《MySQL——備庫多線程復制策略。》

目錄備庫并行復制能力MySQL5.6版本 并行復制策略MariaDB 并行復制策略MySQL5.7版本 并行復制策略MySQL5.7.22版本 并行復制策略總結備庫并行復制能力 主要涉及兩個方面的并行度&#xff1a; 1、客戶端寫入主庫的能力 2、備庫上sql_thread執行中轉日志relay log 1的并行能力…

人臉是門大生意

我們正處在一個新時代的入口。人有70%的能量是被大腦消耗&#xff0c;大腦90%的能量用來處理視覺信息&#xff0c;人臉則承載了絕大部分的視覺信息。我們要討論的是一個比Google Glass更酷的世界。文/程苓峰-云科技網易郵箱的用戶已經可以用人臉而不是密碼來驗證登陸。安卓4.0實…

【SQL】sql版Split函數。用于拆分字符串為單列表格

【SQL】sql版Split函數。用于拆分字符串為單列表格 功能與.net版string.Split函數類似&#xff0c;只不過.net返回的是數組&#xff0c;這個返回的是一個單列表格&#xff0c;每個拆分出來的子串占一行。可選是否移除空格子串和重復項。市面上類似的函數不算少&#xff0c;但大…

線描算法

線描算法 (Line drawing algorithms) The equation for a straight line is ymxb 直線方程為y mx b In this m represent a slope of a line which can be calculated by the my2-y1/x2-x1 where (x1, y1) are the starting position of the points and (x2, y2) are the end…

為移動端網頁構造快速響應按鈕

背景 在谷歌&#xff0c;我們不斷地推測手機網頁應用的可能性。像HTML5這樣的技術使我們網頁版的應用以及運行在手機設備上的原生應用。而這些技術的成就之一就是我們開發了一種新的創建按鈕的方法&#xff0c;使按鈕的響應時間遠遠快于一般的HTML按鈕。在此之前的按鈕或者其他…

Red Gate系列之一 SQL Compare 10.4.8.87 Edition 數據庫比較工具 完全破解+使用教程

Red Gate系列之一 SQL Compare 10.4.8.87 Edition 數據庫比較工具 完全破解使用教程 Red Gate系列文章&#xff1a; Red Gate系列之一 SQL Compare 10.4.8.87 Edition 數據庫比較工具 完全破解使用教程 Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 數據庫版本控制…

《MySQL——基于位點orGTID的主備切換協議》

一主多從的設置&#xff0c;用于讀寫分離&#xff0c;主庫負責所有的寫入和一部分讀&#xff0c;其他讀請求則由從庫分擔。 一主多從架構下&#xff0c;主庫故障后的主備切換問題。相比于一主一備&#xff0c;多了從庫指向新主庫的過程。 基于位點的主備切換同步 把節點B設…

數據科學和統計學_數據科學中的統計

數據科學和統計學統計 (Statistics) Statistics are utilized to process complex issues in reality with the goal that Data Scientists and Analysts can search for important patterns and changes in Data. In straightforward words, Statistics can be utilized to ge…