MySQL讀寫分離原理
MySQL的主從復制和MySQL的讀寫分離兩者有着緊密聯系,首先部署主從復制,只有主從復制完了,才能在此基礎上進行數據的讀寫分離。
簡單來說,讀寫分離就是只在主服務器上寫,只在從服務器上讀,基本的原理是讓主數據庫處理事務性查詢,而從數據庫處理select查詢,數據庫復制被用來把事務性查詢導致的改變更新同步到集群中的從數據庫。
1.基於程序代碼內部實現
在代碼中根據select,insert進行路由分類,這類方法也是目前生產環境應用最廣泛的,優點是性能好,因為在程序代碼中實現,不需要曾加額外的設備作為硬件開支,缺點是需要開發人員來實現,運維人員無從下手。
2.基於中間代理層實現
代理一般位於客戶端和服務器之間,代理服務器接到客戶端請求后通過判斷后轉發到后端數據庫,有兩個代表性程序。
(1)mysql-proxy 為mysql開源項目,通過其自帶的lua腳本進行SQL判斷,雖然是mysql的官方產品,但是mysql官方不建議將其應用到生產環境
(2)Amoeba (變形蟲)由陳思儒開發,曾就職與阿里巴巴,該程序由java語言進行開發,阿里巴巴將其應用於生成環境,它不支持事物和存儲過程
通過程序代碼實現mysql讀寫分離自然是一個不錯的選擇,但是並不是所有的應用都適合在程序代碼中實現讀寫分離,像一些大型復雜的java應用,如果在程序代碼中實現讀寫分離對代碼改動就較大,像這種應用一般會考慮使用代理層來實現。
master 192.168.16.238
slave1: 192.168.16.239
slave2: 192.168.16.240
amoeda: 192.168.16.241
client :192.168.16.75
上次已經部署好238、239之間的主從復制,現在我們部署240mysql,並添加master節點,
參照:http://www.cnblogs.com/liangsky/p/4562317.html
測試:
查看239:
查看240:
下載amoeda
wget http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/3.x/amoeba-mysql-3.0.5-RC-distribution.zip
unzip amoeba-mysql-3.0.5-RC-distribution.zip
mv amoeba-mysql-3.0.5-RC amoeba
vi dbServer.xml
其實當權限test 賦於全局權限的時候,schema參數指定某個庫是沒有用處的。
配置Amoeba讀寫分離,兩個Slave讀負載均衡,為了安全,單獨創建test用戶給master slave1 slave2
Master,Slave1,Slave2中配置放權給Amoeba訪問
grant all on *.* to 'test'@'192.168.16.%' identified by '123456';
flush privileges;
./launcher &
(ps aux|grep java 或者netstat -antp |grep 8066)
在16.75安裝mysql客戶端
yum -y install mysql
create database db_test4;
create table aa(id char(20),phone char(20));
可以在master ,slave1 slave2上都能看到db_test4以及aa已經建立,(流程還是從master--->>slaves)
停止主從復制:stop slave;
在主服務器上: insert into aa values('1','13333333333');
在從服務器上slave1: insert into aa values('2','14444444444');
在從服務器上slave2: insert into aa values('3','15555555555');
測試讀操作:
在客戶端進行4次操作:
兩次讀操作分別從兩台服務器上讀取。
測試寫操作:
在客戶端插入一條數據: insert into aa values('4','16666666666');
發現在客戶端上查詢不到剛剛插入的數據。
到master庫上查詢:
由此可見我們讀是放在slaves(slave1 slave2)上,master是寫入的。
在生產環境中,別忘記重新開啟start slave,否則插入的數據,是查不到的,流程還可以看下圖:
性能優化:
1:在amoeba目錄下有個JVM的配置文件,設置其中的JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k -XX:PermSize=16m -XX:MaxPermSize=96m"可提升JVM性能,具體大小看各位需求;
2:多線程配置:runtime元素;
3:網絡相關(緩沖區等):connectionFactory