在企業中,大量數據請求下,單臺數據庫將沒法承擔全部讀寫操做。解決方法:配置多臺數據服務器以實現主從複製+讀寫分離java
用的代理服務器是 Amoebamysql
特色是:1負載均衡,2高可用,3SQL過濾,4讀寫分離,5高併發請求多臺數據庫。linux
試驗環境算法
amoeba: 192.168.100.123sql
mysql-master: 192.168.100.111數據庫
mysql-slave1: 192.168.100.222vim
mysql-slave2: 192.168.100.250bash
client: 192.168.100.22服務器
首先實現主從複製 主 從 從,這裏就很少說了,略併發
先配置amoeba:192.168.100.123
1:安裝Amoeba上安裝java環境(推薦安裝jdk1.5/1.6,不建議安裝1.7)
我用的是jdk-6u14-linux-x64.bin
chmod +x jdk-6u14-linux-x64.bin
bash jdk-6u14-linux-x64.bin 一路空格,輸入yes,回城完成
mv jdk1.6.0_14/ /usr/local/jdk1.6
vim /etc/profile 在最後添加
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export AMOEBA_HOME=/usr/local/amoeba/
export PATH=$PATH:$AMOEBA_HOME/bin 添加到變量裏 注意不要寫錯
. /etc/profile 執行
java -version 查看 注意若是有自帶的openjava 刪掉或者轉移
2:安裝配置Amoeba
mkdir /usr/local/amoeba
tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba amoeba start |stop //出現此行說明配置無誤
3:配置amoeba實現mysql-slave一、slave2讀負載均衡
在三臺MYSQL服務器上對amoeba受權
mysql>grant all on *.* to 'amoeba'@'192.168.100.%' identified by '123123'; //測試環境給的權限最大 生產環境根據須要
mysql>flush privileges; //刷新一下
編輯amoeba.xml配置文件,設置讀寫分離(amoeba服務器)
cd /usr/local/amoeba/conf/
vim amoeba.xml //修改任何文件時,養成習慣備份。 cp amoeba.xml amoeba.xml.$(date +%F)
11<property name="port">8066</property> //默認端口8066,無需更改
30 <property name="user">amoeba</property> //設置一個用戶,後面客戶端訪問時使用,切勿打錯,要否則後期測試會進去不mysql
32 <property name="password">123123</property> //設置登陸密碼
115 <property name="defaultPool">master</property> //默認的服務器池
117 <property name="writePool">master</property> //寫服務器池
118 <property name="readPool">slaves</property> //讀服務器池
有註釋<-- -->刪掉
編輯dbServer.xml配置文件,設置登陸MYSQL服務器的用戶及密碼、MYSQL服務器節點的IP地址、負載均衡算法/usr/local/amoeba/conf/
vim dbServers.xml
20 <property name="port">3306</property> //設置MYSQL鏈接端口,默認3306
26 <property name="user">amoeba</property> //設置訪問MYSQL服務器所用的用戶名
27 <property name="password">123123</property> //設置訪問MYSQL服務器的密碼
43 <dbServer name="master" parent="abstractServer"> //設置MYSQL服務器的IP地址
46 <property name="ipAddress">192.168.100.111</property> 主的
50 <dbServer name="slave1" parent="abstractServer"> 從的IP
53 <property name="ipAddress">192.168.100.222</property>
56 <dbServer name="slave2" parent="abstractServer"> 從2的IP
59 <property name="ipAddress">192.168.100.250</property>
63 <dbServer name="slaves" virtual="true"> //在amoeba.xml文件中設置的readPool
69 <property name="poolNames">slave1,slave2</property> //前面定義的服務器節點
4:啓動amoeba
/usr/local/amoeba/bin/amoeba start &
jobs 能夠查看後臺
5:測試
在主MYSQL服務器上建立db_test及庫下的test表
mysq>create database db_test;
mysq> use db_test;
mysq>create table test(id int(10),name varchar(20));
能夠在slave1和slave2上查看
mysq>show databases;
在slave1和slave2服務上中止主從備份
mysq>stop slave;
在master上添加表內容
mysql>insert into test values(1,'master');
此前在服務器上同步了表,因此在從服務器上能夠直接手動插入其餘內容
在slave1上
mysql>use db_test;
mysql>insert into test values(2,'slave1');
在slave2上
mysql>use db_test;
mysql>insert into test values(3,'slave2');
在客戶機上進行讀測試
client上
yum -y install mysql mysql-devel
進入mysql
mysql -uamoeba -p123123 -h 192.168.100.123 -P8066 //注意 這是進入amoeba服務器的mysql。
讀測試
mysql>select * from db_test.test; //來兩遍 會發現輪詢
此時讀取數據時,輪詢的方式從slave1,slave2上讀取
(2)寫入測試
mysql>insert into db_test.test values(4,'client');
mysq>select * from db_test.test; //會多出一個
此時寫入數據到數據庫時,會寫到主服務器,不會寫到從服務器上,實現了讀寫分離。