mysql proxy資料庫中介軟體架構

2021-08-03 18:52:00 字數 3628 閱讀 4589

一、mysql-proxy簡介

mysql-proxy是mysql官方提供的mysql中介軟體服務,上游可接入若干個mysql-client,後端可連線若干個mysql-server。

它使用mysql協議,任何使用mysql-client的上游無需修改任何**,即可遷移至mysql-proxy上。

mysql-proxy最基本的用法,就是作為乙個請求攔截,請求中轉的中間層:

進一步的,mysql-proxy可以分析與修改請求。攔截查詢和修改結果,需要通過編寫lua指令碼來完成。

mysql-proxy允許使用者指定lua指令碼對請求進行攔截,對請求進行分析與修改,它還允許使用者指定lua指令碼對伺服器的返回結果進行修改,加入一些結果集或者去除一些結果集均可。

所以說,根本上,mysql-proxy是乙個官方提供的框架,具備良好的擴充套件性,可以用來完成:

這個框架提供了6個hook點,能夠讓使用者能夠動態的介入到client與server中的通訊中去。

二、mysql-proxy架構與原理

如「簡介」中所述,mysql-proxy向使用者提供了6個hook點,讓使用者實現lua指令碼來完成各種功能,這些hook點是以函式的形式提供的,使用者可以實現這些函式,在不同事件、不同操作發生時,做我們期望的事情。

connect_server()

mysql-client向proxy發起連線時,proxy會呼叫這個函式。使用者可以實現該函式,來做一些負載均衡的事情,例如選擇將要連向那個mysql-server。假設有多個mysql-server後端,而使用者又沒有實現這個函式,proxy預設採用輪詢(round-robin)策略。

read_handshake()

mysql-server向proxy返回「初始握手資訊」時,proxy會呼叫這個函式。使用者可以實現這個函式,來做更多的許可權驗證工作。

read_auth()

mysql-client向proxy傳送認證報文(user_name, password,database)時,proxy會呼叫這個函式。

read_auth_result()

mysql-server向proxy返回認證結果時,proxy會呼叫這個函式。

read_query()

認證完成後,mysql-client每次經過proxy向mysql-server傳送query報文時,proxy會呼叫這個函式。使用者如果要攔截請求,就可以模擬mysql-server直接返回了,當然使用者亦可以實現各種策略,修改請求,路由請求等各種不同的業務邏輯。

read_query_result()

認證完成後,mysql-server每次經過proxy向mysql-client返回query結果時,proxy會呼叫這個函式。需要注意,如果使用者沒有顯示實現read_query()函式,則read_query_result()函式是不會被呼叫的。使用者可以在此處實現各種合併策略,或者對結果集進行修改。

下圖是乙個各hook函式的觸發架構圖,箭頭方向表示觸發時機:

可以發現,最重要的兩個函式其實是read_query()和read_query_result(),各種sql的改寫與結果集的改寫邏輯,都是在這兩個函式中實現的,更細節的query過程如下圖:

三、mysql-proxy典型應用

案例一: sql時間統計分析

假設mysql-client提交的原sql為:

xyz; 

proxy可以在read_query()裡將其改寫為:

select now(); 

xyz; 

select now(); 

這樣在返回結果集時,就可以在應用層對sql時間進行記錄,以方便統計分析。

案例二:sql效能統計分析

假設mysql-client提交的原sql為:

xyz; 

proxy可以在read_query()裡將其改寫為:

xyz; 

explain xyz; 

這樣在返回結果集時,就可以在應用層對sql效能進行記錄,以方便統計分析。

需要強調的是,這兩個案例,由於proxy在read_query()時對sql進行了改寫,故在read_query_result()時,mysql-server其實返回了比原請求更多的資訊,proxy一定要將多餘的資訊去掉,再返回mysql-client。多說一句,可以加入乙個唯一id,來對請求sql和返回結果進行配對。

案例三:讀寫分離

mysql-proxy啟動時,通過引數即可配置後端mysql-server是主server還是read-only,無需修改任何**:

shell> mysql-proxy \ 

--proxy-backend-addresses=10.0.1.2:3306 \ 

--proxy-read-only-backend-addresses=10.0.1.3:3306 

注意,這裡的兩個mysql-server為主從架構。

案例四:效能水平擴充套件

mysql-proxy啟動時,通過引數配置多個後端,即可實現效能的水平擴充套件,無需修改任何**:

shell> mysql-proxy \ 

--proxy-backend-addresses=10.0.1.2:3306 \ 

--proxy-backend-addresses=10.0.1.3:3306 

注意,這裡的兩個mysql-server為主主架構,如果不做特殊修改,負載均衡策略為round-robin。

四、mysql-proxy其他問題

提問:lua指令碼引入的額外開銷有多大?

官網回答:lua很快,對於大部分應用來說,額外開銷很小,原始包(raw packet)開銷大概在400微秒左右。

樓主:這,,,我不太相信。

提問:mysql-proxy和mysql-server可以部署在一台機器上麼?

官網回答:proxy單獨部署也可以,和mysql部署在同一臺機器上也可以。相比mysql而言,proxy不怎麼佔cpu和記憶體,其效能損耗可以忽略不計。

樓主:這,,,效能損耗可以忽略,這我也不太信。

提問:proxy可以處理ssl連線麼?proxy不會獲取和儲存我的明文密碼吧?

官網回答:作為中間人,不能處理加密資訊。不會獲取密碼,也獲取不到。mysql協議不允許密碼以明文傳輸,傳輸的都是加密後的密文。

mysql proxy資料庫中介軟體架構

一 mysql proxy簡介 mysql proxy是mysql官方提供的mysql中介軟體服務,上游可接入若干個mysql client,後端可連線若干個mysql server。它使用mysql協議,任何使用mysql client的上游無需修改任何 即可遷移至mysql proxy上。mys...

面試 資料庫 中介軟體

lru是redis唯一支援的 演算法 no eviction 不刪除策略 對於所有的key allkeys lru 刪除最近訪問頻率低的key allkeys random 隨機刪除一部分key 對於設定expire volatile lru 刪除最近訪問頻率低的key volatile rando...

mysql資料庫中介軟體 Mysql 資料庫中介軟體

讀寫分離 簡單的說是把對資料庫讀和寫的操作分開對應不同的資料庫伺服器,這樣能有效地減輕資料庫壓力,也能減輕io壓力。主資料庫提供寫操作,從資料庫提供讀操作,其實在很多系統中,主要是讀的操作。當主資料庫進行寫操作時,資料要同步到從的資料庫,這樣才能有效保證資料庫完整性。分庫分表 水平分割槽 分表 垂直...