架構篇(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 -> proxy [ label =</code><code>"accept()"</code> <code>];</code>
<code>proxy -> proxy [ label =</code><code>"script: connect_server()"</code> <code>];</code>
<code>proxy -> server [ label =</code><code>"connect()"</code> <code>];</code>
<code>...;</code>
<code>server -> proxy [ label =</code><code>"recv(auth-challenge)"</code> <code>];</code>
<code>proxy -> proxy [ label =</code><code>"script: read_handshake()"</code> <code>];</code>
<code>proxy -> client [ label =</code><code>"send(auth-challenge)"</code> <code>];</code>
<code>client -> proxy [ label =</code><code>"recv(auth-response)"</code> <code>];</code>
<code>proxy -> proxy [ label =</code><code>"script: read_auth()"</code> <code>];</code>
<code>server -> proxy [ label =</code><code>"send(auth-response)"</code> <code>];</code>
<code>server -> proxy [ label =</code><code>"recv(auth-result)"</code> <code>];</code>
<code>proxy -> proxy [ label =</code><code>"script: read_auth_result()"</code> <code>];</code>
<code>proxy -> 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)