Amoeba 是之前阿里的一位同學開發的一個基於Mysql Client和Server之間的中介層,它具有讀寫分離、資料切分和過濾等一些分散式資料庫常見的一些功能。
amoeba的功能
和Amoeba類似的一個產品是Mysql提供的Mysql-proxy,但是這個產品不但不成熟並且問題還很多,我們從Mysql官網上下的Mysql-proxy基本上沒有什麼功能的,需要額外自己去寫Lua指令碼來完善這些東西,對於只是想用用這些功能的同學這樣學習成本也有點高,所以有了amoeba這個開源項目,他能自動的完成所有功能,而我們所需要做的就只是改下配置就行了。
amoeba的功能模組:
conf 目錄下是amoeba的設定檔,重要的是一些amoeba.xml 和dbServer.xml、Rule.xml等一些檔案,如果只是想實現一些讀寫分離的功能只需要配置下
amoeba.xml和dbServer.xml就可以了,如果要使用資料水平切分功能則配置下Rule.xml , amoeba的資料切分規則需要自己填寫,比較常見的是根據主鍵模數,比如說有2個Mysql可以對2模數,考慮到以後的擴充可以去4和8模數等等,配置Rule.xml的時候需要填死一個均衡欄位,模數就是根據這個欄位模數,一般Int型的取下摸就行了,String類型的算下HashCode。
amoeba效能
amoeba的效能還算不錯的,根據我的測試,加了一層中介層的話,Mysql QPS下降在10%之內,(非全記憶體、Select和Update測試)
amoeba的缺陷
amoeba基本上所有功能都需要配置,所有如果需要新加一個配置,或者加加一個新的切分規則都需要重啟,並且如果需要切分的表很多的話,整個設定檔會非常長。
amoeba不支援分散式交易,這個算amoeba的硬傷吧。
如果使用 amoeba 做讀寫分離,他會把一個事務中的讀和寫也都分離開,這樣的問題太大了。
amoeba對SQl語句的寫法很講究,比如表A按照ID分割,那麼Insert語句裡面必須填上ID否則不切割,什麼意思呢:
Insert Into A (ID) values (1) 切割
Insert Into A values (1) 不切割。
他這個是根據SQL語句去做匹配的,這個很不好,均衡欄位還是存起來比較好。