標籤:節點 arch password star master 定義 mes bash database
在企業中,大量資料請求下,單台資料庫將無法承擔所有讀寫操作。解決方案:配置多台資料服務器以實現主從複製+讀寫分離
用的Proxy 伺服器是 Amoeba
特點是:1負載平衡,2高可用,3SQL過濾,4讀寫分離,5高並發請求多台資料庫。
實驗環境
amoeba: 192.168.100.123
mysql-master: 192.168.100.111
mysql-slave1: 192.168.100.222
mysql-slave2: 192.168.100.250
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-slave1、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; //會多出一個
此時寫入資料到資料庫時,會寫到主伺服器,不會寫到從伺服器上,實現了讀寫分離。
MYSQL讀寫分離