在代碼中對select操做分發到從庫;其它操做由主庫執行;這類方法也是目前生產環境應用最普遍,知名的如DISCUZ X2。優勢是性能較好,由於在程序代碼中實現,不須要增長額外的設備做爲硬件開支。缺點是須要開發人員來實現,運維人員無從下手。前端
代理通常是位於客戶端和服務器之間,代理服務器接到客戶端請求後經過判斷而後轉發到後端數據庫。在這有兩個表明性程序java
mysql-proxy:mysql-proxy爲mysql開源項目,經過其自帶的lua腳本進行sql判斷,雖然是mysql官方產品,可是mysql官方並不建議將mysql-proxy用到生產環境。
amoeba:由陳思儒開發,做者曾就任於阿里巴巴,現就任於盛大。該程序由java語言進行開發,目前只據說阿里巴巴將其用於生產環境。另外,此項目嚴重缺乏維護和推廣(做者有個官方博客,不少用戶反饋的問題發現做者不理睬)
通過上述簡單的比較,經過程序代碼實現mysql讀寫分離天然是一個不錯的選擇。可是並非全部的應用都適合在程序代碼中實現讀寫分離,像大型SNS、 B2C這類應用能夠在代碼中實現,由於這樣對程序代碼自己改動較小;像一些大型複雜的java應用,這種類型的應用在代碼中實現對代碼改動就較大了。所 以,像這種應用通常就會考慮使用代理層來實現。mysql
實戰: mysql 讀寫分離 ,mysql_proxy實現linux
cd /usr/srcsql
wget http://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz數據庫
tar zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz後端
解壓後,該目錄包含已經編譯好的二進制文件。服務器
mv mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz /usr/local/mysql-proxy負載均衡
一、利用mysql_proxy實現負載均衡運維
執行mysql_proxy
cd /usr/local/mysql-proxy
./bin/mysql-proxy -P 192.168.1.67:4040 --proxy-backend-addresses=192.168.1.67:3306 --proxy-backend-addresses=192.168.1.83:3306 --daemon
二、鏈接mysql_proxy,用mysql客戶就能夠,由於proxy是mysql的前端代理
注意proxy的端口是4040
mysql -h 「proxy的IP」 -P 4040 -u username -p password
cd /usr/local/mysql-proxy
./bin/mysql-proxy --proxy-backend-addresses=192.168.1.67:3306 --proxy-read-only-backend-addresses=192.168.1.83:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --daemon
簡寫:
./bin/mysql-proxy -b 192.168.1.67:3306 -r 192.168.1.83:3306 -s /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --daemon
測試
由於67和83互爲主從,想測試讀寫分離,先把67服務器上的stop slave;
再在83服務器db_name(數據庫),test(表)insert into test (name) values('a');
再執行select * from test;,在67上沒有,83上有;
先把rw-splitting.lua裏面的
min_idle_connections = 1;#默認4
max_idle_connections = 2;#默認8
效果預覽,最右側鏈接到的就是67服務器
再在最右側的83讀服務器寫入insert into test (name) values('e');
再在67和83服務器上select * from test;
同時存在id爲17的數據,說明是從67寫服務器寫入的數據,在同步到83讀服務器上(由於id爲16的數據是從讀服務器寫入的,沒同步到67的寫服務器上)