實現MySQL讀寫分離

1.實現MySQL讀寫分離
問題
本案例要求配置2臺MySQL服務器+1臺代理服務器,實現MySQL代理的讀寫分離:
用戶只需要訪問MySQL代理服務器,而實際的SQL查詢、寫入操作交給後臺的2臺MySQL服務器來完成
其中Master服務器允許SQL查詢、寫入,Slave服務器只允許SQL查詢
方案
使用4臺RHEL 6虛擬機,如圖-2所示。其中192.168.4.10、192.168.4.20分別作爲MySQL主、從服務器,是整個服務的後端;另一臺192.168.4.100作爲MySQL代理服務器,是直接面向客戶的服務前端;客戶機192.168.4.120用作訪問測試。如圖-1所示。
在這裏插入圖片描述
圖-1
對比兩種方式的讀寫分離效果——
MySQL主從複製:客戶機訪問Master服務器來寫數據庫,客戶機訪問Slave服務器來讀數據庫。這種情況下,需要客戶端自行區分向何處寫、從何處讀。
MySQL主從複製+代理:客戶機訪問Proxy服務器,讀、寫請求交給Proxy識別,如果是寫數據庫操作則交給Master,如果是讀數據庫操作則交給Slave處理,具體由分配策略控制。這種情況下,無需客戶端區分讀、寫目標,而是由Proxy服務器代勞了,從而降低了客戶端程序的複雜度。
其中MySQL主、從複製結構的搭建參考前面的課程,這裏不再贅述。
若希望測試方便,可去除同步庫的限制,由Slave自動複製Master上的所有更新:
[root@dbsvr2 ~]# vim /etc/my.cnf
[mysqld]
… …
#replicate_do_db=mysql //註釋或刪除相關限制
#replicate-wild-do-table=mysql.%
#replicate_do_db=test
#replicate-wild-do-table=test.%

[root@dbsvr2 ~]# service mysql restart //重啓服務
Shutting down MySQL… [確定]
Starting MySQL… [確定]
步驟
實現此案例需要按照如下步驟進行。
步驟一:部署mysql-proxy代理服務器
1)安裝MySQL官方提供的mysql-proxy軟件包
MySQL官方提供了mysql-proxy的免安裝版本,解壓後即可使用。由於msyql-proxy使用了LUA腳本語言,因此需要提前安裝好lua軟件包(RHEL6鏡像內已含)以確保其正常使用:
[root@pxysvr ~]# yum -y install lua
… …
然後部署mysql-proxy軟件包:
[root@pxysvr pub]# tar zxf mysql-proxy-0.8.3-linux-rhel5-x86-64bit.tar.gz
[root@pxysvr pub]# mv mysql-proxy-0.8.3-linux-rhel5-x86-64bit /usr/local/mysql-proxy
切換到部署後的目錄,可確認相關目錄、可執行程序、腳本。一般情況下,使用bin目錄下的mysql-proxy腳本來啓動代理服務:
[root@pxysvr pub]# cd /usr/local/mysql-proxy/
[root@pxysvr mysql-proxy]# ls
bin include lib libexec licenses share
[root@pxysvr 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@pxysvr mysql-proxy]# cp share/doc/mysql-proxy/rw-splitting.lua ./
[root@pxysvr mysql-proxy]# file rw-splitting.lua //查看腳本類型
rw-splitting.lua: ASCII Pascal program text
3)啓動mysql-proxy代理服務
主要命令選項:
-P:指定代理監聽的IP地址、端口
-r:指定讀服務器的IP地址、端口
-b:指定寫服務器的IP地址、端口
-s:指定lua腳本文件
–keepalive:如果服務進程崩潰,嘗試重啓此進程
以監聽本機的3306端口爲例,分別指定讀、寫服務器,相關操作如下:
[root@pxysvr ~]# cd /usr/local/mysql-proxy/
[root@pxysvr mysql-proxy]# bin/mysql-proxy -P 192.168.4.100:3306
-b 192.168.4.10:3306
-r 192.168.4.20:3306
-s rw-splitting.lua &
啓動後可確認監聽狀態:
[root@pxysvr mysql-proxy]# netstat -anpt | grep mysql
tcp 0 0 192.168.4.100:3306 0.0.0.0:* LISTEN 3177/mysql-proxy
這樣一來,對於客戶端來說,這臺代理主機192.168.4.100就相當於一臺可讀可寫的MySQL數據庫服務器了,儘管其自身並未運行MySQL服務程序。
4)啓動mysql-proxy代理服務
爲了在每次開機後能夠自動運行mysql-proxy,可以將相關操作寫到/etc/rc.local配置文件內:
[root@pxysvr ~]# vim /etc/rc.local
… …
/usr/local/mysql-proxy/bin/mysql-proxy -P 192.168.4.100:3306
-b 192.168.4.10:3306
-r 192.168.4.20:3306
-s rw-splitting.lua &
步驟二:測試通過mysql-proxy的讀寫分離
相關測試操作可參考以下過程。
1)在MySQL Master服務器上設置用戶授權
以root用戶爲例,允許其從192.168.4.0/24網段的客戶機遠程訪問。首先登入到Master服務器添加下列授權:
mysql> GRANT all ON . TO root@‘192.168.4.%’ IDENTIFIED BY ‘1234567’;
Query OK, 0 rows affected (0.00 sec)
因爲此前已配置mysql庫的主從同步,SLAVE上的root授權會自動更新:
2)從客戶機192.168.4.120訪問MySQL數據庫
注意連接的是mysql-proxy服務器,而並不是Master或Slave:
[root@pc120 ~]# mysql -u root -p -h 192.168.4.100
Enter password: //驗證口令
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 63
Server version: 5.6.15-log MySQL Community Server (GPL)

Copyright © 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> //可成功登入
測試數據庫寫入操作:
mysql> CREATE DATABASE proxydb; //新建庫
Query OK, 1 row affected (0.00 sec)

mysql> USE proxydb; //切換到新建的庫
Database changed
mysql> CREATE TABLE proxytb(
-> id int(4),host varchar(48)
-> ); //新建表
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO proxytb VALUES(1,‘dbsvr1’), //插入2條表記錄
-> (2,‘dbsbr2’);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
測試數據庫讀取操作:
mysql> SELECT * FROM proxytb;
±-----±-------+
| id | host |
±-----±-------+
| 1 | dbsvr1 |
| 2 | dbsbr2 |
±-----±-------+
2 rows in set (0.01 sec)
3)在Master和Slave上確認客戶端新建的庫、表
切換到新建的proxydb庫:
mysql> USE proxydb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
查看包括哪些表:
mysql> SHOW TABLES;
±------------------+
| Tables_in_proxydb |
±------------------+
| proxytb |
±------------------+
1 row in set (0.00 sec)
查詢表記錄:
mysql> SELECT * FROM proxytb;
±-----±-------+
| id | host |
±-----±-------+
| 1 | dbsvr1 |
| 2 | dbsbr2 |
±-----±-------+
2 rows in set (0.00 sec)
4)觀察MySQL代理訪問的網絡連接
當併發的客戶端連接較多時,可同時觀察Master或Slave上的連接情況。
比如,在Master上可看到來自Slave和Proxy代理的網絡連接:
[root@dbsvr1 ~]# netstat -anpt | grep mysql
tcp 0 0 :::3306 ::? LISTEN 9026/mysqld
tcp 0 0 ::ffff:192.168.4.10:3306 ::ffff:192.168.4.100:36998 ESTABLISHED 9026/mysqld
tcp 0 0 ::ffff:192.168.4.10:3306 ::ffff:192.168.4.20:43353 ESTABLISHED 9026/mysqld
… …
在Proxy代理商可看到與MySQL讀、寫服務器的網絡連接:
[root@pc120 ~]# netstat -anpt | grep mysql
tcp 0 0 192.168.4.100:3306 0.0.0.0:* LISTEN 2602/mysql-proxy
tcp 0 0 192.168.4.100:37121 192.168.4.10:3306 ESTABLISHED 2602/mysql-proxy
tcp 0 0 192.168.4.100:49001 192.168.4.20:3306 ESTABLISHED 2602/mysql-proxy
tcp 0 0 192.168.4.100:49003 192.168.4.20:3306 ESTABLISHED 2602/mysql-proxy
tcp 0 0 192.168.4.100:33536 192.168.4.100:3306 ESTABLISHED 5155/mysql
tcp 0 0 192.168.4.100:49006 192.168.4.20:3306 ESTABLISHED 2602/mysql-proxy
tcp 0 0 192.168.4.100:3306 192.168.4.100:33536 ESTABLISHED 2602/mysql-proxy
… …

發佈了225 篇原創文章 · 獲贊 196 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章