- 數(shù)據(jù)生態(tài):MySQL復(fù)制技術(shù)與生產(chǎn)實踐
- 羅小波
- 3677字
- 2020-11-24 13:04:59
前言
寫書的出發(fā)點
2019年11月,我們撰寫了《千金良方:MySQL性能優(yōu)化金字塔法則》一書。從那以后,身邊不斷有人問我一個問題:“寫技術(shù)類的書不怎么賺錢,為什么還要寫?”剛開始,我還認(rèn)真回答,但提問者聽到回答之后大多仍然表示不解,后來問的人多了,我索性回答:“為了賺名氣!”這個答案簡單、粗暴、有效!的確,通過《千金良方:MySQL性能優(yōu)化金字塔法則》一書,我們小“賺”了些名氣,不過對于為什么寫書這個問題,這不是我的全部答案。現(xiàn)在,借本書的前言,我將自己全部的想法寫出來,希望能完整、全面地回答這個問題。
? 督促自己有計劃地學(xué)習(xí)
2018年12月,我們有幸參加了電子工業(yè)出版社在北京舉辦的作譯者聚會。聚會上有兩位嘉賓的話令我印象深刻。一位來自阿里巴巴的安全專家說他已經(jīng)撰寫十余本書了,另一位來自美團的某團隊負(fù)責(zé)人說他規(guī)劃要寫十余本書。“聽君一席話,勝讀十年書”,他們完全顛覆了我之前對于寫書這件事的看法。在此之前,我一直以為,技術(shù)圖書是寫作者不斷沉淀工作中所學(xué)的知識,由量變到質(zhì)變的產(chǎn)物。能寫一本書,說明某個方面知識的積累已經(jīng)達(dá)到一定厚度,非常不易。在那一刻,我才知道,原來寫書這件事,還可以刻意規(guī)劃,也難怪大拿們能夠做到連續(xù)數(shù)十載一年寫一本書!于是,從那時開始,我們也開始嘗試有計劃地學(xué)習(xí)、有計劃地寫書。
? 化解繁重的工作和技能精進之間的矛盾
在2018年12月的作譯者聚會之后不久,我們再次受邀參加電子工業(yè)出版社在杭州舉辦的作譯者聚會。這次聚會上,一位嘉賓的話又讓我獲益匪淺,他說“視野的高度決定了做事的高度”。在他的影響下,我閱讀了吳軍博士的《見識》一書,其中“西瓜與芝麻”和“不做偽工作者”的故事令人印象深刻。這讓我聯(lián)想到,自己及身邊的同事、朋友們,也未嘗不是經(jīng)常做著撿芝麻的事情,沉迷于低效率的勤奮而不自知,由于工作時長問題,相當(dāng)多的人也缺少精進的時間和精力。
不少朋友曾經(jīng)問我如何從零開始學(xué)習(xí)MySQL,這些人中有剛走出校園的實習(xí)生、程序員,也有想從其他數(shù)據(jù)庫開發(fā)轉(zhuǎn)向MySQL開發(fā)的開發(fā)者。對于這一問題,我一時間不知如何作答,但問的人多了,一來我不好意思總說自己也不知道如何學(xué)習(xí)MySQL,二來突然發(fā)覺這或許是一個需要有人站出來解決的問題。于是我開始思考,想象作為一個MySQL“小白”應(yīng)該如何入門。
經(jīng)過不斷的思考,我慢慢有了一些答案。例如,可以嘗試系統(tǒng)地研究某個知識點,將其研究透徹,然后分享出來供大家一起學(xué)習(xí),以便幫助那些沒有足夠精力和時間精進的朋友們快速進步,讓那些可能走彎路的朋友們少走彎路。或許這就像吳軍博士在《文明之光》中所描述的那樣,當(dāng)農(nóng)耕文明發(fā)展到一定階段,賴以生存的食物不再短缺的時候,就能夠騰出一部分人力不再從事農(nóng)耕勞作,轉(zhuǎn)而專門從事滿足新需求的工作,如此這般,人類文明便可以不斷向前進步。
? 系統(tǒng)地學(xué)習(xí)和研究某個課題
借用吳軍博士的話說,一本書可以看作系統(tǒng)學(xué)習(xí)和研究某個課題后的答卷,就好比在大學(xué)里寫論文一樣,它能夠驗證你對課題的學(xué)習(xí)和研究是否有成效,讓大家都可以看見、分享你的學(xué)習(xí)和研究成果。
? 鍛煉寫作能力
寫作是一項技能,需要反復(fù)地刻意練習(xí),而寫書的過程通常要求高、周期長,這是一個非常好的練習(xí)機會。
掌握正確的學(xué)習(xí)和研究方法
要系統(tǒng)地學(xué)習(xí)和研究一個課題,按照由淺入深的順序,我們可以將其過程大致分為如下三個階段:
? 第一階段:認(rèn)識整體
對于一個復(fù)雜課題,可以先從整體上搞清楚它的知識體系組成框架,搞清楚其中各個組成部分(知識模塊)的大致脈絡(luò),從而從全局上建立起初步認(rèn)知,以便為下一階段選擇知識模塊進行深入研究做好鋪墊。
? 第二階段:逐一深入
基于第一階段的整體認(rèn)識,可以優(yōu)先選擇一些工作中需要用到的知識模塊,或者感興趣的知識模塊,作為子課題逐一進行深入的系統(tǒng)研究。
? 第三階段:回歸整體
由于人的精力有限,在第二階段,深入研究各知識模板期間,一些知識模塊可能會被遺忘,因此需要回歸整體,結(jié)合自己的驗證與理解,建立牢固的知識體系。
在學(xué)習(xí)和研究的過程中要勤動手記錄,可將零散的知識整理為博客文章,博客文章積累到一定數(shù)量之后亦可整理為圖書,持續(xù)地做這樣的知識積累工作,直到形成完善的知識體系,日后可供自己與他人使用。
2019年11月出版的《千金良方:MySQL性能優(yōu)化金字塔法則》,可以說是我們在第二階段中對一個子課題(MySQL性能優(yōu)化)的答卷,而本書則可以說是我們對另一個子課題(MySQL主從復(fù)制)的答卷。對于MySQL來說,主從復(fù)制是一個非常重要的知識模塊,而且據(jù)我所知,還有非常多從事MySQL相關(guān)工作的同行們,對MySQL主從復(fù)制的原理、應(yīng)用場景等知識掌握得并不全面,甚至對其一知半解的人也不在少數(shù)。因此,在本書中,我們將其作為重點展開介紹。不過,遺憾的是,在學(xué)習(xí)和研究的第一階段,我們還沒有撰寫相關(guān)圖書,但我們正在積極籌備中,在不久的將來會為廣大讀者朋友們交上一份滿意的“答卷”!
MySQL的數(shù)據(jù)生態(tài)
MySQL的二進制日志記錄了一個數(shù)據(jù)庫實例內(nèi)數(shù)據(jù)的變更,這些內(nèi)容是按照時間的先后順序記錄的。根據(jù)具體的二進制日志格式選項設(shè)置,可以記錄數(shù)據(jù)庫實例內(nèi)執(zhí)行的原始SQL語句文本,也可以記錄數(shù)據(jù)庫實例內(nèi)執(zhí)行SQL語句時產(chǎn)生的數(shù)據(jù)變更的行記錄值。二進制日志可以滿足類似如下一些應(yīng)用場景:
? MySQL Server崩潰之后對其進行恢復(fù)時,二進制日志作為事務(wù)的協(xié)調(diào)者。
對于一個未完成提交的事務(wù),MySQL Server崩潰之后進行恢復(fù)時,會在二進制日志中檢查是否存在對應(yīng)的內(nèi)容,如果存在,則事務(wù)可以重新提交,如果不存在(或沒有啟用二進制日志記錄功能),則必須回滾事務(wù),將該事務(wù)修改的記錄進行回滾。
? 在不同實例間進行數(shù)據(jù)同步(主從復(fù)制、組復(fù)制)。
主庫中的數(shù)據(jù)變更被記錄到二進制日志,然后主庫將二進制日志發(fā)送給從庫,從庫使用這些二進制日志進行回放,模擬主庫中執(zhí)行的操作,從而實現(xiàn)主從庫之間的數(shù)據(jù)同步。
? 數(shù)據(jù)異地容災(zāi)。
可以在異地數(shù)據(jù)中心增加一臺服務(wù)器,將其配置為新的從庫,從主庫中獲取二進制日志進行回放,達(dá)到數(shù)據(jù)異地容災(zāi)的目的;也可以由應(yīng)用程序模擬一個從庫,從主庫中獲取二進制日志,進行解析、處理,然后將數(shù)據(jù)存放在容災(zāi)專用的系統(tǒng)中。
? 恢復(fù)被誤刪除的數(shù)據(jù)(通常稱為“數(shù)據(jù)閃回”)。
通常,對于未提交的事務(wù),事務(wù)的ACID特性能夠保證數(shù)據(jù)的一致性,直接使用事務(wù)提供的回滾功能即可實現(xiàn)對誤刪除數(shù)據(jù)的恢復(fù),不受事務(wù)控制的修改語句除外,因為不受事務(wù)控制的語句修改的數(shù)據(jù)無法執(zhí)行回滾。但事務(wù)一旦完成提交,就無法再對數(shù)據(jù)進行回滾,這時可以對二進制日志中記錄的值與條件進行反轉(zhuǎn),生成新的SQL語句(要求二進制日志以row格式記錄,必須記錄全鏡像,且只支持增/刪/改語句的反向操作),然后重新在數(shù)據(jù)庫實例中執(zhí)行新的SQL語句,從而恢復(fù)被誤刪除的數(shù)據(jù)。
? 數(shù)據(jù)在異構(gòu)數(shù)據(jù)庫之間流轉(zhuǎn)。
二進制日志中記錄的是數(shù)據(jù)的邏輯變更,可以從中提取出數(shù)據(jù)的純文本和字段的順序,然后通過應(yīng)用程序做一些處理,數(shù)據(jù)就可以在異構(gòu)數(shù)據(jù)庫之間流轉(zhuǎn)了。這是其他大多數(shù)數(shù)據(jù)庫軟件不具備的特性。
二進制日志獨有的特性是MySQL數(shù)據(jù)流動與循環(huán)的基石,在不同應(yīng)用場景下形成了獨特的“數(shù)據(jù)生態(tài)”,這也是本書名字的由來。
讀者對象
無論你是MySQL的初學(xué)者、數(shù)據(jù)庫架構(gòu)師及相關(guān)開發(fā)人員、非MySQL數(shù)據(jù)庫DBA,還是中高級的MySQL DBA,認(rèn)真閱讀此書,相信或多或少都能有所收獲。
? MySQL的初學(xué)者、MySQL相關(guān)開發(fā)人員、非MySQL數(shù)據(jù)庫的DBA,可以從頭開始完整學(xué)習(xí)MySQL的復(fù)制技術(shù)。
? 數(shù)據(jù)庫架構(gòu)師、中高級MySQL DBA,可以借助本書對MySQL復(fù)制技術(shù)的相關(guān)知識進行查漏補缺,掃除盲點。
如何閱讀本書
全書分為“基礎(chǔ)篇”“方案篇”“參考篇”,其中:
? “基礎(chǔ)篇”對MySQL主從復(fù)制技術(shù)的用途、概念、基本原理及演進等進行全方位的介紹。
? “方案篇”對MySQL主從復(fù)制技術(shù)在生產(chǎn)中的應(yīng)用場景、復(fù)制拓?fù)涞纳芾碇芷凇⒏呖捎们袚Q與主庫故障轉(zhuǎn)移等進行全方位的介紹。
? “參考篇”對MySQL二進制日志的基本組成結(jié)構(gòu)、常見的復(fù)制對象在主從復(fù)制拓?fù)渲械牧鬓D(zhuǎn)過程等進行全方位的介紹。
對于初學(xué)者、MySQL相關(guān)開發(fā)人員、非MySQL數(shù)據(jù)庫的DBA而言,如果時間充足,建議從頭到尾依次學(xué)習(xí)本書內(nèi)容。
數(shù)據(jù)庫架構(gòu)師、中高級MySQL DBA則可以通過目錄快速查找所需內(nèi)容。
如果你具備一定的MySQL源碼閱讀能力,或者想要挑戰(zhàn)更高難度,可以結(jié)合簡書平臺高鵬的專欄“深入理解主從原理32講”中的系列文章進行學(xué)習(xí)。對該專欄中的內(nèi)容,高鵬也進行了整理,并整理成了《深入理解MySQL主從原理》一書,有需要的讀者朋友可自行購買。
作者分工
本書作者各自負(fù)責(zé)的章節(jié):
? 羅小波:負(fù)責(zé)撰寫“基礎(chǔ)篇”“方案篇”,以及“參考篇”中的第28章。
? 沈剛:負(fù)責(zé)撰寫“參考篇”中除第28章以外的其他章節(jié),以及博文視點官網(wǎng)的附錄資源。
致謝
首先,非常感謝給本書作序的大拿:葉金榮老師、熊軍、徐軼韜。感謝撰寫封底推薦語的大拿:林曉斌(丁奇)、高鵬(八怪)、溫正湖、楊奇龍、熊中哲、李春。感謝他們的認(rèn)可與支持!
其次,非常感謝為本書校稿的朋友們:劉云、董紅禹、高鵬。感謝他們不辭辛苦,反復(fù)咀嚼文字,努力尋找書稿中的紕漏,幫助提升閱讀體驗!
再次,非常感謝參與本書命名討論的朋友們:李春、董紅禹、徐婷、杜蓉、符隆美、孫黎!
最后,非常感謝幫忙為本書進行宣傳的葉金榮老師、大力配合我們推動圖書出版事宜的電子工業(yè)出版社編輯符隆美,以及其他負(fù)責(zé)內(nèi)容審核、校對、排版的編輯們!
- Google Apps Script for Beginners
- 一步一步學(xué)Spring Boot 2:微服務(wù)項目實戰(zhàn)
- Flask Blueprints
- Visual Basic程序開發(fā)(學(xué)習(xí)筆記)
- Vue.js 2 and Bootstrap 4 Web Development
- INSTANT Sencha Touch
- Java Web程序設(shè)計任務(wù)教程
- Getting Started with Gulp
- C++面向?qū)ο蟪绦蛟O(shè)計習(xí)題解答與上機指導(dǎo)(第三版)
- C和C++游戲趣味編程
- Lighttpd源碼分析
- Babylon.js Essentials
- 區(qū)塊鏈技術(shù)進階與實戰(zhàn)(第2版)
- Unity 3D腳本編程:使用C#語言開發(fā)跨平臺游戲
- OpenMP核心技術(shù)指南