Mysql讀寫分離詳解

Mysql讀寫分離原理

原理就是讓Master 數據庫處理事務性增、刪除、修改、更新操作(create、insert、delete、update),Slave數據庫處理Select操作。

讀寫分離的前提是基於MYSQL主從複製,這樣可以保證在Master上修改數據,Slave同步之後,WEB應用可以讀取到Slave側的數據。

Mysql讀寫分離有以下幾種方式:

1.Mysql-proxy讀寫分離

2.Amoeba讀寫分離

3.Mycat讀寫分離

4.通過開發代碼實現

本文主要介紹mysql-proxy方式實現讀寫分離

Mysql-proxy介紹:

Mysql-proxy是Mysql官方提供的中間件服務,支持無數客戶端連接,同時後端可以連接若干臺Mysql-Server服務器,Mysql-proxy自身基於Mysql協議,連接Mysql-proxy客戶端無需修改任何設置,跟正常連接Mysql Server沒有區別。

Mysql-proxy是應用App(客戶端)與Mysql Server之間的一個連接代理,Mysql-proxy負責將App應用的SQL請求根據轉發規則,轉發至相應的後端數據庫,基於lua腳本,可以實現複雜的連接控制和過濾,從而實現數據讀寫分離和負責均衡的需求。

下圖爲Mysql-proxy讀寫分離的架構圖:


Mysql-proxy讀寫分離安裝配置

1.環境準備

準備兩臺MYSQL服務器配置爲主從複製,具體安裝配置請見:http://blog.csdn.net/scott_bing/article/details/78353427

Mysql-proxy服務器:192.168.241.136

2.安裝配置

a.下載mysql-proxy,解壓並重命名至/usr/local/mysql-proxy

wget -c -P /src http://mirrors.sohu.com/mysql/MySQL-Proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz

tar zxvf /src/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz-C /usr/local/

mv /usr/local/mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy

b.創建系統用戶mysql-proxy

useradd –r mysql-proxy

c.配置環境變量

/etc/profile中添加一下代碼:

export  PATH=$PATH:/usr/local/mysql-proxy/bin/

然後執行source /etc/profile使環境變量生效

d.啓動mysql-proxy中間件,命令如下:

mysql-proxy --daemon --log-level=debug --user=mysql-proxy --keepalive--log-file=/var/log/mysql-proxy.log --plugins="proxy"--proxy-backend-addresses="192.168.241.133:3306"--proxy-read-only-backend-addresses="192.168.241.135:3306"--proxy-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"--plugins=admin --admin-username="admin"--admin-password="admin"--admin-lua-script="/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua"

--proxy-backend-addresses="192.168.241.133:3306"mysql

--proxy-read-only-backend-addresses="192.168.241.135:3306"mysql

3.安裝後測試mysql-proxy讀寫狀態是否正常

a.Mysql-proxy啓動後,在服務器端查看端口


4040爲proxy代理端口,用於WEB應用連接
4041爲管理端口,用於SA或DBA管理員連接
b.基於4041端口Mysql-proxy查看讀寫分離狀態,登錄4041管理端口(在master/slave登錄操作)
mysql -h192.168.241.136 -uadmin -padmin -P 4041
登錄後執行select命令,如圖state均爲up狀態,type類型爲rw、ro,則證明讀寫分離狀態成功
select * from backends;

c.如果狀態未unknown未知狀態,可以在unknown數據庫上登錄mysql-proxy的4040端口,執行:show databases;命令,直到state變成up狀態爲止。
若unknown數據庫上登錄不了mysql-proxy的4040端口,需給mysql-proxy授權:
grant all on *.* to discuz@'192.168.241.136' identified by 'discuz';
mysql -h192.168.241.136 -udiscuz -pdiscuz -P 4040 -e 'show databases';
這邊選擇業務數據庫discuz來測試
4.進行讀寫業務數據測試

寫數據
以3306端口登錄至Master庫,進行數據寫入操作,執行以下代碼:
use discuz;
create table db_test(id varchar(20),name varchar(20),age int(10));
insert into db_test values(01,'Mike',18);
insert into db_test values(02,'James',20);
---------------------------------------------------------------------------------------------------------------------------------------
讀數據
以4040端口登錄mysql-proxy,進行數據讀操作,執行以下代碼:
mysql -h192.168.241.136 -udiscuz -pdiscuz -P 4040 -e 'select * from discuz.db_test'

5.discuz配置mysql-proxy

登錄apache服務器,修改discuz網站發佈目錄/usr/local/apache/htdocs,全局配置文件config_global.php,查找dbhost段,將192.168.241.133修改爲192.168.241.136:4040,如下圖:
刷新頁面即可。






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