深入理解MySQL主從原理專欄(32節) 釋出

gaopengtttt發表於2019-07-13

歡迎關注我的《深入理解MySQL主從原理 32講 》,如下:

image.png
如果圖片不能顯示可檢視下面連結:

https://www.jianshu.com/p/d636215d767f

相信作為一名DBA來講MySQL主從一直都是一個繞不開的話題,我們在很多高可用構架中都能看到它的身影。在我們心中一定都或多或少的產生過一些疑問,比如:

  • 主從延遲為什麼會高?
  • 主從延遲為什麼一直不動?
  • 主從延遲為什麼瞬間跳動?
  • 延遲為0就一定代表沒有延遲嗎?
  • 從庫異常重啟為什麼會報錯?
  • 從庫能和主庫一樣利用索引嗎?
  • MTS是如何提高從庫應用效率的?
  • 為什麼會有那麼多和從庫相關的sync引數,我該怎麼配置?
  • mysql.gtid_executed表有什麼用?
    ……

這個系列就是想通過描述主從原理,抽絲剝繭解開大家對這些問題的疑惑。我認為如果要深入學習主從原理需要按照一定的順序進行學習,如果不知道GTID、不知道Event、不知道主庫如何生成Event的,那麼肯定不能深入理解主從原理 ,因此本系列按照這種順序講解。本系列一共分為5個部分如下:

第一部分 GTID相關 第1節: GTID的基本概念
第2節: mysql.gtid_executed表/gtid_executed變數/gtid_purged變數的更改時機
第3節: GTID模組初始化簡介和引數binlog_gtid_simple_recovery
第4節: GTID中的運維
第二部分 Event相關 第5節: Binary log Event 的總體格式
第6節: 重點Event FORMAT_DESCRIPTION_EVENT/PREVIOUS_GTIDS_LOG_EVENT
第7節: 重點Event GTID_LOG_EVENT
第8節: 重點Event QUERY_EVENT/MAP_EVENT
第9節: 重點Event WRITE_ROWS_EVENT/DELETE_ROWS_EVENT
第10節:重點Event UPDATE_ROWS_EVENT/XID_EVENT
第11節:引數binlog_row_image的影響
第12節:巧用Event發現問題
第三部分 主庫相關 第13節:binlog cache簡介
第14節:事務Event的生成和寫入流程
第15節:MySQL層事務提交流程簡析
第16節:基於WRITESET的並行複製方式
第17節:主庫的DUMP執行緒
第18節:DUMP執行緒查詢和過濾GTID的基本演算法
第四部分 從庫相關 第19節:從庫MTS多執行緒並行回放(一)
第20節:從庫MTS多執行緒並行回放(二)
第21節:MTS中GAP測試和引數slave_preserve_commit_order
第22節:從庫的IO執行緒
第23節:從庫的SQL執行緒(MTS協調執行緒)和引數sql_slave_skip_counter
第24節:從庫資料的查詢和引數slave_rows_search_algorithms
第25節:從庫的關閉和恢復流程
第26節:合理的從庫設定
第27節:從庫Seconds_Behind_Master的計算方式
第28節:從庫Seconds_Behind_Master延遲總結
第五部分 其他 第29節:執行緒簡介和MySQL除錯環境搭建
第30節:Delete與Insert 死鎖案例分析
第31節:Innodb Buffer Pool的三種Page和連結串列
第32節:利用performance_schema獲取造成死鎖的語句

其中:

  • 前面29節由我獨自編寫。
  • 第30節和第31節分別由我的朋友楊奇龍和王航威編寫,他們都是有讚的DBA,在平時的交流中我感到他們涉獵之廣是我不能及的。
  • 第32節由我的同事田興椿編寫,在平時的工作和學習中他總是能找到一些讓我詫異的案例,然後一起學習研究。

討論範圍和約定

本系列使用原始碼版本為Percona 5.7.22,因此討論的範圍肯定是5.7版本。
本系列雖然包含了主從中的大部分知識點,但是仍然有部分內容沒有覆蓋,如下:

  • 不覆蓋半同步。
  • 只考慮master_info_repository和relay_log_info_repository設定為‘table’的情況。
  • 只考慮binlog_format設定為‘row’的情況。

本系列約定如下:

  • 行格式:binlog_format設定為‘row’。
  • 語句格式:binlog_format設定為‘statement’。
  • binary log:這裡代表是我們常說的binlog物理檔案。
  • order commit:代表的是‘MYSQL_BIN_LOG::ordered_commit’函式,因為本系列中使用頻率很高因此做了簡化。將會在15節詳細它的流程。
  • GTID AUTO_POSITION MODE:代表主從使用的是GTID同時使用了master_auto_position=1。
  • POSITION MODE:代表主從使用的是傳統的位點模式。
  • 單SQL執行緒:用來和MTS進行區分,代表只有一個SQL執行緒進行Event的應用。
  • MTS:‘multi-threaded slaves’的簡稱,包含一個協調執行緒和多個工作執行緒,Event由工作執行緒應用。

編寫方式

在編寫之初有些朋友建議我不寫原始碼而有些朋友建議我多貼些程式碼,因此我做了一下綜合,整個系列中我會給出一些原始碼介面和必要的原始碼證明,但是不會貼很多原始碼和棧幀。有些章節會包含一個筆記放到我的簡書,這個筆記就是我學習的時候記錄的原始碼呼叫順序和一些棧幀供自己複習之用也供想了解原始碼的朋友檢視,但是可讀性不是那麼好。如果對原始碼不感興趣的朋友可以跳過這些原始碼介面和程式碼,我認為這並不會影響閱讀的連續性。


從2016年開始八怪(本名高鵬)經常向我請教一些原始碼問題,可見八怪是一個對原始碼非常執著的人。縱觀整個目錄覆蓋了主從的方方面面,希望他的這個系列能夠讓大家對主從原理有更加深入的理解。

————翟衛祥(網名印風) 阿里雲智慧資料庫產品事業部高階MySQL核心專家


和八怪(本名叫高鵬)認識,源於他的一位同事參加了知數堂的MySQL課程,學習之餘和八怪有些交流互動,對一些觀點有些探討,然後就順理成章的認識了。八怪原本是ORACLE DBA,但他接觸MySQL之後,開始對MySQL各種深入探究,這種學習的態度和方法令我折服,也反過來促進我更深入理解MySQL。
為了更好理解InnoDB引擎,八怪還曾經開發了bctool、bcview和innblock等幾個工具(還有些是我不知道的),其中innblock工具的開發我也作為“產品經理”幫忙提了一些建議,這個工具釋出後,也在我的公眾號幫忙隆重的推了一波:innblock | InnoDB page觀察利器。
自從聽聞八怪要寫專欄,我就一直關注著進展,偶爾也會幫忙提些建議。這個專欄主要內容是MySQL主從複製相關的內容,從原始碼層面深入解析MySQL主從複製的方方面面,略有遺憾的是本書沒有涉及半同步複製、組複製這兩方面的熱門內容,期待八怪在未來能有精力增加這兩大塊知識點。

————葉金榮 MySQL ACE、知數堂聯合創始人


高鵬是一位做事非常專注而且動手能力超強的人。其中有一件事情我印象特別深刻,在通過和我交流MGR高可用節點選擇後,不到兩週時間,又給我講他實現了一個MGR vip漂移的Python指令碼。他先後實現了InnoDB的Page分析,MySQL InnoDB加鎖分析,又開始轉戰努力寫作本系列,通過本系列的目錄可以看到高鵬基本把複製相關原理做了一個徹底的分析,對於想深入理解MySQL複製及Binlog相關內容的朋友來說是一個不可多得的學習資料。

————吳炳錫 知數堂聯合創始人


作為一個曾今混跡於itpub的老人,拜讀過不少高鵬的Oracle方面的文章。偶然之間發現其轉戰MySQL領域,並攥寫了大量原理性剖析的文章,印象較為深刻的是幾篇關於MDL lock的原始碼層面的解析,讀完後感覺豁然開朗。開源資料庫目前越來越火,尤其以MySQL表現最為搶眼,如果要深入學習MySQL主從原理,本系列實在是不可多得的資料,強烈推薦之!

————李真旭 Oracle ACE 雲和恩墨服務產品群總經理


認識高鵬源於ITPUB blog 專家推薦,初識於Oracle技術,隨後MySQL技術興起,大家轉戰MySQL,高鵬兄側重原始碼剖析,對各種疑難雜症分析入木三分,熱心幫助很多網友解決各種問題。現在他將自己對MySQL 主從複製部分原始碼的解讀彙總成系列文章分享給大家。細細品讀,必定受益良多。

————楊奇龍 杭州有贊科技DBA,公眾號yangyidba作者

購買可聯絡我 wx:gaopp_22389860

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2650426/,如需轉載,請註明出處,否則將追究法律責任。

相關文章