標籤:amoeba 讀寫分離 mysql
650) this.width=650;" src="http://note.youdao.com/yws/res/1967/C8CCB6CF224C4F19907222B52E4D0B6E" alt="Screenshot-2.png" />
Mysql進階叢集-讀寫分離Amoeba
Amoeba相當於一個SQL請求的路由器,目的是為負載平衡、讀寫分離、高可用性提供機制,而不是完全實現它們。使用者需要結合使用MySQL的 Replication等機制來實現副本同步等功能。amoeba對底層資料庫連接管理和路由實現也採用了可插撥的機制,第三方可以開發更進階的策略類來替代作者的實現。這個程式總體上比較符合KISS原則的思想。
2優勢
Amoeba主要解決以下問題:
a). 資料切分後複雜資料來源整合
b). 提供資料切分規則並降低資料切分規則給資料庫帶來的影響
c). 降低資料庫與用戶端串連
d). 讀寫分離路由
3不足
a)、目前還不支援事務b)、暫時不支援預存程序(近期會支援)
c)、不適合從amoeba導資料的情境或者對大資料量查詢的query並不合適(比如一次請求返回10w以上甚至更多資料的場合)
d)、暫時不支援分庫分表,amoeba目前只做到分資料庫執行個體,每個被切分的節點需要保持庫表結構一致:
讀寫 資料同步
Master-->Slave
一、環境介紹
Master-IP:10.0.0.201
Slave- IP:10.0.0.202
Amobea-IP:10.0.0.203
二、安裝JDK
1)# mkdir /Amoeba
# tar -xvf jdk-7u40-linux-x64.tar.gz -C /Amoeba/
# vim /etc/profile
JAVA_HOME=/Amoeba/jdk1.7.0_40
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export CLASSPATH
2)# source /etc/profile
# java -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)
三、安裝Amoeba
# unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba/
# chmod -R +x /usr/local/amoeba/bin/
四、在主機和從機上進行授權
>grant all privileges on *.* to ‘amobea‘@‘%‘ identified by ‘amoeba123‘;
>flush privileges;
五、配置Amoeba檔案
# cd /usr/local/amoeba/conf
解決設定檔亂碼:iconv -f gbk -t utf8 amoeba.xml -o amoeba.xml.bak
mv amoeba.xml.bak amoeba.xml
# vim amoeba.xml
更改的第一個地區修改port和ip 在第8,12,30,34行
#========================================================
<!-- proxy server綁定的連接埠 -->
更改port: <property name="port">9006</property>
<!-- proxy server綁定的IP -->
解開注釋改ip: <property name="ipAddress">10.0.0.203</property>
<!-- proxy server net IO Read thread size -->
<property name="readThreadPoolSize">20</property>
<!-- proxy server client process thread size -->
<property name="clientSideThreadPoolSize">30</property>
<!-- mysql server data packet process thread size -->
<property name="serverSideThreadPoolSize">30</property>
<!-- socket Send and receive BufferSize(unit:K) -->
<property name="netBufferSize">128</property>
<!-- Enable/disable TCP_NODELAY (disable/enable Nagle‘s algorithm). -->
<property name="tcpNoDelay">true</property>
<!-- 對外驗證的使用者名稱 -->
<property name="user">root</property>
<!-- 對外驗證的密碼 -->
<property name="password">123456</property>
更改的第二個地區《配置master端登入的資訊》
dbserverlist下master的port和ip和amoeba的使用者名稱和密碼 在第74,78,83行
#========================================================
<dbServer name="server1">
<!-- PoolableObjectFactory實作類別 -->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>
<!-- 真實mysql資料庫連接埠 -->
<property name="port">3306</property>
<!-- 真實mysql資料庫IP -->
<property name="ipAddress">10.0.0.201</property>
<property name="schema">test</property>
<!-- 用於登陸mysql的使用者名稱 -->
<property name="user">amoeba</property>
<!-- 用於登陸mysql的密碼 -->
<property name="password">amoeba123</property>
</factoryConfig>
<!-- ObjectPool實作類別 -->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
更改的第三個地區《配置slave端登入的資訊》
從64行起複製35行後修改第110行slave的ip
#========================================================
<dbServer name="server2">
<!-- PoolableObjectFactory實作類別 -->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>
<!-- 真實mysql資料庫連接埠 -->
<property name="port">3306</property>
<!-- 真實mysql資料庫IP -->
<property name="ipAddress">10.0.0.202</property>
<property name="schema">test</property>
<!-- 用於登陸mysql的使用者名稱 -->
<property name="user">amoeba</property>
<!-- 用於登陸mysql的密碼 -->
<property name="password">amoeba123</property>
</factoryConfig>
<!-- ObjectPool實作類別 -->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
更改的第四個地區《配置master和slave負載平衡池(pool)》
#=======================================================
<dbServer name="master" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- 負載平衡參數 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- 參與該pool負載平衡的poolName列表以逗號分割 -->
<property name="poolNames">server1</property>
</poolConfig>
</dbServer>
將上面的9行複製下來:
<dbServer name="slave" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- 負載平衡參數 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- 參與該pool負載平衡的poolName列表以逗號分割 -->
<property name="poolNames">server1,server2</property>
<!-- 此處可以進行一主多從的修改 -->
</poolConfig>
</dbServer>
更改的第五個地區《配置master和slave讀寫分離》
#=======================================================
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>
<property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>
<property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>
<property name="LRUMapSize">1500</property>
<!-- 配置master和slave讀寫分離 Begin-->
<property name="defaultPool">master</property>
解開注釋: <property name="writePool">master</property>
<property name="readPool">slave</property>
<!-- 配置master和slave讀寫分離 End-->
<property name="needParse">true</property>
</queryRouter>
六、修改Amoeba啟動指令碼
# vim /usr/local/amoeba/bin/amoeba
#DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k" 將此行注釋掉,增加一下行
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k" 增加這一行
七、啟動Amoeba指令碼
source /etc/profile
cd /usr/local/amoeba/bin
# nohup bash -x amoeba &
# cat nohup.out 日誌是否成功?
# ps -ef | grep amoeba 查看進程是否啟動成功
root 1896 1637 1 03:28 pts/3 00:00:06 /Amoeba/jdk1.7.0_40/bin/java -server -Xms256m -Xmx256m -Xss256k -Damoeba.home=/usr/local/amoeba -Dclassworlds.conf=/usr/local/amoeba/bin/amoeba.classworlds -classpath /usr/local/amoeba/lib/classworlds-1.0.jar org.codehaus.classworlds.Launcher
# mysql -uroot -p123456 -h 10.0.0.203 -P 9006
重新實驗時要kill -9 殺掉進程再nohup bash -x amoeba &