工作拓撲:
<a href="http://img1.51cto.com/attachment/201310/110018378.jpg" target="_blank"></a>
MySQL Proxy有一項強大功能是實作“讀寫分離”,基本原理是讓主資料庫處理寫方面事務,讓從庫處理SELECT查詢。
Amoeba for MySQL是一款優秀的中間件軟體,同樣可以實作讀寫分離,負載均衡等功能,并且穩定性也高于MySQL Proxy,有興趣的可以測試一下。
環境描述:
作業系統:CentOS6.3_x64
主伺服器Master:192.168.0.202
從伺服器Slave:192.168.0.203
排程伺服器MySQL-Proxy:192.168.0.204
一、mysql主從複制
二、mysql-proxy實作讀寫分離
1、安裝mysql-proxy
實作讀寫分離是有lua腳本實作的,現在mysql-proxy裡面已經內建,無需再安裝
1
2
<code>tar</code> <code>zxvf mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit.</code><code>tar</code><code>.gz</code>
<code>mv</code> <code>mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit </code><code>/usr/local/mysql-proxy</code>
2、配置mysql-proxy,建立主配置檔案
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<code>cd</code> <code>/usr/local/mysql-proxy</code>
<code>mkdir</code> <code>lua </code><code>#建立腳本存放目錄</code>
<code>mkdir</code> <code>logs </code><code>#建立日志目錄</code>
<code>cp</code> <code>share</code><code>/doc/mysql-proxy/rw-splitting</code><code>.lua .</code><code>/lua</code> <code>#複制讀寫分離配置檔案</code>
<code>cp</code> <code>share</code><code>/doc/mysql-proxy/admin-sql</code><code>.lua .</code><code>/lua</code> <code>#複制管理腳本</code>
<code>vi</code> <code>/etc/mysql-proxy</code><code>.cnf </code><code>#建立配置檔案</code>
<code>[mysql-proxy]</code>
<code>user=root </code><code>#運作mysql-proxy使用者</code>
<code>admin-username=proxy </code><code>#主從mysql共有的使用者</code>
<code>admin-password=123.com </code><code>#使用者的密碼</code>
<code>proxy-address=192.168.0.204:4000 </code><code>#mysql-proxy運作ip和端口,不加端口,預設4040</code>
<code>proxy-</code><code>read</code><code>-only-backend-addresses=192.168.0.203 </code><code>#指定後端從slave讀取資料</code>
<code>proxy-backend-addresses=192.168.0.202 </code><code>#指定後端主master寫入資料</code>
<code>proxy-lua-script=</code><code>/usr/local/mysql-proxy/lua/rw-splitting</code><code>.lua </code><code>#指定讀寫分離配置檔案位置</code>
<code>admin-lua-script=</code><code>/usr/local/mysql-proxy/lua/admin-sql</code><code>.lua </code><code>#指定管理腳本</code>
<code>log-</code><code>file</code><code>=</code><code>/usr/local/mysql-proxy/logs/mysql-proxy</code><code>.log </code><code>#日志位置</code>
<code>log-level=info </code><code>#定義log日志級别,由高到低分别有(error|warning|info|message|debug)</code>
<code>daemon=</code><code>true</code> <code>#以守護程序方式運作</code>
<code>keepalive=</code><code>true</code> <code>#mysql-proxy崩潰時,嘗試重新開機</code>
<code>儲存退出!</code>
<code>chmod</code> <code>660 </code><code>/etc/mysql-porxy</code><code>.cnf</code>
3、修改讀寫分離配置檔案
<code>vi</code> <code>/usr/local/mysql-proxy/lua/rw-splitting</code><code>.lua</code>
<code>if</code> <code>not proxy.global.config.rwsplit </code><code>then</code>
<code> </code><code>proxy.global.config.rwsplit = {</code>
<code> </code><code>min_idle_connections = 1, </code><code>#預設超過4個連接配接數時,才開始讀寫分離,改為1</code>
<code> </code><code>max_idle_connections = 1, </code><code>#預設8,改為1</code>
<code> </code><code>is_debug = </code><code>false</code>
<code> </code><code>}</code>
<code>end</code>
4、啟動mysql-proxy
<code>/usr/local/mysql-proxy/bin/mysql-proxy</code> <code>--defaults-</code><code>file</code><code>=</code><code>/etc/mysql-proxy</code><code>.cnf</code>
<code>netstat</code> <code>-tupln | </code><code>grep</code> <code>4000 </code><code>#已經啟動</code>
<code>tcp 0 0 192.168.0.204:4000 0.0.0.0:* LISTEN 1264</code><code>/mysql-proxy</code>
<code>關閉mysql-proxy使用:killall -9 mysql-proxy</code>
5、測試讀寫分離
1>.在主伺服器建立proxy使用者用于mysql-proxy使用,從伺服器也會同步這個操作
<code>mysql> grant all on *.* to </code><code>'proxy'</code><code>@</code><code>'192.168.0.204'</code> <code>identified by </code><code>'123.com'</code><code>;</code>
2>.使用用戶端連接配接mysql-proxy
<code>mysql -u proxy -h 192.168.0.204 -P 4000 -p123.com</code>
建立資料庫和表,這時的資料隻寫入主mysql,然後再同步從slave,可以先把slave的關了,看能不能寫入,這裡我就不測試了,下面測試下讀的資料!
<code>mysql> create table user (number INT(10),name VARCHAR(255));</code>
<code>mysql> insert into </code><code>test</code> <code>values(01,</code><code>'zhangsan'</code><code>);</code>
<code>mysql> insert into user values(02,</code><code>'lisi'</code><code>);</code>
3>.登陸主從mysq檢視新寫入的資料如下,
<code>mysql> use </code><code>test</code><code>;</code>
<code>Database changed</code>
<code>mysql> </code><code>select</code> <code>* from user;</code>
<code>+--------+----------+</code>
<code>| number | name |</code>
<code>| 1 | zhangsan |</code>
<code>| 2 | lisi |</code>
4>.再登陸到mysql-proxy,查詢資料,看出能正常查詢
5>.登陸從伺服器關閉mysql同步程序,這時再登陸mysql-proxy肯定會查詢不出資料
<code>slave stop;</code>
6>.登陸mysql-proxy查詢資料,下面看來,能看到表,查詢不出資料
<code>mysql> show tables;</code>
<code>+----------------+</code>
<code>| Tables_in_test |</code>
<code>| user |</code>
<code>ERROR 1146 (42S02): Table </code><code>'test.user'</code> <code>doesn't exist</code>
配置成功!真正實作了讀寫分離的效果!