Amoeba(變形蟲)項目,該開源框架於2008年 開始發佈一款 Amoeba for Mysql軟件。html
這個軟件基於Java致力於MySQL的分佈式數據庫前端代理層,處於在應用和數據庫之間,對客戶端透明,它主要在應用層訪問MySQL的時候充當SQL路由功能,解析應用傳遞過來的SQL語句,專一於分佈式數據庫代理層(Database Proxy)開發。具備負載均衡、高可用性、SQL 過濾、讀寫分離、可路由相關的到目標數據庫、可併發請求多臺數據庫合併結果。 經過Amoeba可以完成多數據源的高可用、負載均衡、數據切片的功能,目前Amoeba已在不少企業的生產線上面使用。前端
優勢:Amoeba已經具備Query路由,Query過濾,讀寫分離,負載均衡以及HA機制等相關內容。java
缺點:Amoeba暫不支持事務;amoeba不支持跨庫join和排序;amoeba不支持分庫分表等;node
Amoeba 主要解決的如下幾個問題:mysql
數據切分後複雜數據源整合;sql
提供數據切分規則並下降數據切分規則給數據庫帶來的影響;數據庫
下降數據庫與客戶端的鏈接數;後端
讀寫分離路由;服務器
安裝環境以下併發
master 192.168.1.5 rac1-node.tp-link.net
slave 192.168.1.6 rac2-node.tp-link.net
amobe 192.168.1.2 poprodbak.tp-link.net
安裝amoeba前要安裝jdk,由於amoeba是由java開發的。同時設置JAVA_HOME
下載ameba軟件
使用amoeba穩定版
# mkdir amoeba # cd amoeba # tar -zxvf amoeba-mysql-binary-2.2.0.tar.gz
配置amobe
解壓完之後,下面進行配置。在conf目錄下能夠看到不少.xml後綴的文件。其中
amoeba.xml是對amoeba代理的配置,定義讀寫分離的節點管理信息;
dbServers.xml是對後端service的配置,定義數據庫的信息;
rule.xml能夠定義高級設置好比數據的水平、垂直切分等;
log4j.xml定義日誌等。
配置dbServers.xml
<!-- Each dbServer needs to be configured into a Pool, 每一個dbServer須要配置一個pool,若是多臺平等的mysql須要進行loadBalance,平臺已經提供一個具備負載均衡能力的objectPool: 簡單的配置是屬性加上virtual="true",該Pool不容許配置factoryConfig或者本身寫一個ObjectPool such as 'multiPool' dbServer --> <dbServer name="abstractServer" abstractive="true"> <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> <property name="manager">${defaultManager}</property> <property name="sendBufferSize">64</property> <property name="receiveBufferSize">128</property> <!-- mysql port --> <property name="port">3306</property> \\這個是後端數據的端口 <!-- mysql schema --> <property name="schema">test</property> \\這個是後端默認的數據庫 <!-- mysql user --> <property name="user">root</property> <!-- mysql password <property name="password">password</property> --> </factoryConfig> </dbServer> \\下面的配置是定義一個主節點和一個從節點。 <dbServer name="master" parent="abstractServer"> \\定義一個主節點 <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.1.5</property> <property name="user">root</property> \\鏈接數據庫的用戶名 <property name="password">root</property> \\鏈接數據庫的密碼,此處若是寫庫跟讀庫密碼一致,能夠寫在上面公共段,這裏會繼承上面的設置 </factoryConfig> </dbServer> <dbServer name="slave" parent="abstractServer"> \\定義一個從節點 <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.1.6</property> <property name="user">root</property> <property name="password">root</property> </factoryConfig> </dbServer> \\定義池,把master和slave加入 <dbServer name="server1" virtual="true"> \\server1是要把master節點加入 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--> < ! -- 負載均衡參數1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--> <property name="loadbalance">1</property> <!-- Separated by commas,such as: server1,server2,server1 --> <property name="poolNames">master</property> <!-- 參與該pool負載均衡的poolName列表以逗號分割 這裏只一個主節點因此就一個 --> </poolConfig> </dbServer> <dbServer name="readPool" virtual="true"> <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--> <property name="loadbalance">1</property> <!-- Separated by commas,such as: server1,server2,server1 --> <property name="poolNames">slave,slave,slave,master</property> </poolConfig> </dbServer> </amoeba:dbServers>
配置amobe.xml
<!-- port --> <property name="port">8066</property> \\定義amoeba讀寫分離proxy對外代理的端口 <!-- bind ipAddress --> <!-- <property name="ipAddress">127.0.0.1</property> \\這個是綁定端口的ip,註釋掉了,說明8066端口綁定在0.0.0.0/0.0.0.0 上面 --> <property name="manager">${clientConnectioneManager}</property> <property name="authenticator"> <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator"> <property name="user">root</property> \\定義經過amoeba登陸的用戶名 <property name="password">root</property> \\相應的這個就是密碼了。定義proxy的管理賬號密碼,客戶端和程序只須要鏈接proxy的賬號密碼便可,至關於中間件封裝 <property name="LRUMapSize">1500</property> <property name="defaultPool">master </property> \\定義默認的池,一些除了SELECT\UPDATE\INSERT\DELETE的語句都會在defaultPool執行 <property name="writePool">master</property> \\定義寫的池,這裏的master就是在dbServer.xml中的master <property name="readPool"> readPool </property> \\定義讀的池,這裏的readPool就是在dbserver.xml中的readPool <property name="needParse">true</property>
啓動amobe
# ./amoeba start & [1] 2381 # netstat -tlnp | grep 8066 tcp 0 0 :::8066 :::* LISTEN 2381/java
以上說明amoeb已經正常啓動了。
# mysql -h 192.168.1.2 -ulibai --port 8066 –p
鏈接報錯
java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed
修改dbServers.xml配置,factoryConfig中 password默認是被註釋掉的,取消註釋
仍是報錯,後來發現原來是schema設置不對,這個是要設置爲數據庫名。修改後經過amoeba鏈接數據庫正常。
至此,amoeba正常啓動,客戶端能夠經過amoeba正常鏈接MySQL數據庫。
驗證測試
使用tcpdump抓包工具分析,讀寫是否分離到master和slave上。
在master和slave上分別執行
# tcpdump -i eth2 -s 0 -A -n -p port 3306 and src 192.168.1.2 | grep -i 'SELECT\|INSERT'
其中192.168.1.2是amoeba服務器
在amoeba服務器上執行select操做
slave上能夠抓取到以下信息,查詢三次之後,能夠從master抓取到查詢信息(由於此時master和slave節點數據恰好不一致,能夠很是清晰地確實是在master上執行的)。所以能夠大概驗證amoeba設置的讀操做slave和master 3比1的比例。
...p(Y.......select * from t 13:59:36.355619 IP 192.168.1.2.24489 > 192.168.1.6.mysql: Flags [.], ack 869, win 96, options [nop,nop,TS val 85451120 ecr 676978448], length 0
在amoeba服務器上執行insert操做
master抓包以下信息,slave上沒有任何變化。所以能夠驗證寫操做徹底在master節點上完成。
14:06:47.578469 IP 192.168.1.2.58575 > 192.168.1.5.mysql: Flags [P.], seq 68:90, ack 94, win 46, options [nop,nop,TS val 85882307 ecr 677373872], length 22 E..JF.@.@.p|............>K....AM........... ..u.(_.......set names latin1. 14:06:47.578830 IP 192.168.1.2.58575 > 192.168.1.5.mysql: Flags [.], ack 105, win 46, options [nop,nop,TS val 85882308 ecr 677413229], length 0 E..4F.@.@.p.............>K.+..AX.....d..... ..u.(`.m 14:06:47.579712 IP 192.168.1.2.58575 > 192.168.1.5.mysql: Flags [P.], seq 90:135, ack 105, win 46, options [nop,nop,TS val 85882309 ecr 677413229], length 45 E..aF.@.@.pc............>K.+..AX........... ..u.(`.m)....insert into t values(5,'this_is_amoeba') 14:06:47.622539 IP 192.168.1.2.58575 > 192.168.1.5.mysql: Flags [.], ack 116, win 46, options [nop,nop,TS val 85882352 ecr 677413233], length 0 E..4F.@.@.p.............>K.X..Ac........... ..u.(`.q
性能對比
針對MySQL Proxy和Amoeba進行了簡單的性能對比測試
分別查詢14W條數據,proxy和amoeba表現幾無差異。
第一次(s) 第二次 3 4 5 平均(s)
Mysql-proxy 0.27 0.27 0.28 0.29 0.26 0.274
Amoeba 0.23 0.26 0.33 0.25 0.34 0.282
分別插入14W條數據,proxy平均爲1.8S,amoeba平均爲1.95S。
能夠看出mysqlproxy和amobe幾無差異,多是由於數據量比較小。