天天看點

原創】MySQL Proxy - 架構篇

架構篇(architecture) 

       mysql proxy 的定位是存在于 mysql client 和 mysql server 之間的一個簡單的程式,能夠對從其上通過的資料進行檢查、轉換和直接進行相應操作。 

應用範圍包括: 

負載均衡(load balancing)

故障處理(fail over)

查詢追蹤(query tracking)

查詢分析(query analysis)

(...)

       内部實作上講,mysql proxy 是這樣的一個協定棧: 

(應該有個圖,但是,額,太監了) 

基于這個 core 能夠将 protocol 的各個 phase 暴露給 plugin 。 

connect -> auth;

auth -> command;

command -> disconnect;

command -> command;

connect -> disconnect;

auth -> disconnect;

       上述生命周期中的每一個階段都包含了多種協定狀态變遷。以鑒權過程為例,其包含了至少 3 個包: 

life-cycle 中涉及的實體: client, proxy, server; 

<a href="http://my.oschina.net/moooofly/blog/114160#">?</a>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<code>client -&gt; proxy [ label =</code><code>"accept()"</code> <code>];</code>

<code>proxy -&gt; proxy [ label =</code><code>"script: connect_server()"</code> <code>];</code>

<code>proxy -&gt; server [ label =</code><code>"connect()"</code> <code>];</code>

<code>...;</code>

<code>server -&gt; proxy [ label =</code><code>"recv(auth-challenge)"</code> <code>];</code>

<code>proxy -&gt; proxy [ label =</code><code>"script: read_handshake()"</code> <code>];</code>

<code>proxy -&gt; client [ label =</code><code>"send(auth-challenge)"</code> <code>];</code>

<code>client -&gt; proxy [ label =</code><code>"recv(auth-response)"</code> <code>];</code>

<code>proxy -&gt; proxy [ label =</code><code>"script: read_auth()"</code> <code>];</code>

<code>server -&gt; proxy [ label =</code><code>"send(auth-response)"</code> <code>];</code>

<code>server -&gt; proxy [ label =</code><code>"recv(auth-result)"</code> <code>];</code>

<code>proxy -&gt; proxy [ label =</code><code>"script: read_auth_result()"</code> <code>];</code>

<code>proxy -&gt; client [ label =</code><code>"send(auth-result)"</code> <code>];</code>

      當核心層 core 面對大量 connection 的時候是具備自由伸縮特性時,plugin/scripting 層就能夠輕易對 end-users 隐藏細節,并簡化用戶端的實作。 

mysql proxy 是通過各種庫(chassis, libraries and plugins)建構出來的協定棧: 

其中 chassis 提供了指令行和作為 daemon 應用所需的所有通用函數實作,包括: 

指令行和配置檔案(commandline and configfiles)

日志(logging)

支援 daemon/service 方式運作(daemon/service support)

plugin 加載(plugin loading)

同時 mysql procotol 的 libraries 還實作了實作了各種編碼解碼功能: 

用戶端協定(client protocol)

binlog 協定(binlog protocol)

myisam 檔案處理(myisam files)

frm 檔案處理(frm files)

masterinfo 檔案處理(masterinfo files)

繼續閱讀