amoeba mysql_Amoeba介绍及Amoeba和mysql proxy有区别
1. Amoeba 是什么
Amoeba(變形蟲)項目,專注 數據庫 proxy 開發。座落與Client、DB Server(s)之間。對客戶端透明。具有負載均衡、高可用性、sql過濾、讀寫分離、可路由相關的query到目標數據庫、可并發請求多臺數據庫合并結果。
假如有一條sql: select * from test.account as t where t.id = 1990000002; 假設account表的那些id從1-1990000002 都有數據,那么你的account表將會多么龐大. 你已經不可能將所有的數據存放到一臺數據庫上面,這樣的數據庫執行sql性能將受到嚴重的影響。假設你將這些數據切分成100臺數據庫,每臺存放20,000,000數據。
只要能夠制定一個恰當的數據切分規則,那么amoeba 將輕易解決數據切分并且可以將query語句路由到目標數據庫上面執行。
主要解決:降低 數據切分帶來的復雜多數據庫結構
降低 數據切分規則 給應用帶來的影響
降低db 與客戶端的連接數
讀寫分離
相關文章有:
2.?Amoeba?跟 mysql proxy有區別。
主要是針對數據切分方面。
在 mysql proxy 上面如果想要讀寫分離并且 讀集群、寫集群 機器比較多情況下,用mysql proxy 需要相當大的工作量,目前mysql proxy沒有現成的 lua腳本。mysql proxy根本沒有配置文件,lua腳本就是它的全部,當然可以是相當方便的。那么同樣這種東西需要編寫大量的lua腳本才能完成一個復雜的配置。amoeba目標是走產品化這條路。只需要進行相關的配置就可以滿足需求。
一、Mysql Master/Slave 結構之下的讀寫分離:
Master: server1 (可讀寫)
slaves:server2、server3、server4(3個平等的數據庫。只讀/負載均衡)
amoeba提供讀寫分離pool相關配置。并且提供負載均衡配置。
可配置server2、server3、server4形成一個虛擬的 virtualSlave,該配置提供負載均衡、failOver、故障恢復功能
Xml代碼?< type="application/x-shockwave-flash" width="14" height="15" src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%0A%3CdbServer%20name%3D%22virtualSlave%22%20virtual%3D%22true%22%3E%0A%09%3CpoolConfig%3E%0A%09%09%3CclassName%3Ecom.meidusa.amoeba.server.MultipleServerPool%3C%2FclassName%3E%0A%09%09%3C!--%20%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%8F%82%E6%95%B0%201%3DROUNDROBIN%20%2C%202%3DWEIGHTBASED%20--%3E%0A%09%09%3Cproperty%20name%3D%22loadbalance%22%3E1%3C%2Fproperty%3E%0A%09%09%09%09%0A%09%09%3C!--%20%E5%8F%82%E4%B8%8E%E8%AF%A5pool%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E7%9A%84poolName%E5%88%97%E8%A1%A8%E4%BB%A5%E9%80%97%E5%8F%B7%E5%88%86%E5%89%B2%20--%3E%0A%09%09%3Cproperty%20name%3D%22poolNames%22%3Eserver2%2Cserver3%2Cserver4%3C%2Fproperty%3E%0A%09%3C%2FpoolConfig%3E%0A%3C%2FdbServer%3E%0A%0A">
com.meidusa.amoeba.server.MultipleServerPool
1
server2,server3,server4
如果不啟用數據切分,那么只需要配置QueryRouter屬性
wirtePool=server1
readPool=virtualSlave
Xml代碼?< type="application/x-shockwave-flash" width="14" height="15" src="http://www.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer" allowscriptaccess="always" quality="high" flashvars="clipboard=%09%3CqueryRouter%3E%0A%09%09%3CclassName%3Ecom.meidusa.amoeba.mysql.parser.MysqlQueryRouter%3C%2FclassName%3E%0A%09%09%3Cproperty%20name%3D%22LRUMapSize%22%3E1500%3C%2Fproperty%3E%0A%09%09%3Cproperty%20name%3D%22defaultPool%22%3Eserver1%3C%2Fproperty%3E%0A%0A%09%09%3Cproperty%20name%3D%22writePool%22%3Eserver1%3C%2Fproperty%3E%0A%09%09%3Cproperty%20name%3D%22readPool%22%3EvirtualSlave%3C%2Fproperty%3E%0A%0A%09%09%3Cproperty%20name%3D%22needParse%22%3Etrue%3C%2Fproperty%3E%0A%09%3C%2FqueryRouter%3E%0A">
com.meidusa.amoeba.mysql.parser.MysqlQueryRouter
1500
server1
server1
virtualSlave
true
那么遇到update/insert/delete將 query語句發送到 wirtePool,將 select發送到 readPool機器中執行。
二、數據切分:
這方面amoeba顯然更加容易了。
舉個數據切分例子:
select * from user_event where user_id='test' and? gmt_create between Sysdate() -1 and Sysdate()
如果根據gmt_create 時間進行數據切分,比如 6個月進行切分一次
amoeba提供利用類似sql表達式進行數據切分:
規則1:GMT_CREATE > to_date('2008-01-01','yyyy-mm-dd') and GMT_CREATE < to_date('2008-05-31','yyyy-mm-dd')
規則1對應服務器1
規則2:GMT_CREATE > to_date('2008-06-01','yyyy-mm-dd') and GMT_CREATE < to_date('2008-12-31','yyyy-mm-dd')
規則2對應服務器2
上面的sql的條件 gmt_create 與規則里面的的gmt_create 進行 交集判斷,如果存在交集則表示符合規則。
則會將sql轉移到 規則1 的相應的服務器上面執行。
利用amoeba寫出這種類似規則很容易,但是要想做到數據切分以后可線性擴容,那么這樣的規則需要自己根據業務實際情況進行設置。
amoeba可同時將sql 并發分發到多臺服務器、然后將結果合并再反饋給客戶端,而且amoeba內部現成采用無阻塞模式,工作線程是不會等待的,并發請求多臺 database server情況下,客戶端等待的時間基本上面是性能最差的那臺 database server+amoeba內部解析協議的時間
總結
以上是生活随笔為你收集整理的amoeba mysql_Amoeba介绍及Amoeba和mysql proxy有区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NR TAC Tracking Area
- 下一篇: requirejs+jquery表单验证