Mysql系統架構

總的來說,MySQL可以看成是二層架構,第一層通常叫做SQL Layer層,在MySQL數據庫系統處理底層數據之前的所有工作都是在這一層完成的,包括權限判斷、SQL解析、執行計劃優化、query cache的處理等等;第二層就是存儲引擎層,通常叫做Storage Engine Layer,也就是底層數據存取操作實現部分,由多種存儲引擎共同組成。簡單示意圖如下:

Mysql系統架構

從上圖看起來MySQL的架構非常簡單,但實際上每一層中都含有各自的很多小模塊,尤其是第一層SQL Layer,結構相當複雜,示意圖如下:

SQL Layer層:

Mysql系統架構

Storage Engine Layer層:

Mysql系統架構

SQL Layer層包含了很多小模塊,下面逐一介紹:

1、初始化模塊:初始化模塊就是在Mysql Server啟動的時候,對整個系統做各種各樣的初始化操作,比如各種buffer、cache結構的初始化和內存空間的申請,各種系統變量的初始化設定,各種存儲引擎的初始化設置等等。

2、核心API:主要是為了提供一些需要非常高效的底層操作功能的優化實現,包括各種底層數據結構的實現,特殊算法的實現,字符串處理,數字處理等,小文件IO,格式化輸出,以及最重要的內存管理部分。

3、網絡交互模塊:底層網絡交互模塊抽象出底層網絡交互所使用的接口API,實現底層網絡數據的接收與發送,以方便其他各個模塊調用,以及對這一部分的維護。

4、Client&Server交互協議模塊:實現了客戶端與MySQL交互過程中的所有協議,當然這些協議都是建立在現有的OS和網絡協議之上的。

5、用戶模塊:主要包括用戶的登錄連接權限控制和用戶的權限管理。

7、連接管理、連接線程和線程管理:連接管理模塊負責監聽對Mysql Server的各種請求,接收連接請求,轉發所有連接請求到線程管理模塊。每一個連接上Mysql Server的客戶端請求都會被分配(或創建)一個鏈接線程為其單獨服務。而連接線程的主要工作就是負責Mysql Server與客戶端的通信,接收客戶端的請求,傳遞server端的結果信息等。線程管理模塊則負責管理維護這些連接線程,包括線程的創建和線程的cache等。

8、Query解析和轉發模塊:主要工作就是將query語句進行語義和語法的分析,然後按照不同的操作類型進行分類,做出針對性的轉發。

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

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

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

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

13、系統狀態管理模塊:負責在客戶端請求系統狀態的時候,將各種狀態數據返回給用戶,像DBA 常用的各種 show status 命令,show variables 命令等,所得到的結果都是由這個模塊返回的。

14、表管理器:每一個 MySQL 的表都有一個表的定義文件,也就是*.frm文件。表管理器的工作主要就是維護這些文件,以及一個 cache,該 cache 中的主要內容是各個表的結構信息。此外它還維護 table 級別的鎖管理。

15、日誌記錄模塊:日誌記錄模塊主要負責整個系統級別的邏輯層的日誌的記錄,包括 error log,binarylog,slow query log 等。

16、複製模塊:複製模塊又可分為 Master 模塊和 Slave 模塊兩部分,Master 模塊主要負責在Replication 環境中讀取 Master 端的 binary 日誌,以及與 Slave 端的 I/O 線程交互等工作 。Slave 模塊比 Master 模塊所要做的事情稍多一些,在系統中主要體現在兩個線程上面。一個是負責從 Master 請求和接受 binary 日誌,並寫入本地 relay log 中的 I/O 線程。另外一個是負責從 relay log 中讀取相關日誌事件,然後解析成可以在 Slave 端正確執行並得到和Master 端完全相同的結果的命令並再交給 Slave 執行的 SQL 線程。

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

熟悉了MySQL各模塊的工作職責,對於數據庫優化和主從複製等操作可以有一個更深入的瞭解,在下一篇文章中,將介紹Storage Engine Layer層的各個存儲引擎,可以加深一下對MySQL數據庫管理系統的認知。


分享到:


相關文章: