9. mysql (linux) 讀寫分離,mysqllinux
Mysql主從互備之後,為了將兩台(或多台)機器充分利用,讀寫分離的必要性凸顯出來。優缺點這裡不是討論的重點!
Mysql讀寫分離有三種方法:
1. Mysql-proxy
2. Amoeba(變形蟲)
3. 另一種用的很少
這裡所用的是amoeba,第一種用到lua語言,而且聽說效能上有些許不好!
所需機器:
寫:192.168.1.111
讀:192.168.1.112 (此兩台機器已經設定了主從,否則讀寫分離就失去了意義)
Amoeba:192.168.1.112(本人這裡,amoeba安裝的機器和mysql(讀)在一台機器)
一、 準備工作
1. 安裝java支援
1) 下載java SE 1.6
地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html
官網,沒有找到1.6 所以勉強下了1.7版本。
2) 安裝
# mkdir /usr/local/jdk
# tar zxvf jdk-7u71-linux-x64.gz –C /usr/local/jdk
2. 安裝amoeba
1) 下載
地址:http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz/download
2) 安裝
# mkdir /usr/local/amoeba
# tar zxvf amoeba-mysql-binary-2.1.0-RC5.tar.gz–C /usr/local/amoeba
# chmod –R +x /usr/local/amoeba/bin
二、 配置環境
1. Java
#vi /etc/profile
#for java
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
2. Amoeba
#vi /etc/profile
#for amoeba
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
完成後:
#source /etc/profile
3. 測試是否成功
Java:
#java –version //顯示如下
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
Amoeba:
#amoeba //顯示如下
amoeba start|stop
三、 配置amoeba
需要配置兩個檔案:dbServer.xml 和 amoeba.xml
1. 配置dbServer.xml,直接貼出我的配置
# vi dbServer.xml
修改26行
原 <property name="user">root</property>
改 <property name="user">amoeba</property>//串連兩個伺服器(讀寫)都要用,即這個賬戶可以串連讀伺服器,也可以串連寫伺服器,如果沒有需要都添加這個使用者,並且給這個ip授權(需要理解)
修改28,29,,30行
28 <property name="password">amoeba</property>//mysql伺服器的通用用 戶密碼
複製一下代碼,並在此代碼下面粘貼兩次
42 <dbServer name="server1" parent="abstractServer">
43 <factoryConfig>
44 <!-- mysql ip -->
45 <property name="ipAddress">127.0.0.1</property>
46 </factoryConfig>
47 </dbServer>
修改後的效果如下:添加兩個db伺服器定義,並且分別設定三個mysql server的ip地址,ip地址使用的是mysql-mmm的虛擬IP。
42 <dbServer name="Master" parent="abstractServer">
43 <factoryConfig>
44 <!-- mysql ip -->
45 <property name="ipAddress">192.168.1.111</property>
46 </factoryConfig>
47 </dbServer>
48
49 <dbServer name="Slave1" parent="abstractServer">
50 <factoryConfig>
51 <!-- mysql ip -->
52 <property name="ipAddress">192.168.1.112</property>
53 </factoryConfig>
54 </dbServer>
修改設定檔的最下方
64 <dbServer name="ReadPool" virtual="true"> //定義虛擬節點池的名字
65 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
66 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
67 <property name="loadbalance">1</property> //負載平衡演算法
68
69 <!-- Separated by commas,such as: server1,server2,server1 -->
70 <property name="poolNames">Slave1 </property> //虛擬節點池的成員
71 </poolConfig>
72 </dbServer>
2. 配置amoeba.xml
11 <propertyname="port">8066</property> //amoeba監聽連接埠,不用修改
修改第30行
原 <property name="user">root</property>
改 <property name="user">amoeba</property>//修改amoeba的使用者名稱為amoeba
修改第32行
原 <property name="password"></property>
改 <property name="password">amoeba</property>//修改amoeba的使用者名稱為amoeba
115行 –120行
115 <property name="defaultPool">Master</property>
116
117 <property name="writePool">Master</property>
118 <property name="readPool">Slave1</property>
119 <propertyname="needParse">true</property>
120 </queryRouter>
四、 測試
1. 啟動amoeba
# amoeba start &
log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml
2015-01-08 11:20:15,858 INFO context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-2.1.0-RC5
log4j:WARN ip access config load completed from file:/usr/local/amoeba/conf/access_list.conf
2015-01-08 11:20:16,061 INFO net.ServerableConnectionManager - Amoeba for Mysql listening on 0.0.0.0/0.0.0.0:8066.
2015-01-08 11:20:16,066 INFO net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:37064.
跳出這些以後,自己ctrl+c即可,已經後台啟動!
2. 測試
在 192.168.1.112
a. mysql –u amoeba –P8806 –h 192.168.1.112 –pamoeba //測試amoeba是否正常啟動
b. mysql –u amoeba –h192.168.1.111 –pamoeba //測試能否登入寫資料庫
c. mysql –u amoeba –h192.168.1.112 –pamoeba//測試能否登入讀伺服器
如果三個都能登入成功,在繼續以下測試,不能成功,需要檢驗:a.是否有此使用者 b.是否授權此IP登入等
3. 測試amoeba的讀寫
在 192.168.1.112(讀)上,mysql>stop slave;//關閉主從複製
# mysql –u amoeba –P8806 –h 192.168.1.112–pamoeba //登入amoeba
Mysql> use test;
Mysql> insert into test1 (a)values (123);
Mysql> select *from test1;
發現剛才插入的並沒有查詢出來,說明讀寫已經分離
五、 問題
1. Q: amoeba start 跳出
The stack size specified too small, Specify at least 228k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
修改: vi /usr/local/amoeba/bin/amoeba
DEFAULT_OPTS=”-server -Xms256m -Xmx256m –Xss128k”改為
DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss256k”
2. Q : 登入了amoeba後做一些資料操作是彈出以下:
Could not create a validatedobject, cause: ValidateObject failed
A: 在192.168.1.112上測試
mysql –u amoeba –h192.168.1.111 –pamoeba
mysql –u amoeba –h192.168.1.112 –pamoeba
有一個或都不能登入,建立使用者,並給此ip授權
3. Q: 串連MySQL失敗出錯資訊:Host XXX is blocked because of many connectionerrors, unblock with 'mysqladmin flush-hosts'。
原因:MySQL伺服器已經從某個host接收了大量中途終止的串連,於是決定終止繼續接收來自該host的串連,允許最大的串連錯誤數為max_connect_errors,通過showvariables命令可以查詢,一般為10。
A:登入進mysql執行flush hosts(本機host已經不允許登入!)。
4. Q: 啟動amoeba時跳出了一長串
A: 檢查設定檔
註:歡迎提出自己的建議、疑問、意見等。