深藍色心情

          過來聊聊~~~~

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            31 Posts :: 0 Stories :: 46 Comments :: 0 Trackbacks
          最近討論db shard的帖子比較多,感覺很多都是在參考hibernate shard的思路,但hibernate分表真的那么好嗎?我覺得它最少有2個問題: 

          1. 改成shard后,代碼的API調(diào)用要變。代碼改動很大。 
          2. 設(shè)計很復(fù)雜,不清晰,邏輯關(guān)系難以理解。 

          hibernate shard基本上就是為了shard而對hibernate做的增增補補,湊合用還行,根本不具備設(shè)計上的參考價值。 

          對數(shù)據(jù)庫分切方面,到目前為止,我覺得還是guzz的設(shè)計最清晰,如果我說的不對,歡迎理性討論。不管您是否使用guzz,但是guzz在數(shù)據(jù)庫分切方面的設(shè)計,對于清晰的設(shè)計模式,比hibernate shard更具有借鑒意義。 

          guzz垂直切分 

          垂直切分是指將不同的表分別存儲到不同的數(shù)據(jù)庫中。guzz默認配置級支持,不需要寫任何代碼,可以在任何時候,在需要時,將每張表存儲到自己單獨的一組服務(wù)器上,應(yīng)該說是垂直分切的極限了。而且設(shè)計上,無論什么時候怎么分切,都不需要你改動代碼。開發(fā)時你可以讓所有表在一個庫上;部署時,分到多個庫上;以后業(yè)務(wù)增加了,再更加分散的放。 

          垂直分切簡單配置方式: 

          1. 聲明你要用多少臺數(shù)據(jù)庫,數(shù)據(jù)庫之間什么關(guān)系。 

          Xml代碼 
          1. <dialect class="org.guzz.dialect.H2Dialect"></dialect>  
          2. <dialect name="mysql5dialect" class="org.guzz.dialect.Mysql5Dialect" />  
          3. <dialect name="oracle10gdialect" class="org.guzz.dialect.Oracle10gDialect" />  
          4.   
          5. <tran>  
          6.         <dbgroup name="default" masterDBConfigName="masterDB" />  
          7.         <dbgroup name="mysql" masterDBConfigName="masterDB" slaveDBConfigName="mysqlSlaveDB" dialectName="mysql5dialect" />  
          8.         <dbgroup name="oracle" masterDBConfigName="oracleDB" dialectName="oracle10gdialect" />  
          9. </tran>   

          這里我們聲明了3組數(shù)據(jù)庫,而且數(shù)據(jù)庫類型還不一樣。 

          2. 對每張表,配置應(yīng)該存儲到那個庫里 

          Xml代碼 
          1. <a-business dbgroup="default" name="filterWord" class="com.guzzservices.business.FilterWord" />  
          2. <a-business dbgroup="mysql" name="filterWordGroup" class="com.guzzservices.business.FilterWordGroup" />  
          3. <a-business dbgroup="oracle" name="configuration" class="com.guzzservices.business.Configuration" />  

          簡單的配置,將三個對象分別存儲到3臺不同的數(shù)據(jù)庫中,完成垂直分切。 

          guzz水平切表 

          水平切表是指將一張大表,分切成許多小表。guzz的設(shè)計是當需要水平分表時,原先代碼不變,為每個需要分切的表編寫一個分表策略類,配置到系統(tǒng)中。然后在調(diào)用前,聲明分表策略即可。 
            
            整個過程只需要新寫一個類,在調(diào)用出增加一行代碼即可,對原始系統(tǒng)入侵非常小,風險可控。 

            流程總比hibernate shard要清晰很多,具體可以看http://code.google.com/p/guzz/wiki/TutorialShadowTable?wl=zh-Hans 


          數(shù)據(jù)庫主從分離 

          從垂直分切部分可以看到,guzz也是配置性的原生支持讀寫分離。如果需要增加從數(shù)據(jù)庫,可以隨時加上,不需要改任何代碼。不需要改動代碼,而且配置也不復(fù)雜,應(yīng)該算是設(shè)計上的極限了吧? 

          你只需要在dbgroup中增加一個屬性“slaveDBConfigName”,然后在一個properties文件中加上所有你需要的從數(shù)據(jù)庫連接池配置即可,從數(shù)據(jù)庫可以有許多臺。 

          這個hibernate shard根本就沒有涉及到。而且guzz允許程序控制讀寫庫選取,和proxy模式的中間件路由各有優(yōu)勢,畢竟更加容易控制。如果你做過內(nèi)容提前審核再允許發(fā)布的系統(tǒng),就會明白proxy中間件解決不了全部問題,有些讀操作不允許延遲,只能讀主庫,而是也是讀事務(wù),proxy中間件會很尷尬。 

          異構(gòu)數(shù)據(jù)庫 

          這個hibernate以及ibatis之類的更沒有了。而且也是對應(yīng)用透明的,你可以隨時選擇增加一種數(shù)據(jù)庫,然后把某些表放到上面,如增加一個H2做應(yīng)用端緩存數(shù)據(jù)庫,自己完成類似Timesten + oracle的架構(gòu)。 

          配置方式在上面的垂直分切小節(jié)也可以看到。 

          數(shù)據(jù)庫連接池配置 

          隨著表垂直和水平切分的進行,數(shù)據(jù)庫會越來越多,數(shù)據(jù)源配置也會越來越多。guzz的設(shè)計是配置分組管理,類似Mysql的配置文件。每個數(shù)據(jù)源配置都在一個組內(nèi),無論增加多少都清晰了然,不會名字相互沖突。 

          示例: 
          Properties代碼 
          1. [masterDB]  
          2. guzz.identifer=blogMasterDB  
          3. guzz.IP=localhost  
          4. guzz.maxLoad=120  
          5. driverClass=com.mysql.jdbc.Driver  
          6. jdbcUrl=jdbc:mysql://localhost:3306/blog?useUnicode=true&amp;characterEncoding=UTF-8&amp;useServerPrepStmts=true  
          7. user=root  
          8. password=root  
          9. acquireIncrement=10  
          10. idleConnectionTestPeriod=60  
          11.   
          12. [updateMasterDB]  
          13. guzz.identifer=incUpdateDB1  
          14. guzz.IP=localhost  
          15. guzz.maxLoad=20  
          16. driverClass=com.mysql.jdbc.Driver  
          17. jdbcUrl=jdbc:mysql://localhost:3306/guzzSlowUpdate?useUnicode=true&amp;characterEncoding=UTF-8  
          18. user=slowupdate  
          19. password=slowupdate  
          20. acquireIncrement=10  
          21. idleConnectionTestPeriod=60  
          22.   
          23. [logMasterDB]  
          24. ....  

          如果一些數(shù)據(jù)庫對某些連接池支持更好,guzz設(shè)計上還允許為不同的數(shù)據(jù)源指定不同的連接池實現(xiàn)。 

          如果您需要分表,還是放棄hibernate shard或ibatis的設(shè)計模式吧,哪些只是臨時拼湊出來的東西,設(shè)計上根本就不怎么樣! 
          posted on 2010-10-18 21:02 深藍色心情 閱讀(4230) 評論(5)  編輯  收藏 所屬分類: Java

          Feedback

          # re: 數(shù)據(jù)庫分切設(shè)計何必糾結(jié)于hibernate shard模式,應(yīng)該簡單化了 2010-10-18 22:09 YangL
          hibernate shard大概是零七零八年的代碼了吧,好像已經(jīng)死了。
          而guzz在國內(nèi)的大型論壇應(yīng)用上還是很不錯的,如強國論壇、央視的投票系統(tǒng)。。。  回復(fù)  更多評論
            

          # re: 數(shù)據(jù)庫分切設(shè)計何必糾結(jié)于hibernate shard模式,應(yīng)該簡單化了 2010-10-19 11:29 MyYate
          水平劃分時如何做到排序和分組統(tǒng)計?這個在企業(yè)應(yīng)用里使用很多。http://code.google.com/p/guzz/wiki/TutorialShadowTable?wl=zh-Hans
          我看這兒沒有給出sample,謝謝~  回復(fù)  更多評論
            

          # re: 數(shù)據(jù)庫分切設(shè)計何必糾結(jié)于hibernate shard模式,應(yīng)該簡單化了 2010-10-19 13:07 darkbluefeeling
          @MyYate

          水平分切后這方面需要手工進行多表關(guān)聯(lián)查詢。水平分表不能自動的進行多表路由,這樣分表所帶來的性能各方面優(yōu)勢就沒有了。

          對于這種情況,建議您考慮下垂直分表,把表分到不同的機器上來提高性能。
            回復(fù)  更多評論
            

          # re: 數(shù)據(jù)庫分切設(shè)計何必糾結(jié)于hibernate shard模式,應(yīng)該簡單化了 2010-10-26 11:10 lll
          問題在于,有些系統(tǒng),瓶頸就在那一張表... ... 你就是單為這張表分配個服務(wù)器也沒用  回復(fù)  更多評論
            

          # re: 數(shù)據(jù)庫分切設(shè)計何必糾結(jié)于hibernate shard模式,應(yīng)該簡單化了 2010-10-27 09:32 深藍色心情
          @lll
          下個更新準備支持您說到的情況,一張表分到多組機器上。  回復(fù)  更多評論
            

          主站蜘蛛池模板: 海阳市| 临沭县| 汉源县| 伊吾县| 土默特右旗| 资溪县| 故城县| 永定县| 兴仁县| 甘孜县| 启东市| 治县。| 柳州市| 伊春市| 锡林郭勒盟| 来宾市| 商河县| 蓬莱市| 宜昌市| 蒙阴县| 鄂温| 澄江县| 洞口县| 靖安县| 乐亭县| 卓尼县| 五指山市| 衡水市| 怀集县| 根河市| 双柏县| 蒙城县| 弥勒县| 宜兰县| 黎川县| 安义县| 郓城县| 大方县| 靖边县| 和田县| 神木县|