MySQL架構組成---邏輯模塊組成


 

 

 

一、MySQL Server 系統架構

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

從上圖看起來MySQL邏輯架構非常的簡單,但實際上每一層中都含有各自的很多小模塊,尤其是第一層SQL Layer,結構相當復雜的。下面就分別針對SQL Layer 和Storage Engine Layer 做一個簡單的分析。

SQL Layer 中包含了多個子模塊,下面我將逐個做一下簡單的介紹:

 

1、初始化模塊

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

2、核心API

核心API 模塊主要是為了提供一些需要高效的底層操作功能的優化實現,包括各種底層數據結構的實現,以及最重要的內存管理,文件I/O,數字和字符串處理等等。

3、網絡交互模塊

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

 

4、Client & Server 交互協議模塊

任何C/S 結構的軟件系統,都肯定會有自己獨有的信息交互協議,MySQL 也不例外。MySQL的Client & Server 交互協議模塊部分,實現了客戶端與MySQL 交互過程中的所有協議。當然這些協議都是建立在現有的OS 和網絡協議之上的,如TCP/IP 以及Unix Socket。

 

5、用戶模塊

用戶模塊所實現的功能,主要包括用戶的登錄連接權限控制和用戶的授權管理。他就像MySQL 的大門守衛一樣,決定是否給來訪者“開門”。

 

6、訪問控制模塊

造訪客人進門了就可以想干嘛就干嘛么?為了安全考慮,肯定不能如此隨意。這時候就需要訪問控制模塊實時監控客人的每一個動作,給不同的客人以不同的權限。訪問控制模塊實現的功能就是根據用戶模塊中各用戶的授權信息,以及數據庫自身特有的各種約束,來控制用戶對數據的訪問。用戶模塊和訪問控制模塊兩者結合起來,組成了MySQL 整個數據庫系統的權限安全管理的功能。

 

7、連接管理、連接線程和線程管理

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

 

8、Query 解析和轉發模塊

MySQL 中我們習慣將所有Client 端發送給Server 端的命令都稱為query,在MySQLServer里面,連接線程接收到客戶端的一個Query 后,會直接將該query 傳遞給專門負責將各種Query 進行分類然后轉發給各個對應的處理模塊,這個模塊就是query 解析和轉發模塊。其主要工作就是將query 語句進行語義和語法的分析,然后按照不同的操作類型進行分類,然后做出針對性的轉發。

 

9、Query Cache 模塊

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

 

10、Query 優化器模塊

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 各個模塊間是如何相互協同工作的?

接下來,我們通過啟動MySQL,客戶端連接,請求query,得到返回結果,最后退出,這樣一整個過程來進行分析。

首先當我們執行啟動MySQL 命令之后,MySQL 的初始化模塊就從系統配置文件中讀取系統參數和命令行參數,並按照參數來初始化整個系統,如申請並分配buffer,初始化全局變量,以及各種結構等。同時各個存儲引擎也被啟動,並進行各自的初始化工作。當整個系統初始化結束后,由連接管理模塊接手。連接管理模塊會啟動處理客戶端連接請求的監聽程序,包括tcp/ip的網絡監聽,還有unix的socket。這時候,MySQL Server 就基本啟動完成,准備好接受客戶端請求了。

當連接管理模塊監聽到客戶端的連接請求,連接管理模塊就會將連接請求轉發給線程管理模塊,去請求一個連接線程。

線程管理模塊馬上又會將控制交給連接線程模塊,告訴連接線程模塊:現在我這邊有連接請求過來了,需要建立連接,你趕快處理一下。連接線程模塊在接到連接請求后,首先會檢查當前連接線程池中是否有空閑連接線程,如果有,就取出一個和客戶端請求連接上,如果沒有空閑的連接線程,則建立一個新的連接線程與客戶端請求連接。

注意:連接線程模塊並不是在收到連接請求后馬上就會取出一個連接線程連和客戶端連接,而是首先通過調用用戶模塊進行授權檢查,只有客戶端請求通過了授權檢查后,他才會將客戶端請求和負責請求的連接線程連上。

知識補充:在MySQL 中,將客戶端請求分為了兩種類型:一種是query,需要調用Parser ,也就是Query 解析和轉發模塊的解析才能夠執行的請求;一種是command,不需要調用Parser 就可以直接執行的請求。

當客戶端請求和連接線程“互換暗號(互通協議)”接上頭之后,連接線程就開始處理客戶端發送過來的各種命令(或者query),並將收到的query 語句轉給Query 解析和轉發模塊,Query 解析器先對Query 進行基本的語義和語法解析,然后根據命令類型的不同,有些會直接處理,有些會分發給其他模塊來處理。

例如對於SELECT語句,在解析查詢之前,服務器會先檢查緩存(Query 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 解析與分發模塊分發過來的請求后,首先會通過訪問控制模塊檢查連接用戶是否有訪問目標表以及目標字段的權限,如果有,就會調用表管理模塊請求相應的表,並獲取對應的鎖。

當表變更管理模塊“獲取”打開的表之后,就會根據該表的相關meta 信息,判斷表的存儲引擎類型和其他相關信息。根據表的存儲引擎類型,提交請求給存儲引擎接口模塊,調用對應的存儲引擎實現模塊,進行相應處理。

當一條query 或者一個command 處理完成(成功或者失敗)之后,控制權都會交還給連接線程模塊。如果處理成功,則將處理結果(可能是一個Result set,也可能是成功或者失敗的標識)通過連接線程反饋給客戶端。如果處理過程中發生錯誤,也會將相應的錯誤信息發送給客戶端,然后連接線程模塊會進行相應的清理工作,並繼續等待后面的請求,重復上面提到的過程,或者完成客戶端斷開連接的請求。

如果在上面的過程中,相關模塊使數據庫中的數據發生了變化,而且MySQL 打開了binlog功能,則對應的處理模塊還會調用日志處理模塊將相應的變更語句以更新事件的形式記錄到相關參數指定的二進制日志文件中。

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

 

二、MySQL 自帶工具使用介紹

MySQL 數據庫不僅提供了數據庫的服務器端應用程序,同時還提供了大量的客戶端工具程序,如mysql,mysqladmin,mysqldump等等

1、mysql命令

Mysql命令是用的最多的一個命令工具了,為用戶提供一個命令行接口來操作管理MySQL 服務器。

語法格式:

Usage: mysql [OPTIONS] [database]

例如:# mysql-e "select user,host from user"mysql

大家只要運行一下“mysql --help”就會得到如下相應的基本使用幫助信息:

 

這里主要介紹一些在運維過程中會用到的相關選項:

首先看看“-e, --execute=name”參數,這個參數是告訴mysql,我要執行“-e”后面的某個命令,而不是要通過mysql連接登錄到MySQL Server 上面。此參數在我們寫一些基本的MySQL 檢查和監控的腳本中非常有用,運維mysql時經常在腳本中使用到它。

#mysql  -hhostname -Pport -uusername -ppassword  -e  相關mysql的sql語句

1:

通過binlog_cache_use 以及 binlog_cache_disk_use來分析設置的binlog_cache_size是否足夠

2:通過腳本創建數據庫、表及對表進行增、改、刪、查操作。

腳本內容如下:

創建授予test用戶可以在指定的源登錄

 

測試test用戶連接mysql服務器

 

授予腳本執行權限

#chmod  +x /root/mysql1.sh

執行腳本:

如果在連接時候使用了“-E, --vertical”參數,登入之后的所有查詢結果都將以縱列顯示,效果和我們在一條query 之后以“\G”結尾一樣。

#mysql -E -u root -p

 

-H, --html”與“-X, --xml”,在啟用這兩個參數之后,select出來的所有結果都會按照“Html”與“Xml”格式來輸出,在有些場合之下,比如希望Xml或者Html 文件格式導出某些報表文件的時候,是非常方便的。

#mysql -X -u root -p

 

--prompt=name”參數對於做運維的人來說是一個非常重要的參數選項,其主要功能是定制自己的mysql提示符的顯示內容。在默認情況下,我們通過mysql登入到數據庫之后,mysql的提示符只是一個很簡單的內容”mysql>“,沒有其他任何附加信息。非常幸運的是mysql通過“--prompt=name”參數給我們提供了自定義提示信息的辦法,可以通過配置顯示登入的主機地址,登錄用戶名,當前時間,當前數據庫schema,MySQL Server 的一些信

息等等。我個人強烈建議將登錄主機名,登錄用戶名和所在的schema 這三項加入提示內容,

因為當大家手邊管理的MySQL 越來越多,操作越來越頻繁的時候,非常容易因為操作的時候沒有太在意自己當前所處的環境而造成在錯誤的環境執行了錯誤的命令並造成嚴重后果的情況。如果我們在提示內容中加入了這幾項之后,至少可以更方便的提醒自己當前所處環境,以盡量減少犯錯誤的概率。

個人強烈建議提示符定義: "\\u@\\h : \\d \\r:\\m:\\s> ",顯示效果:

 

切換數據庫

 

提示符解釋:

\u 表示用戶名,  \h 表示主機名, \d 表示當前數據庫,\r小時(12小時制),\m分種,\s秒,\R  The current time, in 24-hour military time (0–23)

--tee=name”參數也是對運維人員非常有用的參數選項,用來告訴mysql,將所有輸入和輸出內容都記錄進文件。在我們一些較大維護變更的時候,為了方便被查,最好是將整個操作過程的所有輸入和輸出內容都保存下來。

假如mysql命令行狀態下,要進行大量的交互操作,其實可以把這些操作記錄在log中進行審計,很簡單mysql -u root -p --tee=/path/xxxx.log

也可以在服務器上的/etc/my.cnf中的[client]加入 

tee =/tmp/client_mysql.log即可.

注:若沒有[client]就添加即可

或者在mysql>提示符下執行下面的命令

mysql其他參數選項可以通過MySQL 官方參考手冊查閱,也可以通過執行“mysql --help”或man  mysql得到幫助信息之后通過自行實驗來做進一步的深刻認識。

2、mysqladmin

Usage: mysqladmin [OPTIONS] command command ...

mysqadmin,顧名思義,提供的功能都是與MySQL 管理相關的各種功能。如MySQL Server狀態檢查,各種統計信息的flush,創建/刪除數據庫,關閉MySQL Server 等等。mysqladmin所能做的事情,雖然大部分都可以通過mysql連接登錄上MySQL Server 之后來完成,但是大部分通過mysqladmin來完成操作會更簡單更方便。這里將介紹一下經常使用到的幾個常用功能:

ping 命令可以很容易檢測MySQL Server 是否還能正常提供服務

mysql本機上測試:

在其他主機上測試mysql server是否正常提供服務

 

1:地址192.168.56.11是mysql server的ip

2:mysql server的防火牆要允許3306/tcp通信

3:在mysql server上創建授權用戶

status 命令可以獲取當前MySQL Server 的幾個基本的狀態值:

 

mysqladmin status命令結果有下述列

Uptime:是mysql服務器運行的秒數。

Threads:活躍線程的數量即開啟的會話數。

Questions: 服務器啟動以來客戶的問題(查詢)數目  (只要跟mysql作交互,不管查詢表,還是查詢服務器狀態都記一次)。

Slow queries:是慢查詢的數量。

Opens:mysql已經打開的數據庫表的數量

Flush tables: mysql已經執行的flush  tables,refresh和reload命令的數量。

注:flush  tables  //刷新表(清除緩存)

reload 重載授權表

  refresh 洗掉所有表並關閉和打開日志文件

open:打開數據庫的表的數量,以服務器啟動開始。

Queries per second avg:select語句平均查詢時間

Memory in use分配的內存(只有在MySQL用--with-debug編譯時可用)

Max memory used分配的最大內存(只有在MySQL用--with-debug編譯時可用)

 

processlist獲取當前數據庫的連接線程信息:

監控mysql進程運行狀態:

上面的這三個功能在一些簡單監控腳本中經常使用到的。

mysqladmin其他參數選項可以通過執行“mysqladmin --help”或man  mysqladmin得到幫助信息。

編寫一個簡單的mysql監控腳本,內容如下:

附加知識點1:

Mysql的系統數據庫:

1)  INFORMATION_SCHEMA數據字典:此數據庫存貯了其他所有數據庫的信息(元數據)。元數據是關於數據的數據,如database name或table name,列的數據類型,或訪問權限等。

INFORMATION_SCHEMA庫的主要系統表

TABLES:提供了關於數據庫中的表和視圖的信息。(Table_schema字段代表 數據表所屬的數據庫名)

SELECT  *  FROM information_schema.TABLES WHERE  TABLE_SCHEMA='數據庫名'; 

COLUMNS:提供了表中的列信息。詳細表述了某張表的所有列以及每個列的信息。

SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='數據庫名‘' AND TABLE_NAME='表名'

TABLE_CONSTRAINTS:存儲主鍵約束、外鍵約束、唯一約束、check約束。各字段的說明信息

ELECT * FROM information_schema.TABLE_CONSTRAINTS  WHERE  TABLE_SCHEMA='數據庫名' AND TABLE_NAME='表名'

STATISTICS:提供了關於表索引的信息。

SELECT * FROM information_schema.STATISTICS WHERE TABLE_SCHEMA='數據庫名' AND TABLE_NAME='表名' 

2)performance_schema性能字典,此數據庫為數據庫性能優化提供重要的參考信息

 

3)MYSQL數據庫: 該數據庫也是個核心數據庫,存儲用戶的權限信息與幫助信息。

 

4)MySQL5.7 提供了 sys系統數據庫。 sys數據庫里面包含了一系列的存儲過程、自定義函數以及視圖來幫助我們快速的了解系統的元數據信息。sys系統數據庫結合了information_schema和performance_schema的相關數據,讓我們更加容易的檢索元數據。

 

附加知識點2:

mysql有關show的用法 

SHOW DATABASES列出 MySQL Server上的數據庫。 

SHOW TABLES [FROM db_name]列出數據庫中的表。 

SHOW TABLE STATUS [FROM db_name]列出數據庫的表信息,比較詳細。 

SHOW COLUMNS FROM tbl_name [FROM db_name]列出表的列信息,同 SHOW FIELDS FROM tbl_name [FROM db_name],

DESCRIBE tbl_name [col_name]。 

SHOW FULL COLUMNS FROM tbl_name [FROM db_name]列出表的列信息,比較詳細,同 SHOW FULL FIELDS FROM tbl_name [FROM db_name]。  

SHOW INDEX FROM tbl_name [FROM db_name]列出表的索引信息。 

SHOW STATUS列出 Server 的狀態信息。 

SHOW VARIABLES列出 MySQL 系參數值

SHOW PROCESSLIST查看當前mysql查詢進程

SHOW GRANTS FOR user列出用戶的授權命令

 

3、mysqldump:

這個工具其功能就是將MySQL Server中的數據以SQL 語句的形式從數據庫中dump 成文本文件。mysqldump是做為MySQL 的一種邏輯備份工具

 

4、mysqlbinlog

mysqlbinlog程序的主要功能就是分析MySQL Server 所產生的二進制日志(也就是binlog)。

通過mysqlbinlog,我們可以解析出binlog中指定時間段或者指定日志起始和結束位置的內容解析成SQL 語句。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM