MySQL讀寫分離

MySQL讀寫分離

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://doerj.blog.51cto.com/6212447/1554565

一、要求

1、配置兩臺MySQL服務器和一臺代理服務器,實現MySQL代理的讀寫分離。

2、用戶只需要訪問MySQL代理服務器,實際的SQL查詢、寫入操作交給後臺的2MySQL服務器來完成。

3、其中Master服務器允許SQL查詢、寫入,Slave服務器只允許SQL查詢。

二、方案

使用4RHEL6.5虛擬機,如圖下所示。其中192.168.4.10192.168.4.20分別作爲MySQL主、從服務器,是整個服務的後端;另一臺192.168.4.30作爲MySQL代理服務器,是直接面向客戶的服務前端;客戶機192.168.4.100用作訪問測試。

wKioL1QZrhXi_EV0AAF0Yu49jvs024.jpg

對比兩種方式的讀寫分離效果——

u MySQL主從複製:客戶機訪問Master服務器來寫數據庫,客戶機訪問Slave服務 器來讀數據庫。這種情況下,需要客戶端自行區分向何處寫、從何處讀。

u MySQL主從複製+代理:客戶機訪問Proxy服務器,讀、寫請求交給Proxy識別,如果是寫數據庫操作則交給Master,如果是讀數據庫操作則交給Slave處理,具體由分配策略控制。這種情況下,無需客戶端區分讀、寫目標,而是由Proxy服務器代勞了,從而降低了客戶端程序的複雜度。

以下是在mysql主從複製的基礎上實現的,mysql主從複製部分請參見另一篇文章MySQL主從複製》

三、實現

1、部署mysql-proxy代理服務器

1)安裝MySQL官方提供的mysql-proxy軟件包

MySQL官方提供了mysql-proxy的免安裝版本,解壓後即可使用。由於msyql-proxy使用了LUA腳本語言,因此需要提前安裝好lua軟件包(RHEL6鏡像內已含)以確保其正常使用:

[root@proxy ~]# yum -y install lua

然後部署mysql-proxy軟件包:

[root@proxy 桌面]# tar zxf mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz -C /usr/local/

[root@proxy 桌面]# cd /usr/local/

[root@proxy local]# mv mysql-proxy-0.8.3-linux-rhel5-x86-64bit/ mysql-proxy //將文件改短一點,方便訪問

切換到部署後的目錄,確認相關目錄、可執行程序、腳本。一般情況下,使用bin目錄下的mysql-proxy腳本來啓動代理服務:

[root@proxy local]# cd mysql-proxy/

[root@proxy mysql-proxy]# ls

bin include lib libexec licenses share

[root@proxy mysql-proxy]# ls bin/ libexec/

bin/: //服務腳本目錄

mysql-binlog-dump mysql-myisam-dump mysql-proxy

libexec/: //可執行程序目錄

mysql-binlog-dump mysql-myisam-dump mysql-proxy

2準備讀寫分離的LUA策略腳本

直接複製mysql-proxy提供的樣例策略即可:

[root@proxy mysql-proxy]# cp share/doc/mysql-proxy/rw-splitting.lua ./

3)啓動mysql-proxy代理服務

主要命令選項:

-P(大寫):指定代理監聽的IP地址、端口

-r:指定讀服務器的IP地址、端口

-b:指定寫服務器的IP地址、端口

-s:指定lua腳本文件

--keepalive:如果服務進程崩潰,嘗試重啓此進程

[root@proxy mysql-proxy]# pwd

/usr/local/mysql-proxy

[root@proxy mysql-proxy]# bin/mysql-proxy -P 192.168.4.30:3306 \

> -b 192.168.4.10:3306 \

> -r 192.168.4.20:3306 \

> -s rw-splitting.lua &

[root@proxy mysql-proxy]# netstat -anpt | grep mysql //確認監聽狀態

tcp 0 0 192.168.4.30:3306 0.0.0.0:* LISTEN 16119/mysql-proxy

對於客戶端來說,這臺代理主機192.168.4.30就相當於一臺可讀可寫的MySQL數據庫服務器了

爲了每次開機啓動mysql-proxy代理服務可以將上面的命令寫到/etc/rc.local配置文件內

[root@proxy ~]# vim /etc/rc.local

.. ..

/usr/local/mysql-proxy/bin/mysql-proxy -P 192.168.4.30:3306 \

-b 192.168.4.10:3306 \

-r 192.168.4.20:3306 \

-s rw-splitting.lua &

2、測試通過mysql-proxy的讀寫分離

1)Master服務器上授權用戶,允許其從192.168.4.0/24的客戶機遠程訪問。

mysql> GRANT all ON *.* TO user02@'192.168.4.%' IDENTIFIED BY 'pwd123';

Query OK, 0 rows affected (0.07 sec)

因爲此前已配置mysql庫的主從同步,SLAVE上的用戶授權會自動更新

2)從客戶機上192.168.4.100訪問Mysql數據庫

[root@client ~]# mysql -h192.168.4.30 -uuser02 -ppwd123

ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.4.30' (113)

出現上面這種情況,可以關閉代理的防火牆,或者添加一條允許訪問3306端口的防火牆規則

[root@proxy ]# iptables -I INPUT -s 192.168.4.0/24 -p tcp --dport 3306 -j ACCEPT

再次登錄:

[root@client ~]# mysql -h192.168.4.30 -uuser02 -ppwd123

... ...

mysql> //表示登錄成功

mysql> CREATE DATABASE student; //新建庫

Query OK, 1 row affected (0.10 sec)

mysql> USE student;//切換到新建的庫

Database changed

mysql> CREATE TABLE info( id int(4),name varchar(48)); //新建表

Query OK, 0 rows affected (1.23 sec)

mysql> INSERT INTO info VALUES(1,"hanmeimei"),(2,"lilei"); //插入2條表記錄

Query OK, 2 rows affected (0.18 sec)

Records: 2 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM info;

+------+-----------+

| id | name |

+------+-----------+

| 1 | hanmeimei |

| 2 | lilei |

+------+-----------+

2 rows in set (0.01 sec)

mysql> quit

Bye

3)在masterslave上確認客戶端新建的表

[root@client ~]# mysql -h192.168.4.10 -uuser02 -ppwd123

mysql> USE student;

mysql> SHOW TABLES;

+-------------------+

| Tables_in_student |

+-------------------+

| info |

+-------------------+

1 row in set (0.00 sec)

mysql> SELECT * FROM info;

+------+-----------+

| id | name |

+------+-----------+

| 1 | hanmeimei |

| 2 | lilei |

+------+-----------+

2 rows in set (0.00 sec)

[root@client ~]# mysql -h192.168.4.20 -uuser02 -ppwd123

mysql> SELECT * FROM student.info;

+------+-----------+

| id | name |

+------+-----------+

| 1 | hanmeimei |

| 2 | lilei |

+------+-----------+

2 rows in set (0.00 sec)

4)觀察MySQL代理訪問的網絡連接

Proxy代理商可看到與MySQL讀、寫服務器的網絡連接:

[root@proxy mysql-proxy]# netstat -anpt | grep mysql

tcp 0 0 192.168.4.30:3306 0.0.0.0:* LISTEN 16119/mysql-proxy

tcp 0 0 192.168.4.30:60975 192.168.4.10:3306 ESTABLISHED 16119/mysql-proxy

tcp 0 0 192.168.4.30:60974 192.168.4.10:3306 ESTABLISHED 16119/mysql-proxy

tcp 0 0 192.168.4.30:60977 192.168.4.10:3306 ESTABLISHED 16119/mysql-proxy

tcp 0 0 192.168.4.30:60978 192.168.4.10:3306 ESTABLISHED 16119/mysql-proxy

tcp 0 0 192.168.4.30:60976 192.168.4.10:3306 ESTABLISHED 16119/mysql-proxy

Master上可看到來自SlaveProxy代理的網絡連接:

[root@master mysql]# netstat -anpt | grep mysql

tcp 0 0 :::3306 :::* LISTEN 3788/mysqld

tcp 0 0 ::ffff:192.168.4.10:3306 ::ffff:192.168.4.30:60974 ESTABLISHED 3788/mysqld

tcp 0 0 ::ffff:192.168.4.10:3306 ::ffff:192.168.4.30:60978 ESTABLISHED 3788/mysqld

tcp 0 0 ::ffff:192.168.4.10:3306 ::ffff:192.168.4.30:60975 ESTABLISHED 3788/mysqld

tcp 0 0 ::ffff:192.168.4.10:3306 ::ffff:192.168.4.30:60977 ESTABLISHED 3788/mysqld

tcp 0 0 ::ffff:192.168.4.10:3306 ::ffff:192.168.4.20:33555 ESTABLISHED 3788/mysqld

tcp 0 0 ::ffff:192.168.4.10:3306 ::ffff:192.168.4.30:60976 ESTABLISHED 3788/mysqld

併發訪問量沒超過指定的閥值,不區分讀寫操作,讀寫都交給負責讀的服務器一旦區分,以後都區分,直到連接數爲0

現在即使訪問不同的服務器,客戶端發覺不出服務端有什麼變化,想要觀察的話,可以在兩個服務器的同一個表裏存入不同的數據,然後在客戶端開多個終端登錄代理觀察數據的變化,

四、擴展

MySQL代理與讀(或寫)服務器的集成

在許多企業應用中,MySQL數據庫基本上都是讀多寫少,因此可以將mysql-proxyMasterSlave安裝到一起,從而減少一臺服務器,節省成本。比如:

Master+Proxy192.168.4.10/24

Slave192.168.4.20/24

這種情況下,要避免mysql-proxyMySQL服務程序的端口衝突,必要時可更改相關程序的監聽地址、端口。

若要修改MySQL服務程序的監聽地址、端口,可採用以下選項:

--bind-address=:用來限定監聽地址,比如可設爲127.0.0.1

--port=:用來改端口號,比如可改爲33060

當然,最簡單的方法還是直接將mysql-proxy改用其他端口。比如,在Master上部署mysql-proxy,啓用時可監聽192.168.4.1033060端口:

[root@proxy ~]# cd /usr/local/mysql-proxy/

[root@proxy mysql-proxy]# bin/mysql-proxy -P 192.168.4.10:3333 \

-b 192.168.4.10:3306 \

-r 192.168.4.20:3306 \

-s rw-splitting.lua &

這樣,客戶端只要訪問192.168.4.103333端口,就可以讀寫數據庫了。當服務器採用非標準的MySQL端口時,需要爲mysql工具添加 -P 選項來指定端口號:

[root@client ~]# mysql -h 192.168.4.10 -uuser02 -P 3333 -ppwd123

mysql>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章