自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

mysql-proxy數(shù)據(jù)庫(kù)中間件架構(gòu)

開(kāi)發(fā) 開(kāi)發(fā)工具 MySQL
mysql-proxy是mysql官方提供的mysql中間件服務(wù),本文主要介紹mysql-proxy架構(gòu)與原理以及典型應(yīng)用等。

一、mysql-proxy簡(jiǎn)介

mysql-proxy是mysql官方提供的mysql中間件服務(wù),上游可接入若干個(gè)mysql-client,后端可連接若干個(gè)mysql-server。

它使用mysql協(xié)議,任何使用mysql-client的上游無(wú)需修改任何代碼,即可遷移至mysql-proxy上。

mysql-proxy最基本的用法,就是作為一個(gè)請(qǐng)求攔截,請(qǐng)求中轉(zhuǎn)的中間層:

請(qǐng)求攔截與請(qǐng)求中轉(zhuǎn)

進(jìn)一步的,mysql-proxy可以分析與修改請(qǐng)求。攔截查詢和修改結(jié)果,需要通過(guò)編寫Lua腳本來(lái)完成。

mysql-proxy允許用戶指定Lua腳本對(duì)請(qǐng)求進(jìn)行攔截,對(duì)請(qǐng)求進(jìn)行分析與修改,它還允許用戶指定Lua腳本對(duì)服務(wù)器的返回結(jié)果進(jìn)行修改,加入一些結(jié)果集或者去除一些結(jié)果集均可。

所以說(shuō),根本上,mysql-proxy是一個(gè)官方提供的框架,具備良好的擴(kuò)展性,可以用來(lái)完成:

  • sql攔截與修改
  • 性能分析與監(jiān)控
  • 讀寫分離
  • 請(qǐng)求路由
  • ...

這個(gè)框架提供了6個(gè)hook點(diǎn),能夠讓用戶能夠動(dòng)態(tài)的介入到client與server中的通訊中去。

二、mysql-proxy架構(gòu)與原理

如“簡(jiǎn)介”中所述,mysql-proxy向用戶提供了6個(gè)hook點(diǎn),讓用戶實(shí)現(xiàn)Lua腳本來(lái)完成各種功能,這些hook點(diǎn)是以函數(shù)的形式提供的,用戶可以實(shí)現(xiàn)這些函數(shù),在不同事件、不同操作發(fā)生時(shí),做我們期望的事情。

connect_server()

mysql-client向proxy發(fā)起連接時(shí),proxy會(huì)調(diào)用這個(gè)函數(shù)。用戶可以實(shí)現(xiàn)該函數(shù),來(lái)做一些負(fù)載均衡的事情,例如選擇將要連向那個(gè)mysql-server。假設(shè)有多個(gè)mysql-server后端,而用戶又沒(méi)有實(shí)現(xiàn)這個(gè)函數(shù),proxy默認(rèn)采用輪詢(round-robin)策略。

read_handshake()

mysql-server向proxy返回“初始握手信息”時(shí),proxy會(huì)調(diào)用這個(gè)函數(shù)。用戶可以實(shí)現(xiàn)這個(gè)函數(shù),來(lái)做更多的權(quán)限驗(yàn)證工作。

read_auth()

mysql-client向proxy發(fā)送認(rèn)證報(bào)文(user_name, password,database)時(shí),proxy會(huì)調(diào)用這個(gè)函數(shù)。

read_auth_result()

mysql-server向proxy返回認(rèn)證結(jié)果時(shí),proxy會(huì)調(diào)用這個(gè)函數(shù)。

read_query()

認(rèn)證完成后,mysql-client每次經(jīng)過(guò)proxy向mysql-server發(fā)送query報(bào)文時(shí),proxy會(huì)調(diào)用這個(gè)函數(shù)。用戶如果要攔截請(qǐng)求,就可以模擬mysql-server直接返回了,當(dāng)然用戶亦可以實(shí)現(xiàn)各種策略,修改請(qǐng)求,路由請(qǐng)求等各種不同的業(yè)務(wù)邏輯。

read_query_result()

認(rèn)證完成后,mysql-server每次經(jīng)過(guò)proxy向mysql-client返回query結(jié)果時(shí),proxy會(huì)調(diào)用這個(gè)函數(shù)。需要注意,如果用戶沒(méi)有顯示實(shí)現(xiàn)read_query()函數(shù),則read_query_result()函數(shù)是不會(huì)被調(diào)用的。用戶可以在此處實(shí)現(xiàn)各種合并策略,或者對(duì)結(jié)果集進(jìn)行修改。

下圖是一個(gè)各hook函數(shù)的觸發(fā)架構(gòu)圖,箭頭方向表示觸發(fā)時(shí)機(jī):

各hook函數(shù)的觸發(fā)架構(gòu)圖

可以發(fā)現(xiàn),最重要的兩個(gè)函數(shù)其實(shí)是read_query()和read_query_result(),各種sql的改寫與結(jié)果集的改寫邏輯,都是在這兩個(gè)函數(shù)中實(shí)現(xiàn)的,更細(xì)節(jié)的query過(guò)程如下圖:

query過(guò)程

三、mysql-proxy典型應(yīng)用

案例一: sql時(shí)間統(tǒng)計(jì)分析

假設(shè)mysql-client提交的原sql為:

  1. XYZ; 

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

  1. SELECT NOW(); 
  2. XYZ; 
  3. SELECT NOW(); 

這樣在返回結(jié)果集時(shí),就可以在應(yīng)用層對(duì)sql時(shí)間進(jìn)行記錄,以方便統(tǒng)計(jì)分析。

案例二:sql性能統(tǒng)計(jì)分析

假設(shè)mysql-client提交的原sql為:

  1. XYZ; 

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

  1. XYZ; 
  2. EXPLAIN XYZ; 

這樣在返回結(jié)果集時(shí),就可以在應(yīng)用層對(duì)sql性能進(jìn)行記錄,以方便統(tǒng)計(jì)分析。

需要強(qiáng)調(diào)的是,這兩個(gè)案例,由于proxy在read_query()時(shí)對(duì)sql進(jìn)行了改寫,故在read_query_result()時(shí),mysql-server其實(shí)返回了比原請(qǐng)求更多的信息,proxy一定要將多余的信息去掉,再返回mysql-client。多說(shuō)一句,可以加入一個(gè)唯一ID,來(lái)對(duì)請(qǐng)求sql和返回結(jié)果進(jìn)行配對(duì)。

案例三:讀寫分離

mysql-proxy啟動(dòng)時(shí),通過(guò)參數(shù)即可配置后端mysql-server是主server還是read-only,無(wú)需修改任何代碼:

  1. shell> mysql-proxy \ 
  2. --proxy-backend-addresses=10.0.1.2:3306 \ 
  3. --proxy-read-only-backend-addresses=10.0.1.3:3306 

注意,這里的兩個(gè)mysql-server為主從架構(gòu)。

案例四:性能水平擴(kuò)展

mysql-proxy啟動(dòng)時(shí),通過(guò)參數(shù)配置多個(gè)后端,即可實(shí)現(xiàn)性能的水平擴(kuò)展,無(wú)需修改任何代碼:

  1. shell> mysql-proxy \ 
  2. --proxy-backend-addresses=10.0.1.2:3306 \ 
  3. --proxy-backend-addresses=10.0.1.3:3306 

注意,這里的兩個(gè)mysql-server為主主架構(gòu),如果不做特殊修改,負(fù)載均衡策略為round-robin。

四、mysql-proxy其他問(wèn)題

提問(wèn):Lua腳本引入的額外開(kāi)銷有多大?

官網(wǎng)回答:Lua很快,對(duì)于大部分應(yīng)用來(lái)說(shuō),額外開(kāi)銷很小,原始包(raw packet)開(kāi)銷大概在400微秒左右。

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

提問(wèn):mysql-proxy和mysql-server可以部署在一臺(tái)機(jī)器上么?

官網(wǎng)回答:proxy單獨(dú)部署也可以,和mysql部署在同一臺(tái)機(jī)器上也可以。相比mysql而言,proxy不怎么占CPU和內(nèi)存,其性能損耗可以忽略不計(jì)。

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

提問(wèn):proxy可以處理SSL連接么?proxy不會(huì)獲取和保存我的明文密碼吧?

官網(wǎng)回答:作為中間人,不能處理加密信息。不會(huì)獲取密碼,也獲取不到。mysql協(xié)議不允許密碼以明文傳輸,傳輸?shù)亩际羌用芎蟮拿芪摹?/p>

提問(wèn):在Lua腳本里可以使用LuaSocket,連緩存,連其他服務(wù)么?

官網(wǎng)回答:理論上可以。但是,大哥,你確定要這樣做么,強(qiáng)烈不建議這樣。

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2017-12-01 05:04:32

數(shù)據(jù)庫(kù)中間件Atlas

2017-11-27 05:36:16

數(shù)據(jù)庫(kù)中間件TDDL

2017-11-27 05:06:42

數(shù)據(jù)庫(kù)中間件cobar

2018-02-24 19:37:33

Java8數(shù)據(jù)庫(kù)中間件

2011-08-10 13:03:58

CJDBC數(shù)據(jù)庫(kù)集群

2021-07-27 05:49:59

MySQL數(shù)據(jù)庫(kù)中間件

2017-07-26 09:41:28

MyCATSQLMongoDB

2017-12-01 05:40:56

數(shù)據(jù)庫(kù)中間件join

2017-11-27 06:01:37

數(shù)據(jù)庫(kù)中間件中間層

2017-12-11 13:30:49

Go語(yǔ)言數(shù)據(jù)庫(kù)中間件

2017-07-18 17:35:16

數(shù)據(jù)庫(kù)MyCATPreparedSta

2017-11-03 11:02:08

數(shù)據(jù)庫(kù)中間件

2017-11-30 08:56:14

數(shù)據(jù)庫(kù)中間件架構(gòu)師

2024-12-06 08:29:29

2009-06-16 10:53:01

JBoss中間件JBoss架構(gòu)

2017-07-18 17:07:40

數(shù)據(jù)庫(kù) MyCATJoin

2020-10-15 08:34:32

數(shù)據(jù)庫(kù)中間件漫談

2009-01-20 10:45:55

Oracle數(shù)據(jù)庫(kù)中間件

2019-09-29 11:04:22

MySQL數(shù)據(jù)庫(kù)Atlas

2020-02-10 15:30:51

數(shù)據(jù)庫(kù)MySQLDAL
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)