Amoeba 讀寫分離 和 數據切分

Amoeba 版本 0.12  (當時搜這篇文章主要是看Amoeba 的時間函數是什麼。嘿。)

一、Master/Slave 結構讀寫分離
Master: server1 (可讀寫)
slaves:server2、server3、server4(3個平等的數據庫。只讀/負載均衡)

amoeba提供讀寫分離pool相關配置。並且提供負載均衡配置。
可配置server2、server3、server4形成一個虛擬的 virtualSlave,該配置提供負載均衡、failOver、故障恢復功能

Xml代碼
  1. <dbServer name="virtualSlave" virtual="true">  
  2.     <poolConfig>  
  3.         <className>com.meidusa.amoeba.server.MultipleServerPool</className>  
  4.         <!-- 負載均衡參數 1=ROUNDROBIN , 2=WEIGHTBASED -->  
  5.         <property name="loadbalance">1</property>  
  6.                   
  7.         <!-- 參與該pool負載均衡的poolName列表以逗號分割 -->  
  8.         <property name="poolNames">server2,server3,server4</property>  
  9.     </poolConfig>  
  10. </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

Xml代碼
  1. <queryRouter>  
  2.     <className>com.meidusa.amoeba.mysql.parser.MysqlQueryRouter</className>  
  3.     <property name="LRUMapSize">1500</property>  
  4.     <property name="defaultPool">server1</property>  
  5.   
  6.     <property name="writePool">server1</property>  
  7.     <property name="readPool">virtualSlave</property>  
  8.   
  9.     <property name="needParse">true</property>  
  10. </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內部解析協議的時間

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章