相信作為一名DBA來講MySQL主從一直都是一個繞不開的話題,我們在很多高可用構(gòu)架中都能看到它的身影膛薛。在我們心中一定都或多或少的產(chǎn)生過一些疑問寂屏,比如:
- 主從延遲為什么會高词顾?
- 主從延遲為什么一直不動炸裆?
- 主從延遲為什么瞬間跳動垃它?
- 延遲為0就一定代表沒有延遲嗎?
- 從庫異常重啟為什么會報錯?
- 從庫能和主庫一樣利用索引嗎国拇?
- MTS是如何提高從庫應(yīng)用效率的洛史?
- 為什么會有那么多和從庫相關(guān)的sync參數(shù),我該怎么配置酱吝?
- mysql.gtid_executed表有什么用也殖?
......
這個系列就是想通過描述主從原理,抽絲剝繭解開大家對這些問題的疑惑务热。我認(rèn)為如果要深入學(xué)習(xí)主從原理需要按照一定的順序進(jìn)行學(xué)習(xí)忆嗜,如果不知道GTID、不知道Event陕习、不知道主庫如何生成Event的霎褐,那么肯定不能深入理解主從原理 址愿,因此本系列按照這種順序講解该镣。本系列一共分為5個部分如下:
第一部分 | GTID相關(guān) | 第1節(jié): GTID的基本概念 第2節(jié): mysql.gtid_executed表/gtid_executed變量/gtid_purged變量的更改時機(jī) 第3節(jié): GTID模塊初始化簡介和參數(shù)binlog_gtid_simple_recovery 第4節(jié): GTID中的運維 |
第二部分 | Event相關(guān) | 第5節(jié): Binary log Event 的總體格式 第6節(jié): 重點Event FORMAT_DESCRIPTION_EVENT/PREVIOUS_GTIDS_LOG_EVENT 第7節(jié): 重點Event GTID_LOG_EVENT 第8節(jié): 重點Event QUERY_EVENT/MAP_EVENT 第9節(jié): 重點Event WRITE_ROWS_EVENT/DELETE_ROWS_EVENT 第10節(jié):重點Event UPDATE_ROWS_EVENT/XID_EVENT 第11節(jié):參數(shù)binlog_row_image的影響 第12節(jié):巧用Event發(fā)現(xiàn)問題 |
第三部分 | 主庫相關(guān) | 第13節(jié):binlog cache簡介 第14節(jié):事務(wù)Event的生成和寫入流程 第15節(jié):MySQL層事務(wù)提交流程簡析 第16節(jié):基于WRITESET的并行復(fù)制方式 第17節(jié):主庫的DUMP線程 第18節(jié):DUMP線程查找和過濾GTID的基本算法 |
第四部分 | 從庫相關(guān) | 第19節(jié):從庫MTS多線程并行回放(一) 第20節(jié):從庫MTS多線程并行回放(二) 第21節(jié):MTS中GAP測試和參數(shù)slave_preserve_commit_order 第22節(jié):從庫的IO線程 第23節(jié):從庫的SQL線程(MTS協(xié)調(diào)線程)和參數(shù)sql_slave_skip_counter 第24節(jié):從庫數(shù)據(jù)的查找和參數(shù)slave_rows_search_algorithms 第25節(jié):從庫的關(guān)閉和恢復(fù)流程 第26節(jié):合理的從庫設(shè)置 第27節(jié):從庫Seconds_Behind_Master的計算方式 第28節(jié):從庫Seconds_Behind_Master延遲總結(jié) |
第五部分 | 其他 | 第29節(jié):線程簡介和MySQL調(diào)試環(huán)境搭建 第30節(jié):Delete與Insert 死鎖案例分析 第31節(jié):Innodb Buffer Pool的三種Page和鏈表 第32節(jié):利用performance_schema獲取造成死鎖的語句 |
其中:
- 前面29節(jié)由我獨自編寫。
- 第30節(jié)和第31節(jié)分別由我的朋友楊奇龍和王航威編寫响谓,他們都是有贊的DBA损合,在平時的交流中我感到他們涉獵之廣是我不能及的。
- 第32節(jié)由我的同事田興椿編寫娘纷,在平時的工作和學(xué)習(xí)中他總是能找到一些讓我詫異的案例嫁审,然后一起學(xué)習(xí)研究。
討論范圍和約定
本系列使用源碼版本為Percona 5.7.22赖晶,因此討論的范圍肯定是5.7版本律适。
本系列雖然包含了主從中的大部分知識點,但是仍然有部分內(nèi)容沒有覆蓋遏插,如下:
- 不覆蓋半同步捂贿。
- 只考慮master_info_repository和relay_log_info_repository設(shè)置為‘table’的情況。
- 只考慮binlog_format設(shè)置為‘row’的情況胳嘲。
本系列約定如下:
- 行格式:binlog_format設(shè)置為‘row’厂僧。
- 語句格式:binlog_format設(shè)置為‘statement’。
- binary log:這里代表是我們常說的binlog物理文件了牛。
- order commit:代表的是‘MYSQL_BIN_LOG::ordered_commit’函數(shù)颜屠,因為本系列中使用頻率很高因此做了簡化。將會在15節(jié)詳細(xì)它的流程鹰祸。
- GTID AUTO_POSITION MODE:代表主從使用的是GTID同時使用了master_auto_position=1甫窟。
- POSITION MODE:代表主從使用的是傳統(tǒng)的位點模式。
- 單SQL線程:用來和MTS進(jìn)行區(qū)分蛙婴,代表只有一個SQL線程進(jìn)行Event的應(yīng)用蕴坪。
- MTS:‘multi-threaded slaves’的簡稱,包含一個協(xié)調(diào)線程和多個工作線程,Event由工作線程應(yīng)用背传。
編寫方式
在編寫之初有些朋友建議我不寫源碼而有些朋友建議我多貼些代碼呆瞻,因此我做了一下綜合,整個系列中我會給出一些源碼接口和必要的源碼證明径玖,但是不會貼很多源碼和棧幀痴脾。有些章節(jié)會包含一個筆記放到我的簡書,這個筆記就是我學(xué)習(xí)的時候記錄的源碼調(diào)用順序和一些棧幀供自己復(fù)習(xí)之用也供想了解源碼的朋友查看梳星,但是可讀性不是那么好赞赖。如果對源碼不感興趣的朋友可以跳過這些源碼接口和代碼,我認(rèn)為這并不會影響閱讀的連續(xù)性冤灾。
注意
- 本系列是基于MySQL 5.7編寫的前域。
- 本系列將開放部分章節(jié)用于讀者試讀。
- 由于作者能力有限雖然我盡量保證嚴(yán)謹(jǐn)韵吨,但是錯誤在所難免匿垄。如果發(fā)現(xiàn)錯誤可以聯(lián)系我,我會驗證后進(jìn)行更改归粉〈涣疲可以加入QQ群556787677進(jìn)行交流。
- 虛擬物品概不退款糠悼。
- 歡迎加入QQ群 556787677
因此請讀者確認(rèn)后購買届榄。
感謝
非常感謝翟衛(wèi)祥、葉金榮倔喂、吳炳錫铝条、李真旭、楊奇龍百忙之中為本系列作推薦序席噩,特別感謝葉金榮為本系列校稿班缰。
最后希望我的兩個兒子能夠健康快樂的成長。