天天看點

MySQL-Proxy實作MySQL讀寫分離提高并發負載

工作拓撲:

<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&gt;.在主伺服器建立proxy使用者用于mysql-proxy使用,從伺服器也會同步這個操作

<code>mysql&gt; 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&gt;.使用用戶端連接配接mysql-proxy

<code>mysql -u proxy -h 192.168.0.204 -P 4000 -p123.com</code>

建立資料庫和表,這時的資料隻寫入主mysql,然後再同步從slave,可以先把slave的關了,看能不能寫入,這裡我就不測試了,下面測試下讀的資料!

<code>mysql&gt; create table user (number INT(10),name VARCHAR(255));</code>

<code>mysql&gt; insert into </code><code>test</code> <code>values(01,</code><code>'zhangsan'</code><code>);</code>

<code>mysql&gt; insert into user values(02,</code><code>'lisi'</code><code>);</code>

3&gt;.登陸主從mysq檢視新寫入的資料如下,

<code>mysql&gt; use </code><code>test</code><code>;</code>

<code>Database changed</code>

<code>mysql&gt; </code><code>select</code> <code>* from user;</code>

<code>+--------+----------+</code>

<code>| number | name |</code>

<code>| 1 | zhangsan |</code>

<code>| 2 | lisi |</code>

4&gt;.再登陸到mysql-proxy,查詢資料,看出能正常查詢

5&gt;.登陸從伺服器關閉mysql同步程序,這時再登陸mysql-proxy肯定會查詢不出資料

<code>slave stop;</code>

6&gt;.登陸mysql-proxy查詢資料,下面看來,能看到表,查詢不出資料

<code>mysql&gt; 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>

配置成功!真正實作了讀寫分離的效果!