mysql系統架構解析

如下內容是依據《MySQL性能調優與架構設計》來作的知識點總結,感興趣的朋友能夠看一下這本書,畢竟按照書來學習比較系統。可以總體的把握知識脈絡。
1、MySQL邏輯模塊組成
mysql能夠當作是二層架構,第一層叫SQL Layer,這一部分主要功能是完成mysql數據庫系統處理底層數據以前的全部的準備工做,包括權限判斷、sql解析、執行計劃優化、query cache的處理等; 第二層是存儲引擎層(Storage Engine Layer),這一層纔是數據庫系統數據存取操做的實現,是由多種存儲引擎共同完成。
mysql系統架構解析
看起來結構簡單,可是每一層又包含不少的小模塊。mysql

SQL Layer層包含的模塊有:算法

  1. 初始化模塊

  初始化模塊就是在mysql server啓動的時候,對整個系統作各類各樣的初始化操做,好比各類buffer,cache結構的初始化和內存空間的申請,各類系統變量的初始化設定,各類存儲引擎的初始化設置等sql

  1. 核心API

  核心API模塊主要是爲了提供一些須要很是高效的底層操做功能的優化實現,包括各類底層數據結構的實現,特殊算法的實現,字符竄處理,數字處理等,小文件I/O,格式化輸出,以及最重要的內存管理部分。核心API模塊的全部源代碼都集中在mysys和strings文件夾下面。數據庫

  1. 網絡交互模塊

  底層網絡交互模塊抽象出底層網絡交互所使用的接口api,實現底層網絡數據的接收與發送,以方便其它各個模塊的調用。以及對這一程序的部分維護。全部源碼都在vio文件夾下面。api

  1. Client & Server 交互協議模塊

  任何的C/S結構的軟件系統,都確定會有本身獨有的信息交互協議,MySQL也不例外,MySQL的Client & Server交互協議模塊部分,實現了客戶端與MySQL交互過程當中的全部協議。固然這些協議都是創建在現有的OS和網絡協議之上的。如TCP/IP、Unix Socket.  緩存

  1. 用戶模塊

  用戶模塊所實現的功能,主要是包括用戶的登陸鏈接權限控制和用戶的受權管理。就像是MySQL的大門守衛同樣,決定是否給來訪者「開門」安全

  1. 訪問控制模塊markdown

      造訪客人進門了就能夠想幹嗎就幹嗎麼? 爲了安全考慮,確定是不能如此隨意。這時候就須要訪問控制模塊實時監控客人的每個動做,給不一樣的客人以不一樣的權限。訪問控制模塊實現的功能就是根據用戶模塊中各用戶的受權信息,以及數據庫自身特有的各類約束,來控制用戶對數據的訪問。用戶模塊和訪問控制模塊二者結合起來,組成了MySQL整個數據庫系統的權限安全管理的功能。網絡

  2. 鏈接管理、鏈接線程、線程管理模塊

  鏈接管理模塊負責監聽對MySQL Server的各類請求,接受鏈接請求,轉發全部鏈接請求到線程管理模塊,每個鏈接上MySQL Server的客戶端請求都會被分配(或建立)一個鏈接線程爲其單獨服務。而鏈接線程的主要工做就是負責MySQL Server 與客戶端的通訊,接受客戶端的命令請求。傳遞Server端的結果信息。線程管理模塊則負責管理維護這些鏈接線程。還包括線程的建立,線程的cache等數據結構

  1. Query解析和轉發模塊

      在MySQL中咱們習慣將全部Client端發送給Server端的命令都稱爲query,在MySQL Server裏面,鏈接線程接受到客戶端的一個query後,會直接將該query傳遞給專門負責將各類Query進行分類而後轉發給相應的處理模塊,這個模塊就是Query解析和轉發模塊。主要工做就是將query語句進行語義和語法分析,而後按照不一樣的操做類型進行分類,而後作出針對性的轉發。

  2. Query Cache模塊

  Query Cache模塊在MySQL中是一個很是重要的模塊,他的主要功能是將客戶端提交給MySQL的select類的query請求的返回結果集cache到內存中,與該query的一個hash值作一個對應。該Query所取數據的基表發生任何數據的變化以後,MySQL會自動使該query的Cache失效。在讀寫比例很是高的應用系統中,Query cache對性能的提升是很是顯著的。固然他對內存的消耗也是巨大的。

  1. Query優化器模塊

  Query優化器,就是優化客戶端請求的query,根據客戶端請求的query語句,和數據庫中的一些統計信息,在一系列算法的基礎上進行分析,得出一個最優的策略,告訴後面的程序如何取得這個query語句的結果。

  1. 表變動管理模塊

      表變動管理模塊主要負責完成一些DML和DDL的query,如:update、delete、insert、create table,alter table等語句的處理。

  2. 表維護模塊

  表的狀態檢查,錯誤修復,以及優化和分析等工做都是表維護模塊所須要作的事情。

  1. 系統狀態管理模塊

      系統狀態管理模塊負責在客戶端請求系統狀態的時候,將各類狀態數據返回給用戶,好比DBA經常使用的show status命令,show variables命令等,所獲得的的結果都是由這個模塊來返回的。

  2. 表管理器

      這個模塊從名字上看來和上面的表變動和表維護模塊相混淆,可是其功能與表變動及維護模塊卻徹底不一樣。你們都知道,每個MySQL的表都有一個表的定義文件,依舊是*.frm文件。表管理器的工做主要就是維護這些文件,以及一個cache,該cache中的主要內容是各個表的結構信息。此外他還維護table級別的鎖管理。

  3. 日誌記錄模塊

      主要負責整個系統級別的邏輯層的日誌的記錄,包括error log, binary log, show query log等。

  4. 複製模塊

      複製模塊又可分爲Master模塊和Slave模塊兩部分,Master模塊主要負責在Replication環境中讀取Master端binary日誌,以及與Slave端的I/O線程交互等工做。Slave模塊比Master模塊所要作的事情稍多一些。在系統中主要體如今兩個線程上面。一個是負責從Master請求和接受binary日誌,並寫入本地relay log中的I/O線程。另外一個負責從relay log中讀取相關日誌文件,而後解析成能夠在Slave端正確執行並獲得和Master端徹底相同的結果的米寧再交給Slave執行的SQL線程。

  5. 存儲引擎接口模塊

      存儲引擎接口模塊是MySQL數據庫最有特點的一點了。目前各類數據庫產品中,基本上只有MySQL能夠實現其底層數據存儲引擎的插件式管理。這個模塊實際上只是一個抽象類,可是正由於它成功的將各類數據庫處理高度抽象化,才成就了今天的MySQL可插拔存儲引擎的特點。

2、 各模塊的工做配合

  重點來了。 咱們經過一個例子來闡述mysql系統的各個模苦是如何相親相愛的完成一個咱們認爲的很簡單的查詢工做的。

  咱們對啓動mysql,客戶端創建鏈接,請求query,獲得返回結果,最終退出。這樣一整個過程來進行分析。

  第一步:當咱們執行啓動mysql系統的命令以後,mysql的初始化模塊就從系統配置文件中讀取系統參數和命令行參數,並按照參數來初始化整個系統,如申請並分配buffer,初始化全局變量,以及各類結構等。同時各個存儲引擎也被啓動,進行各自的初始化工做。當整個系統初始化結束後,由鏈接管理模塊接手,鏈接管理模塊會啓動處理客戶端鏈接請求的監聽程序,包括tcp/ip的網絡監聽,還有unix的socket,這時候,mysql serve就基本啓動完成,準備好接受客戶端的請求了。

  第二步:當鏈接管理模塊監聽到客戶端的鏈接請求(藉助網絡交互模塊的相關功能),雙方經過Client & Server交互協議模塊所定義的協議「寒暄」幾句以後,鏈接管理模塊就會將鏈接請求轉發給線程管理模塊,去請求一個鏈接線程。

  第三步:線程管理模塊接着將控制權交給鏈接線程模塊,告訴鏈接線程模塊,如今我這邊鏈接請求過來了,須要創建鏈接,你趕快處理一下。鏈接線程模塊會在接收到鏈接請求後,首先檢查當前鏈接線程池中是否有被cache的空閒鏈接線程,若是有,就取出一個和客戶端請求鏈接上,若是沒有空閒的鏈接線程,則創建一個新的鏈接線程與客戶端請求鏈接。固然,鏈接線程模塊並非在接收到鏈接請求後立刻就會取出一個鏈接線程和客戶端鏈接,而是首先經過調用用戶模塊進行受權檢查,只有客戶端請求經過了受權檢查後,他纔會將客戶端請求和負責請求的鏈接線程連上。

  在MySQL中,將客戶端的請求分爲了兩種類型,一種是query,須要調用Parser也就是Query解析和轉發模塊的解析纔可以執行的請求;一種是command,不須要調用Parser就能夠執行執行的請求。若是咱們的初始化配置打開了Full Query Logging的功能,那麼Query解析與轉發模塊就會調用日誌記錄模塊將請求計入日誌。不論是一個Query類型的請求仍是一個command類型的請求,都會被記錄進入日誌,因此出於性能考慮通常不多打開Full Query Logging的功能。

  第四步:當客戶端請求和鏈接線程「互換暗號(互通協議)」接上頭以後,鏈接線程就開始處理客戶端請求發送過來的各類命令(或者query),接受相關請求。他將收到的query語句轉發給Query解析和轉發模塊,Query解析器先對Query進行基本的語義和語法解析,而後根據命令類型的不一樣,有些會直接處理,有些會分發給其餘模塊來處理。

  若是是一個Query類型的請求,會將控制權交給Query解析器,Query解析器首先分析是否是一個select類型的query,若是是,則調用查詢緩存模塊,讓它檢查該query在query cache中是否已經存在。若是有,則直接將cache中的數據返回給鏈接線程模塊。而後經過與客戶端鏈接的線程將數據輸出給客戶端。若是不是一個能夠被cache的query類型,或者cache中沒有改query的數據,那麼query將被繼續傳回Query解析器,讓Query解析器進行相應處理,在經過Query分發器分發給相關處理模塊。

  第五步:若是解析器解析結果是一條未被cache的select語句,則將控制權交給Optimizer,也就是Query優化器模塊,若是是DML或者是DDL語句,則會交給表變動管理模塊,若是是一些更新統計信息、檢測、修復和整理類的query則會交給表維護模塊去處理,複製相關的query則轉交給複製模塊去進行相應的處理,請求狀態的query則交給狀態收集報告模塊。實際上表變動管理模塊根據所對應的處理請求的不一樣,是分別由insert處理器、delete處理器、update處理器、create處理器,以及alter處理器這些小模塊來負責不一樣的DML和DDL的。

  第六步:在各個模塊收到Query解析與分發模塊發過來的請求後,首先會經過訪問控制模塊檢查鏈接用戶是否有訪問控制目標表以及目標字段的權限,若是有,就會調用表管理模塊請求相應的表,並獲取對應的鎖。表管理模塊首先會看到該表是否已經存在於table cache中,若是已經打開則直接進行鎖相關的處理,若是沒有在cache中,則須要在打開表文件獲取鎖,而後將打開的表交給表變動管理模塊。

  第七步:當表變動管理模塊「獲取」打開的表以後,就會根據該表的相關meta信息,判斷表的存儲引擎類型和其它相關信息。根據表的存儲引擎類型,提交請求給存儲引擎接口模塊,調用對應的存儲引擎實現模塊,進行相應處理。

  不過,對於表變動管理模塊來講,可見的僅是存儲引擎接口模塊提供的一系列「標準」接口,底層存儲引擎實現模塊的具體實現,對於表變動管理模塊來講是透明的。他只須要調用對應的接口,並指定表類型,接口模塊會根據表類型調用正確存儲引擎來進行相應的處理。

  第八步:當一條query或者是一個command處理完成(成功或者失敗)以後,控制權都會交還給鏈接線程模塊。若是處理成功,則將處理結果(多是一個Result set,也多是成功或者失敗的標識)經過鏈接線程反饋給客戶端。若是處理過程當中發生錯誤,也會將相應的錯誤信息發送給客戶端,而後鏈接線程模塊會進行相應的清理工做,並繼續等待後面的請求,重複上面提到的過程,或者完成客戶端斷開鏈接的請求。

  第九步:若是在上面的過程當中,相關模塊使數據庫中的數據發生了變化,並且MySQL打來了bin-log功能,則對應的處理模塊還會調用日誌處理模塊將相應的變動語句以更新事件的形式記錄到相關參數指定的二進制日誌文件中。

  在上面各個模塊的內容處理過程當中,各自的核心運算處理功能部分都會高度依賴整個MySQL API模塊,好比內存管理,文件I/O,數字和字符串處理等。

  以上整個過程以下圖2-2:
mysql系統架構解析

相關文章
相關標籤/搜索