????? 當系統數據量發展到一定程度后,往往需要進行數據庫的垂直切分和水平切分,以實現負載均衡和性能提升,而數據切分后隨之會帶來多數據源整合等等問題。如果僅僅從應用程序的角度去解決這類問題,無疑會加重應用程度的復雜度,因此需要一個成熟的第三方解決方案。
Amoeba正是解決此類問題的一個開源方案,Amoeba位于應用程序和數據庫服 務器之間,相當于提供了一個代理,使得應用程序只要連接一個Amoeba,相當于只是在操作一個單獨的數據庫服務器,而實際上卻是在操作多個數據庫服務 器,這中間的工作全部交由Amoeba去完成。
本文針對基于MySQL的水平切分的實現機制,講解Amoeba For MySQL的簡單應用。
?
一、背景介紹
使用數據庫:MySQL
數據庫節點1:127.0.0.1
數據庫節點2:10.167.157.176
?
數據庫名:yunzhu
切分的表:用戶表(user_info)
切分的參數:用戶ID(USERID)
?
切分規則:
用戶ID小于等于100的數據存到數據庫節點1,
用戶ID大于100的數據存到數據庫節點2
?
user_info表結構如下:
- CREATE ? TABLE ?`user_info`?(??
- ????`USERID`? INT (10)? NOT ? NULL ? DEFAULT ? '0' ,??
- ????`USERNAME`? VARCHAR (50)? NULL ? DEFAULT ? NULL ,??
- ???? PRIMARY ? KEY ?(`USERID`)??
- )??
數據庫節點1中user_info表中的數據:
+--------+-----------+ | USERID | USERNAME? | +--------+-----------+ |???? 73 | Chen Feng | |???? 88 | China???? | +--------+-----------+
數據庫節點1中user_info表中的數據:
+--------+----------+ | USERID | USERNAME | +--------+----------+ |??? 108 | Jiang Su | |??? 200 | NanJing? | +--------+----------+
?
Amoeba版本:
amoeba-mysql-binary-2.2.0
?
下載地址:
下載后直接解壓即可使用
?
二、配置Amoeba
配置文件全部位于conf目錄下
1、amoeba.xml
配置連接Amoeba程序的用戶名和密碼:
- < property ? name = "user" > root </ property > ??
- < property ? name = "password" > chenfeng123 </ property > ??
2、dbServers.xml
先配置一個抽象的父節點,定義多個數據庫節點的共通的信息,包括數據庫節點的端口、schema、用戶名和密碼:
- < dbServer ? name = "abstractServer" ? abstractive = "true" > ??
- ???? < factoryConfig ? class = "com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory" > ??
- ????????......??
- ??????????????
- ???????? <!--?mysql?port?--> ??
- ???????? < property ? name = "port" > 3306 </ property > ??
- ??????????
- ???????? <!--?mysql?schema?--> ??
- ???????? < property ? name = "schema" > yunzhu </ property > ??
- ??????????
- ???????? <!--?mysql?user?--> ??
- ???????? < property ? name = "user" > root </ property > ??
- ??????????
- ???????? <!--??mysql?password?--> ??
- ???????? < property ? name = "password" > chenfeng </ property > ??
- ???? </ factoryConfig > ??
- ??????......??
- </ dbServer > ??
? 再配置兩個數據庫節點,繼承上面的父節點,然后配置各自的IP地址即可:
- < dbServer ? name = "server1" ?? parent = "abstractServer" > ??
- ???? < factoryConfig > ??
- ???????? <!--?mysql?ip?--> ??
- ???????? < property ? name = "ipAddress" > 127.0.0.1 </ property > ??
- ???? </ factoryConfig > ??
- </ dbServer > ??
- ??
- < dbServer ? name = "server2" ?? parent = "abstractServer" > ??
- ???? < factoryConfig > ??
- ???????? <!--?mysql?ip?--> ??
- ???????? < property ? name = "ipAddress" > 10.167.157.176 </ property > ??
- ???? </ factoryConfig > ??
- </ dbServer > ??
3、rule.xml
? 配置切分規則:
???? 1、schema指定數據庫名,name指定表名,defaultPools指定關聯的數據庫節點(指定哪幾個節點就從哪幾個節點里面查數據)
???? 2、切分規則:
???????? 1)用戶ID小于100的數據存到數據庫節點1
???????? 2)用戶ID大于100的數據存到數據庫節點2
- < amoeba:rule ? xmlns:amoeba = "http://amoeba.meidusa.com/" > ??
- ???? < tableRule ? name = "user_info" ? schema = "yunzhu" ? defaultPools = "server1,server2" > ??
- ???????? < rule ? name = "rule1" > ??
- ???????????? < parameters > USERID </ parameters > ??
- ???????????? < expression > <![CDATA[?USERID?<=?100]]> </ expression > ??
- ???????????? < defaultPools > server1 </ defaultPools > ??
- ???????????? < readPools > server1 </ readPools > ??
- ???????????? < writePools > server1 </ writePools > ??
- ???????? </ rule > ??
- ???????? < rule ? name = "rule2" > ??
- ???????????? < parameters > USERID </ parameters > ??
- ???????????? < expression > <![CDATA[?USERID?>?100?]]> </ expression > ??
- ???????????? < defaultPools > server2 </ defaultPools > ??
- ???????????? < writePools > server2 </ writePools > ??
- ???????????? < readPools > server2 </ readPools > ??
- ???????? </ rule > ??
- ???? </ tableRule > ????????
- </ amoeba:rule > ??
?
三、運行及驗證
1、啟動Amoeba
通過bin目錄下的amoeba.bat啟動:
?
- amoeba?start??
?
啟動后控制臺打印如下信息,可以看到:
- log4j:WARN?log4j?config?load?completed?from?file:D:\JavaTools\amoeba-mysql-binar??
- y- 2.2 . 0 \bin\..\conf\log4j.xml??
- 2013 - 01 - 08 ? 09 : 32 : 27 , 765 ?INFO??context.MysqlRuntimeContext?-?Amoeba?for?Mysql?cur??
- rent?versoin= 5.1 . 45 -mysql-amoeba-proxy- 2.2 . 0 ??
- log4j:WARN?ip?access?config?load?completed?from?file:D:\JavaTools\amoeba-mysql-b??
- inary- 2.2 . 0 \bin\../conf/access_list.conf??
- 2013 - 01 - 08 ? 09 : 32 : 27 , 921 ?INFO??net.ServerableConnectionManager?-?Amoeba?for?Mysql??
- ?listening?on? 0.0 . 0.0 / 0.0 . 0.0 : 8066 .??
- 2013 - 01 - 08 ? 09 : 32 : 27 , 921 ?INFO??net.ServerableConnectionManager?-?Amoeba?Monitor?S??
- erver?listening?on?/ 127.0 . 0.1 : 40170 .??
2、連接Amoeba
通過mysql客戶端連接Amoeba,端口指定為8066,然后還像以前操作MySQL一樣進行操作:
- D:\>mysql?-P8066?-uroot?-pchenfeng123??
- Welcome?to?the?MySQL?monitor.??Commands?end?with?;?or?\g.??
- Your?MySQL?connection?id?is? 21616774 ?to?server?version:? 5.1 . 45 -mysql-amoeba-prox??
- y- 2.2 . 0 ??
- ??
- Type? 'help;' ?or? '\h' ?for?help.?Type? '\c' ?to?clear?the?buffer.??
- ??
- mysql>??
3、驗證數據的查詢
查詢yunzhu庫下的user_info表的數據,如下:
- mysql>? select ?*? from ?yunzhu.user_info;??
- + --------+-----------+ ??
- |?USERID?|?USERNAME??|??
- + --------+-----------+ ??
- |????108?|?Jiang?Su??|??
- |????200?|?NanJing???|??
- |?????73?|?Chen?Feng?|??
- |?????88?|?China?????|??
- + --------+-----------+ ??
- 4? rows ? in ? set ?(0.02?sec)??
可以看到,現在查到了兩個數據庫節點中的user_info表中的所有記錄。
?
4、驗證數據的插入
這里插入兩條數據,一條USERID為55,另一條USERID為155,如下:
- mysql>?insert?into?yunzhu.user_info(USERID,USERNAME)?values( 55 , 'test55' );??
- Query?OK,? 1 ?row?affected?( 0.13 ?sec)??
- ??
- mysql>?insert?into?yunzhu.user_info(USERID,USERNAME)?values( 155 , 'test155' );??
- Query?OK,? 1 ?row?affected?( 0.05 ?sec)??
?
查詢數據庫節點1:
- D:\>mysql?-uroot?-pchenfeng??
- Welcome?to?the?MySQL?monitor.??Commands?end?with?;?or?\g.??
- Your?MySQL?connection?id?is? 33 ?to?server?version:? 5.0 . 18 -nt??
- ??
- Type? 'help;' ?or? '\h' ?for?help.?Type? '\c' ?to?clear?the?buffer.??
- ??
- mysql>?select?*?from?yunzhu.user_info;??
- +--------+-----------+??
- |?USERID?|?USERNAME??|??
- +--------+-----------+??
- |????? 55 ?|?test55????|??
- |????? 73 ?|?Chen?Feng?|??
- |????? 88 ?|?China?????|??
- +--------+-----------+??
- 3 ?rows?in?set?( 0.00 ?sec)??
?
查詢數據庫節點2:
- D:\>mysql?-uroot?-pchenfeng?-h10. 167.157 . 176 ??
- Welcome?to?the?MySQL?monitor.??Commands?end?with?;?or?\g.??
- Your?MySQL?connection?id?is? 34 ?to?server?version:? 5.0 . 18 -nt??
- ??
- Type? 'help;' ?or? '\h' ?for?help.?Type? '\c' ?to?clear?the?buffer.??
- ??
- mysql>?select?*?from?yunzhu.user_info;??
- +--------+----------+??
- |?USERID?|?USERNAME?|??
- +--------+----------+??
- |???? 108 ?|?Jiang?Su?|??
- |???? 155 ?|?test155??|??
- |???? 200 ?|?NanJing??|??
- +--------+----------+??
- 3 ?rows?in?set?( 0.00 ?sec)??
可以發現USERID為55的記錄插入到了數據庫節點1中,USERID為155的記錄插入到了數據庫節點2中。
因為根據rule.xml中的切分規則,USERID小于等于100的的記錄存在數據庫節點1中,而大于100的則存在數據庫節點2中。
?
四、注意一些限制
這是我在實踐中發現的,剛開始不知道存在這樣的限制,以致于浪費了很多時間,以為配置有問題,搞了很久才發現原來是因為這些限制才導致沒有出現預期的結果,所以必須要注意:
1、不管是查詢和插入,每條都必須顯式地指定數據庫名(yunzhu),否則只會從一個數據庫節點中查詢數據,或者所有數據全部會插入一個數據庫節點中。
2、插入數據時,必須顯式地指定列名,如“insert into yunzhu.user_info(USERID,USERNAME)”,否則切分規則不會生效,所有記錄都會插入到一個數據庫節點中。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
