MySQL Proxy和 Amoeba 工作機制淺析


MySQL Proxy處於客戶端應用程序和MySQL服務器之間,通過截斷、改變並轉發客戶端和后端數據庫之間的通信來實現其功能,這和WinGate 之類的網絡代理服務器的基本思想是一樣的。代理服務器是和TCP/IP協議打交道,而要理解MySQL Proxy的工作機制,同樣要清楚MySQL客戶端和服務器之間的通信協議,MySQL Protocol 包括認證和查詢兩個基本過程:

認證過程包括:

  1. 客戶端向服務器發起連接請求
  2. 服務器向客戶端發送握手信息
  3. 客戶端向服務器發送認證請求
  4. 服務器向客戶端發送認證結果

如果認證通過,則進入查詢過程:

  1. 客戶端向服務器發起查詢請求
  2. 服務器向客戶端返回查詢結果

當然,這只是一個粗略的描述,每個過程中發送的包都是有固定格式的,想詳細了解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腳本,真是創意無限啊。

 

 

原理圖:

MySQL read write splitting

 

 

 

 

 

 

 

 

 

Amoeba是一個類似MySQL Proxy的分布式數據庫中間代理層軟件,是由陳思儒開發的一個開源的java項目。其主要功能包括讀寫分離,垂直分庫,水平分庫等,經過測試,發現其功能和穩定性都非常的不錯,如果需要構架分布式數據庫環境,采用Amoeba是一個不錯的方案。目前Amoeba一共包括For aladdin,For MySQL和For Oracle三個版本,本文主要關注For MySQL版本的一個讀寫分離實現。實際上垂直切分和水平切分的架構也相差不大,改動幾個配置就可以輕松實現。

下圖是一個采用Amoeba的讀寫分離技術結合MySQL的Master-Slave Replication的一個分布式系統的架構: amoeba_mysql

Amoeba處於在應用和數據庫之間,扮演一個中介的角色,將應用傳遞過來的SQL語句經過分析后,將寫的語句交給Master庫執行,將讀的語句路由到Slave庫執行(當然也可以到Master讀,這個完全看配置)。Amoeba實現了簡單的負載均衡(采用輪詢算法)和Failover。如果配置了多個讀的庫,則任何一個讀的庫出現宕機,不會導致整個系統故障,Amoeba能自動將讀請求路由到其他可用的庫上,當然,寫還是單點的依賴於Master數據庫的,這個需要通過數據庫的切換,或者水平分割等技術來提升Master庫的可用性。

Amoeba可以在不同機器上啟動多個,並且做同樣的配置來進行水平擴展,以分擔壓力和提升可用性,可以將Amoeba和MySQL裝在同一台機器,也可以裝在不同的機器上,Amoeba本身不做數據緩存,所以對於內存消耗很少,主要是CPU占用。對於應用來說,圖中的三個Amoeba就是三台一模一樣的MySQL數據庫,連接其中任何一台都是可以的,所以需要在應用端有一個Load balance和Failover的機制,需要連接數據庫時從三台中隨機挑選一台即可,如果其他任何一台出現故障,則可以自動Failover到剩余的可用機器上。MySQL的JDBC驅動從connector-j 3.17版本起已經提供了這樣的負載均衡和故障切換的功能,那么剩下的事情對於應用來說就很簡單了,不需要做太多的改動就能搭建一套高可用的MySQL分布式數據庫環境,何樂而不為?


免責聲明!

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



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