網上有很多關于pos機文檔申請,終于學完了阿里高級架構師整理MySQL復制技術與生產實踐文檔的知識,也有很多人為大家解答關于pos機文檔申請的問題,今天pos機之家(www.tonybus.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
1、pos機文檔申請
pos機文檔申請
前言MySQL在其3.23版本時就頗具前瞻性地推出主從復制(replication)特性,距今約有20年了。正是這一舉措,使得MySQL趕上了互聯網1.0時代的發展大勢。利用復制特性可以很方便地實現數據庫架構的擴展及讀寫分離功能,以提升架構承載的容量。
我想,從這個角度來說,復制是MySQL最主要的特性一點都不為過。
熟悉MySQL的人都知道,MySQL的復制技術是其核心技術之一,是靈活運用MySQL的基礎。從3.23版本開始,MySQL推出了異步復制功能,之后不斷進化,推出半同步復制、無損半同步復制,以及目前最新的組復制功能。其基本原理幾乎是一致的——利用二進制日志文件在數據庫服務器之間的傳播和數據回放,實現多臺數據庫服務器之間的數據同步。一個合格的MySQL從業人員,必須掌握復制技術的基礎知識,熟悉復制技術的各種解決方案,并靈活利用它們去滿足生產系統中的各種需求。
MySQL能夠成為“最流行的開源數據庫”,其復制技術起了巨大的作用。Sharing Nothing架構、橫向擴展、高可用、容災、數據集成與聚合,這一系列名詞所代表的架構和應用場景都與復制技術有關。多應用場景意味著與復制相關的技術靈活而復雜:異步復制、增強半同步復制、語句級復制、行級復制、按位點復制、GTID復制、多源復制、級聯復制、多線程復制、雙主架構、一主多從架構、延遲復制、讀寫分離等。不同的業務場景,使用不同的復制架構,該如何正確地構建MySQL復制拓撲、如何有效地監控和正確地維護,這些都是架構師和DBA要解決的問題。
隨著國家加強對數據庫技術安全可控的要求,使用開源的MySQL數據庫已經成為一種趨勢,開源代表著代碼安全、數據庫可控。各行各業不斷地推進MySQL的部署,MySQL從業人員也由互聯網行業擴散到傳統行業。利用復制技術可以實現MySQL的高可用性及高擴展性,是保障MySQL數據安全和進行數據庫擴展的必要技術。安全可控對于傳統行業至關重要,因此極力推薦MySQL從業者,特別是傳統行業的DBA閱讀此文 。
目錄主要內容全文共分為3篇:基礎篇、方案篇和參考篇,總共38章的內容。
按照“基本原理”→“生產實踐”→“更多參考”的邏輯順序講述,文中配了大量的原理與方案示意圖,力求用通俗易懂的語言、直觀明了的示意圖、完整的知識涵蓋面將MySQL復制技術講透。
其中,基礎篇側重介紹主從復制的原理和復制技術的演進,方案篇側重介紹主從復制技術在生產環境中的應用方案,參考篇側重介紹二進制日志的基本組成及主從復制中常見對象復制的安全性等。
本文適用初、中、高級MySQL DBA、數據庫架構師及相關開發人員閱讀。
基礎篇第1章復制的概述;簡單來說,“復制”就是將來自一個MySQL Server(這里指master角色,即主庫)的數據變更,通過其邏輯的二進制日志(binlog)傳輸到其他的一個或多個MySQL Server(這里指slave角色,即從庫)中,其他MySQL Server通過應用(回放)這些邏輯的二進制日志來完成數據的同步。這些MySQL Server之間的邏輯關系,我們稱為“復制拓撲”(也可以稱為“復制架構”)。
默認情況下,復制是異步的,即主庫將二進制日志傳輸到從庫之后,并不關心從庫是否成功收到。從庫是否收到這些二進制日志,不影響主庫的任何讀/寫訪問;而從庫的復制線程也可以隨意暫?;蛲V梗⒉挥绊懼鲙斓淖x/寫訪問。通常,異步模式能夠發揮數據庫的最高性能,但數據安全性卻得不到很好的保證,如果對數據安全性的要求較高,可以考慮使用半同步復制。
另外,默認情況下,復制的數據是針對整個實例的(排除部分系統表),你可以根據自身需求選擇是否需要復制整個實例的數據,是只復制某些庫,還是只復制某些表的數據等。接下來將簡要介紹MySQL中復制拓撲的一些適用場景,以及與復制相關的概念。
第2章復制的基本原理;第1章簡單介紹了MySQL復制(技術)相關的基本概念,本章將詳細介紹其基本原理。MySQL的復制技術自誕生以來,隨著各種各樣的應用場景對數據安全性及復制性能的要求不斷提高,也在不斷迭代與優化。要深刻理解MySQL的復制技術,就要從它的基本原理說起,下面將對此展開介紹。
第3章復制格式詳解;通過前面的兩章,我們了解了復制技術的使用場景及其基本原理與實現,知道復制是通過二進制日志記錄在主從庫之間的流轉來實現的。第1章對二進制日志的記錄格式做了簡要的介紹,本章將詳細闡述復制格式。
第4章傳統復制與GTID復制;MySQL 5.6之前的版本只支持傳統復制,即“基于二進制日志文件(binlog file)和位置(binlog pos)的復制”。在該復制模式中,復制拓撲的初始化配置和變更、復制的高可用切換等操作都需要找到正確的二進制日志文件和位置,否則就無法正確復制。然而,尋找該位置信息的過程所涉及的操作步驟較為繁瑣,于是在MySQL 5.6及其之后的版本中,出現了基于GTID的復制(為了表述上的方便,文中也簡稱為GTID復制)模式。它利用GTID自動定位的特性,不再需要二進制日志的位置信息,也就省去了尋找這些信息所需的繁瑣步驟,極大地簡化了復制拓撲的初始化配置和變更,以及復制的高可用切換等操作。本章將對這兩種復制模式做基本的介紹。
第5章半同步復制;除了內置的異步復制,MySQL 5.7還支持通過插件方式實現半同步復制接口。相對于MySQL 5.5和MySQL 5.6中的半同步復制,通常我們將MySQL 5.7中的半同步復制稱為“增強半同步復制”,也稱為“無損復制”(MySQL 5.5和MySQL 5.6雖然也支持半同步復制,但不能保證“無損復制”,詳見5.4節“半同步復制的注意要點”)。本章將詳細介紹MySQL 5.7中的半同步復制。
第6章多線程復制;MySQL 5.6之前的版本不支持從庫并行重放主庫的二進制日志,所以一旦主庫的寫壓力稍微大一點,從庫就容易出現延遲。當然,目前最新的MySQL版本已經能夠很好地支持多線程復制。為了便于理解復制是如何一步一步演進為多線程復制的,本章將從單線程復制說起。在開始學習本章內容之前,也許你需要回顧一下復制的基本原理,詳見第2章“復制的基本原理”。
第7章多源復制;一些業務數據被打散到多個數據庫實例上之后,數據庫的備份和恢復就比較煩瑣,有沒有什么簡單的方案能夠解決這個問題呢?MySQL5.7.6引入了復制通道的概念,使得同一個從庫可以同時接收多個主庫的數據,一個復制通道邏輯上就對應一個主庫。本章將簡要介紹如何在復制拓撲中使用通道、通道相關的概念,以及相關系統的設置對單源(單個復制通道)復制的影響。
第8章從庫中繼日志和狀態日志;從庫I/O線程從主庫讀取的二進制日志需要暫時存放在從庫的磁盤文件中,這個磁盤文件就是中繼日志(relay log)。I/O線程并不負責解析與重放二進制日志,而是由SQL線程負責。當復制線程正常運行時,我們對復制線程的工作位置(這里指的是I/O線程讀取主庫二進制日志的位置和SQL線程重放的位置)不是很敏感,但當從庫的數據庫進程或者主機發生崩潰(crash)時,從庫重新啟動之后,需要知道上一次復制線程進行到的正確位置,也就是說對復制線程的工作位置需要持久化,否則一旦丟失將無法知道上一次復制進行到哪里了。狀態日志被用來對復制線程的工作位置進行持久化(狀態日志包括relay loginfo和master info兩種類型,具體用途詳見下文),本章將詳細介紹中繼日志和狀態日志。
第9章通過PERFORMANCE_SCHEMA庫檢查復制信息;通常,我們在查看與復制相關的狀態信息時,都習慣性地使用SHOW SLAVE STATUS語句。也許你會說,“我也會用PERFORMANCE_SCHEMA庫的表查看一些在復制時的報錯信息”,但是,你知道SHOW SLAVE STATUS語句輸出的信息和PERFORMANCE_ SCHEMA庫中的復制信息記錄表之間有什么異同嗎?本章將詳細介紹二者的異同。
第10章通過其他方式檢查復制信息;第8章詳細介紹了如何通過mysql.slave_master_info和mysql.slave_relay_log_info表來檢查復制信息,第9章詳細介紹了如何通過PERFORMANCE_SCHEMA庫下的復制記錄表來檢查復制信息,本章將對前面章節中未提及的與復制相關的小細節進行補充說明。例如,通過SHOW PROCESSLIST語句來查看I/O線程和SQL線程的狀態信息、通過PERFORMANCE_SCHEMA庫中的user_variables_by_thread表來查看I/O線程向主庫注冊的自定義變量信息等。
第11章MySQL復制延遲Seconds_Behind_Master究竟是如何計算的;在主從復制拓撲中,監控復制延遲是必不可少的工作。如果應用場景對復制延遲并不敏感,那么大多數時候通過采集SHOW SLAVESTATUS語句輸出信息中Seconds_Behind_Master字段的值監控復制延遲就已經足夠了。相信有MySQL使用經驗的人對這種方法并不陌生,我們都知道Seconds_Behind_Master的值在某些場景下并不是那么可靠,也或多或少都知道一些計算這個值的方法。但這些計算方法真的正確嗎?接下來,本章將對此進行討論并確認正確的計算方法。
第12章如何保證從庫在意外中止后安全恢復;為了保證復制線程能夠在從庫意外中止之后正確恢復到中止之前的狀態(有時稱為crash-safe),需要對從庫中的某些系統變量與復制選項設置合適的值。本章將詳細介紹如何設置這些系統變量與復制選項及其對應的不同影響。
第13章MySQL Server復制過濾;MySQL Server的復制過濾功能,雖然通常在標準的生產環境中不建議使用(因為如果使用不當,可能導致各種各樣的主從庫數據不一致的問題),但在某些場合下,為了區分業務數據或保證數據安全性(例如,對業務數據所有的寫操作都統一寫入主庫,但是對業務數據的讀取則需要按照業務模塊來劃分,因為不同業務系統之間有數據安全隔離的需求),MySQL Server的復制過濾功能可能是一個簡單、快捷的實現方案。在有足夠的了解,而且通過縝密的規劃來規避其缺點的前提下,也可以將其列為能解決此類需求的可選方案之一。本章將簡單梳理一遍MySQL Server復制過濾功能的實現邏輯。
方案篇第14章搭建異步復制;異步復制是相對于同步復制和半同步復制而言的,這三者之間的區別,可參考第1章“復制的概述”和第5章“半同步復制”。相比于其他兩種復制,異步復制的速度最快,且主庫性能不受從庫復制性能的影響,它也是MySQL中最早出現的復制技術。在MySQL 5.6之前,無論是同步復制、半同步復制,還是異步復制,都是傳統復制(基于二進制日志文件和位置),維護復制拓撲時比較麻煩。MySQL 5.6及其之后的版本支持GTID復制模式,使得對復制拓撲的維護變得非常方便快捷。本章將詳細介紹在傳統復制和GTID復制的兩種復制模式下,搭建異步復制的過程,關于傳統復制和GTID復制的原理,可參考第4章。
第15章搭建半同步復制;本章將介紹性價比最高、實現方式最簡單、最容易安裝及部署的半同步復制解決方案。
第16章通過擴展從庫以提高復制性能;在大多數OLTP或OLAP業務系統中,對數據庫的操作通常讀多寫少(特殊場景除外。例如,數據采集、數據恢復等是寫多讀少的場景),所以,隨著業務的增長,原有復制拓撲中的數據庫實例漸漸難以支撐讀訪問流量(假定復制拓撲中的主庫提供寫服務,所有從庫提供讀服務),迫切需要提高數據庫的讀訪問能力。那么,我們就需要一個方便、快捷、輕量的讀訪問能力擴展方案。本章以橫向擴展為例,介紹整個方案的實施過程。
第17章復制模式的切換;MySQL 5.5及其之前的版本,由于不支持GTID機制,所以它們使用的都是傳統復制(即基于二進制日志文件和位置的復制)。MySQL 5.6中引入了GTID機制,該機制有眾多優點(詳情可參考第4章、第12章等章節,以及下文中將要演示的復制模式切換過程,這里先不展開介紹),為MySQL管理者的維護工作帶來了極大便利,所以大多數用戶都會選擇切換到GTID復制模式(即基于GTID的復制,下文統一稱為“GTID復制”)。而除了一些特殊的應用場景之外,通常很少需要從GTID復制切換到傳統復制。
在第1章中,我們將傳統復制和GTID復制稱為“數據同步方法”,但通常我們更喜歡將其稱為“復制模式”。本章將對這兩種復制模式中的一些概念以及它們的相互切換過程進行詳細介紹。
第18章復制拓撲的在線調整;如果MySQL數據庫的訪問量并不大,那么可以使用一主一從的復制拓撲,主庫提供寫服務,從庫提供讀服務,采用MySQL 5.7的半同步復制配合高可用軟件,即可實現數據的高可用、零丟失。在讀訪問量較大的場景中,可能需要將復制拓撲擴展為一主多從,甚至雙主多從,緩解單個從庫的讀訪問壓力(關于從庫的擴展,可參考第16章“通過擴展從庫以提高復制性能”)。但擴展復制拓撲也就意味著增加管理難度。例如,在主庫發生故障或者在線切換到新主庫之后,連接原主庫的從庫需要進行調整以連接到新主庫;或者為了提高復制性能,可能會增加一個中間庫,并將復制拓撲調整為級聯復制,這時就涉及復制拓撲的在線調整。本章將詳細介紹復制拓撲的在線調整步驟。
第19章主從實例的例行切換;主從實例的例行切換,在這里指的是根據業務變更或者運維管理的需要,主動將主庫的寫訪問請求轉移到其他數據庫實例,這個切換不是由故障觸發的。那么,在什么場景下需要進行例行切換呢?
第20章數據庫故障轉移;數據庫故障轉移,在這里指的是由于主庫故障而觸發的,將主庫讀/寫業務轉移到其他數據庫實例繼續對外提供讀/寫服務的過程。例如,當探測到主庫主機宕機、主庫數據庫進程不存在、主庫數據庫無法登錄、主庫數據庫無法執行查詢或更新操作時,為盡量減小主庫故障對業務造成的影響,需要盡快將讀/寫訪問入口轉移到處于正常狀態的數據庫實例上。
在實際場景中,造成主庫無法提供讀/寫服務的原因多種多樣。對于數據庫管理系統來說,考慮的因素越多,就會越復雜,可靠性就會越差。所以,通常建議將問題分為可確定故障原因和不可確定故障原因的場景,然后分別采用不同的方式解決。如果混為一談,可能經常導致誤操作轉移。
對于可確定故障原因且通過自動故障轉移能夠恢復業務訪問的場景,可以使用數據庫管理系統自動進行故障轉移。
第21章搭建多源復制;MySQL的多源復制(也可以稱為“多主復制”),指的是復制拓撲中的從庫同時從多個源Server(主庫)接收二進制日志進行重放。多源復制可用于將多個Server的數據備份到單個Server中(從庫),以及在分庫分表場景中,將來自多個Server的分片表數據合并。從庫在應用來自多個主庫的二進制日志時,不會執行任何沖突檢測或解決沖突,如有需要,則靠應用程序來解決這些問題。在多源復制拓撲中,從庫會為每個主庫建立一個單獨的復制通道(單獨的I/O線程、協調器線程、Worker線程),各自重放各自的二進制日志,互不依賴。
關于多源復制的原理與使用場景,詳情可參考第7章“多源復制”。本章將詳細介紹多源復制的搭建步驟。
第22章MySQL版本升級;MySQL的版本并不需要常升級,但如果要使用新版本的某個新特性,或者為了修復舊版本的某個bug,就不得不進行版本升級。在生產環境中,為避免單點故障,通常都會用多個MySQL實例構建一個復制拓撲。為了使升級操作對業務的影響盡可能小,可以先升級復制拓撲中的只讀實例(從庫),然后再執行一次主從角色切換(會造成應用短暫中斷),最后將主庫當作從庫再做一次升級即可。
本章只闡述在復制拓撲中升級MySQL版本的一些注意事項,關于復制拓撲中的MySQL版本升級步驟,可參考19.2節“在線切換”。
第23章將不同數據庫的數據復制到不同實例;將不同數據庫中的數據復制到不同的實例(MySQL Server),在實現上具體指的就是從庫將主庫的全量二進制日志拉取到本地的中繼日志之后,從庫SQL線程在重放這些二進制日志時,根據自身配置的復制過濾規則,選擇需要應用哪些庫與表,以及需要忽略哪些庫與表。
當然,在主庫端也支持復制過濾,雖然在主庫端配置復制過濾后能夠減少二進制日志的傳輸量,但主庫端只支持庫級別的過濾規則,而且容易導致主從庫數據不一致。通常不建議在主庫端配置復制過濾規則,可靠的復制過濾都是在從庫端實現的,因為這樣才更合理,每個從庫根據自己的需要來靈活配置復制過濾規則。
關于復制過濾的原理與流程,本章不做過多闡述,可參考第13章“MySQL Server 復制過濾”。本章將以在從庫端配置復制過濾規則為例,詳細介紹其操作步驟。
第24章發生數據誤操作之后的處理方案;在當今信息大爆炸的時代,數據與信息是一家技術型公司賴以生存的基石。然而,在日常維護存放數據與信息的服務器過程中,對于技術人員來說,難免會有誤操作(例如,誤修改、誤刪除、誤寫入等)。不過,我們可以盡量減少誤操作帶來的損失。發生誤操作之后,可以通過一些方法盡量恢復被誤操作的數據。本章將詳解介紹MySQL中幾種常見的簡單有效的恢復誤刪除數據的方法。
第25章常用復制故障排除方案;作為MySQL數據庫管理人員,我們在日常的工作中或多或少都會碰到MySQL復制相關的問題,有些問題可能很快就解決了,有些問題具有一定的迷惑性,可能需要排查很久才能找到具體的原因。對于后者,我們大概率會在日后的工作中再次遭遇它們。再次遇到的時候,你是否有似曾相識但怎么也想不起來具體細節的感覺呢?
為了避免這種尷尬,建議在處理完故障之后,立即以文檔形式總結故障現象、其復現與排查過程、解決方案和規避方法,予以留存。
另外,故障雖然多種多樣,但其處理思路與流程是具有共性的。本章以處理MySQL復制相關的故障為主題,詳細介紹一個排除復制故障的通用方案(注意,本章只講解思路與流程,不介紹細節)。
參考篇第26章二進制日志文件的基本組成;在使用MySQL數據庫的平臺上,很多關鍵的應用場景都是基于二進制日志實現的,例如主從復制(這也是本書的主題,前面用大量的篇幅介紹了復制的原理與使用案例)、基于時間點的備份與恢復、誤操作數據的回滾、供數(解析二進制日志文件,并將得到的文本數據傳輸到另一個平臺,如數據倉庫、Kafka等)等,但是很少有人詳細了解過二進制日志。本章將從二進制日志事件類型的角度對二進制日志文件中的內容進行詳細的介紹。
第27章常規DDL操作解析;
第28章為何二進制日志中同—個事務的事件時間點會亂序;對于這個問題,相信很多人都只是大概知道其中的原理,并沒有做過具體的案例分析。本章將以一個常見的UPDATE語句更新數據的事務作為案例,詳細分析其中的過程。
第29章復制AUTO_INCREMENT字段;設計MySQL的表結構時,一般建議使用AUTO_INCREMENT字段作為表的主鍵,而不是使用UUID作為主鍵,原因是使用前者作為主鍵能保證數據行是按順序寫入的。如果采用隨機寫入的方式,InnoDB在寫入數據時會產生大量的隨機I/O操作,并且會頻繁做數據頁的分裂操作。
AUTO_INCREMENT字段主鍵在插入性能以及抑制碎片空間的產生方面都比較有優勢。但是它的值是由MySQL Server產生的,那么在復制拓撲中,MySQL是如何保證主從庫之間AUTO_INCREMENT字段數據的一致性的呢?本章討論在MySQL中是如何保證AUTO_INCREMENT字段被正確復制的。
第30章復制CREATE ...IF NOT EXISTS語句;MySQL中有CREATE ... IF NOT EXISTS語句,對于程序創建庫或者表很方便:如果庫或者表不存在,則創建;反之,則不創建。無論主庫中是否存在某個庫,使用CREATE DATABASE IF NOT EXISTS語句創建庫的時候,該語句都能被正確地復制到從庫。同樣,無論主庫中是否存在某張表,CREATE TABLE IF NOT EXISTS語句(除CREATE TABLE IFNOT EXISTS ... SELECT外)都能被正確復制到從庫。本章我們就來看看CREATE DATABASE IF NOT EXISTS和CREATE TABLE IF NOT EXISTS語句是如何被正確復制到從庫的。
第31章復制CREATE TABLE ...SELECT語句;第30章解釋了CREATE ... IF NOT EXISTS語句(除CREATE TABLEIF NOT EXISTS ... SELECT之外)是如何被正確復制的,本章我們來看第30章未涉及的CREATE TABLE IF NOT EXISTS ... SELECT以及CREATE TABLE ... SELECT語句是如何被正確復制的。
第32章在主從復制中使用不同的表定義;正常情況下,我們使用MySQL主從復制時,都是為了保證主從庫數據的一致性,但有時可能會遇到一些需求。比如,出于安全的考慮,上游數據庫同步到下游數據庫時需要過濾某些字段,或者中間庫需要對字段類型進行調整,那么在MySQL中如果不同步表(結構)定義,人為地分別在主庫和從庫上創建不同的表定義,MySQL復制時只負責數據同步,這樣可行嗎?本章就來介紹一下在主從復制中使用不同的表定義進行復制。
第33章復制中的調用功能;日常工作中,DBA不可避免會遇到使用存儲過程、觸發器、自定義函數等的場景,因此,本章我們來講一講在MySQL的復制中是如何保證存儲過程、觸發器、自定義函數等的正確性的。
第34章復制LIMIT子句;DBA一般會建議開發人員在使用MySQL時不要使用大事務,比如在對某一張表清理上百萬行數據時,不建議直接用一條DELETE語句清理完所有數據,而是建議使用LIMIT子句,小批量、多次清理。LIMIT子句對符合條件的結果集限定返回的行數,但是無法明確是哪幾行。在MySQL的復制中,對于LIMIT子句這種具有不確定性的子句如何保證復制的一致性呢?本章我們就來看看LIMIT子句是如何被正確復制的。
第35章復制LOAD DATA語句;LOAD DATA語句能很方便地將文件中的數據導入MySQL,是開發人員平時習慣使用的一種導入數據的方式。本章我們就來看一看,在MySQL主從復制架構中是如何保證LOAD DATA語句正確地從主庫復制到從庫的。
第36章系統變量max_allowed_packet對復制的影響;熟悉MySQL的人都知道,MySQL有許多可設置的系統變量,用于控制其行為或者性能,比如系統變量max_allowed_packet可以控制客戶端與服務端連接后,傳輸的數據包的最大尺寸。本章我們講一講系統變量max_allowed_packet對復制的影響,再介紹一些其他類似的系統變量。
第37章復制臨時表;與普通的表相比,相信許多讀者對于臨時表應該既陌生又熟悉,本文講的是MySQL的復制,那么本章就來講一講臨時表在MySQL中是如何復制的,以及在復制中遇到臨時表該怎么辦。
第38章復制中的事務不—致問題;在MySQL復制中,我們都會擔心主從庫數據一致性的問題。有些情況下,主從庫數據不一致是由于主從庫事務不一致而導致的。本章我們就來講一講MySQL復制中事務不一致的類型、原因以及結果。
這份【MySQL復制技術與生產實踐】文檔共有575頁,需要完整版的小伙伴,可以轉發此文關注小編,私信小編【技能】來獲?。。?!
以上就是關于pos機文檔申請,終于學完了阿里高級架構師整理MySQL復制技術與生產實踐文檔的知識,后面我們會繼續為大家整理關于pos機文檔申請的知識,希望能夠幫助到大家!
