Amoeba 版本 0.12 (當時搜這篇文章主要是看Amoeba 的時間函數是什麼。嘿。)
一、Master/Slave 結構讀寫分離:
Master: server1 (可讀寫)
slaves:server2、server3、server4(3個平等的數據庫。只讀/負載均衡)
amoeba提供讀寫分離pool相關配置。並且提供負載均衡配置。
可配置server2、server3、server4形成一個虛擬的 virtualSlave,該配置提供負載均衡、failOver、故障恢復功能
- <dbServer name="virtualSlave" virtual="true">
- <poolConfig>
- <className>com.meidusa.amoeba.server.MultipleServerPool</className>
- <!-- 負載均衡參數 1=ROUNDROBIN , 2=WEIGHTBASED -->
- <property name="loadbalance">1</property>
- <!-- 參與該pool負載均衡的poolName列表以逗號分割 -->
- <property name="poolNames">server2,server3,server4</property>
- </poolConfig>
- </dbServer>
<dbServer name="virtualSlave" virtual="true"> <poolConfig> <className>com.meidusa.amoeba.server.MultipleServerPool</className> <!-- 負載均衡參數 1=ROUNDROBIN , 2=WEIGHTBASED --> <property name="loadbalance">1</property> <!-- 參與該pool負載均衡的poolName列表以逗號分割 --> <property name="poolNames">server2,server3,server4</property> </poolConfig> </dbServer>
如果不啓用數據切分,那麼只需要配置QueryRouter屬性
wirtePool=server1
readPool=virtualSlave
- <queryRouter>
- <className>com.meidusa.amoeba.mysql.parser.MysqlQueryRouter</className>
- <property name="LRUMapSize">1500</property>
- <property name="defaultPool">server1</property>
- <property name="writePool">server1</property>
- <property name="readPool">virtualSlave</property>
- <property name="needParse">true</property>
- </queryRouter>
<queryRouter> <className>com.meidusa.amoeba.mysql.parser.MysqlQueryRouter</className> <property name="LRUMapSize">1500</property> <property name="defaultPool">server1</property> <property name="writePool">server1</property> <property name="readPool">virtualSlave</property> <property name="needParse">true</property> </queryRouter>
那麼遇到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內部解析協議的時間