原文:http://www.ningoo.net/html/2008/how_mysql_proxy_works.html
MySQL Proxy處於用戶端應用程式和MySQL伺服器之間,通過截斷、改變並轉寄用戶端和後端資料庫之間的通訊來實現其功能,這和WinGate之類的網路代理程式伺服器的基本思想是一樣的。Proxy 伺服器是和TCP/IP協議打交道,而要理解MySQL Proxy的工作機制,同樣要清楚MySQL用戶端和伺服器之間的通訊協定,MySQL Protocol包括認證和查詢兩個基本過程:
認證過程包括:
- 用戶端向伺服器發起串連請求
- 伺服器向用戶端發送握手資訊
- 用戶端向伺服器發送認證請求
- 伺服器向用戶端發送認證結果
如果認證通過,則進入查詢過程:
- 用戶端向伺服器發起查詢請求
- 伺服器向用戶端返回查詢結果
當然,這隻是一個粗略的描述,每個過程中發送的包都是有固定格式的,想詳細瞭解MySQL Protocol的同學,可以去這裡看看。MySQL Proxy要做的,就是介入協議的各個過程。首先MySQL Proxy以伺服器的身份接受用戶端請求,根據配置對這些請求進行分析處理,然後以用戶端的身份轉寄給相應的後端資料庫伺服器,再接受伺服器的資訊,返回給用戶端。所以MySQL Proxy需要同時實現用戶端和伺服器的協議。由於要對用戶端發送過來的SQL語句進行分析,還需要包含一個SQL解析器。可以說MySQL Proxy相當於一個輕量級的MySQL了,實際上,MySQL Proxy的admin server是可以接受SQL來查詢狀態資訊的。
MySQL Proxy通過lua指令碼來控制串連轉寄的機制。主要的函數都是配合MySQL Protocol各個過程的,這一點從函數名上就能看出來:
- connect_server()
- read_handshake()
- read_auth()
- read_auth_result()
- read_query()
- read_query_result()
至於為什麼採用lua指令碼語言,我想這是因為MySQL Proxy中採用了wormhole儲存引擎的關係吧,這個蟲洞儲存引擎很有意思,資料的儲存格式就是一段lua指令碼,真是創意無限啊。