• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      分布式應(yīng)用層中間件的設(shè)計(jì)

      2011-05-11 11:59:10李文杰周劍華
      關(guān)鍵詞:主鍵分片語(yǔ)句

      李文杰,周劍華

      (武漢科技大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,湖北 武漢 430065)

      隨著互聯(lián)網(wǎng)應(yīng)用業(yè)務(wù)的高速增長(zhǎng),搜索引擎、電子商務(wù)、門(mén)戶網(wǎng)站等大型互聯(lián)網(wǎng)公司的網(wǎng)絡(luò)信息流量直線上升,日訪問(wèn)量甚至突破億次大關(guān),從而產(chǎn)生了海量信息和對(duì)這些信息的海量讀寫(xiě),集中式數(shù)據(jù)庫(kù)越來(lái)越難以滿足互聯(lián)網(wǎng)公司對(duì)海量信息的高可靠性、高擴(kuò)展性的需求。

      分布式數(shù)據(jù)庫(kù)通過(guò)對(duì)數(shù)據(jù)進(jìn)行垂直分片和水平分片,讓數(shù)據(jù)存儲(chǔ)在多個(gè)數(shù)據(jù)庫(kù)中,能夠解決海量數(shù)據(jù)的存儲(chǔ)和管理問(wèn)題。所謂垂直分片是把一個(gè)全局關(guān)系的屬性集分成若干子集,并在這些子集上作投影運(yùn)算,每個(gè)投影稱為垂直分片。屬性集數(shù)目是一定的,垂直拆分只能適合一定規(guī)模的擴(kuò)展,當(dāng)對(duì)每個(gè)垂直分片的訪問(wèn)超過(guò)單數(shù)據(jù)庫(kù)所能承受的負(fù)載時(shí),就需要水平分片。水平分片是按一定的條件把全局關(guān)系的所有元組劃分成若干不相交的子集,每個(gè)子集為關(guān)系的一個(gè)片段。

      目前市場(chǎng)上Oracle、DB2等商用分布式數(shù)據(jù)庫(kù)的價(jià)格昂貴,一般企業(yè)僅僅將商用分布式數(shù)據(jù)庫(kù)用來(lái)管理企業(yè)最核心的數(shù)據(jù),而非核心的數(shù)據(jù)則存放在PostgreSQL、MySql等開(kāi)源數(shù)據(jù)庫(kù)中。然而大多數(shù)開(kāi)源數(shù)據(jù)庫(kù)分布式功能不夠強(qiáng)大,甚至不具備分布式的功能。為了解決這個(gè)問(wèn)題,本文提出了分布式數(shù)據(jù)層中間件的設(shè)計(jì)方案,在應(yīng)用層把數(shù)據(jù)垂直、水平拆分到多個(gè)數(shù)據(jù)庫(kù)、多張表中,使應(yīng)用層具備了分布式的功能,和底層數(shù)據(jù)庫(kù)是否具有分布式特性沒(méi)有關(guān)系,從而使底層的開(kāi)源數(shù)據(jù)庫(kù)能夠通過(guò)分布式數(shù)據(jù)層中間件具有分布式的特性。

      1 分布式數(shù)據(jù)層中間件的設(shè)計(jì)原理

      傳統(tǒng)的持久化框架是基于JDBC的,如JPA(Java Persistence API)、Hibernate和 TopLink等。對(duì)象關(guān)系映射(ORM)框架是根據(jù)對(duì)象的屬性生成Sql語(yǔ)句,然后調(diào)用JDBC API完成數(shù)據(jù)的持久化操作。Ibatis是個(gè)JDBC模板,相當(dāng)于半自動(dòng)化ORM映射工具,也是調(diào)用JDBC接口來(lái)完成對(duì)數(shù)據(jù)的持久化操作的。

      所有Java持久化框架對(duì)數(shù)據(jù)庫(kù)的持久化操作都是直接或者間接地調(diào)用JDBC API執(zhí)行Sql語(yǔ)句來(lái)完成對(duì)數(shù)據(jù)的CRUD操作,每條Sql語(yǔ)句通常只操作單數(shù)據(jù)庫(kù)。在持久化框架(如Hibernate)和JDBC之間設(shè)計(jì)一個(gè)分布式數(shù)據(jù)層中間件DDLM (DistributedDataLayer MiddleWare),DDLM層把業(yè)務(wù)邏輯層的每條Sql語(yǔ)句 (下文記作邏輯Sql語(yǔ)句)按照垂直、水平拆分的策略解釋成多個(gè)Sql語(yǔ)句,解釋后的每條Sql語(yǔ)句 (下文記作物理Sql語(yǔ)句)對(duì)一個(gè)數(shù)據(jù)源進(jìn)行操作,從而一條邏輯 Sql語(yǔ)句被解釋成多條物理Sql語(yǔ)句,因此DDLM具有分布式的特性。

      分布式數(shù)據(jù)層中間件的原理如圖1所示。圖中把持久化層分為四個(gè)子層:持久化框架、分布式數(shù)據(jù)層、JDBC、數(shù)據(jù)庫(kù)。例如:JPA把根據(jù)ORM映射規(guī)則生成的Sql語(yǔ)句交給分布式數(shù)據(jù)層,分布式數(shù)據(jù)層中間件把Sql語(yǔ)句解釋為多個(gè)物理Sql語(yǔ)句交給JDBC接口,JDBC接口完成對(duì)數(shù)據(jù)庫(kù)的CRUD操作。

      這樣分布式數(shù)據(jù)層就能夠完成原本只有分布式數(shù)據(jù)庫(kù)才能完成的垂直分片、水平分片、合并排序等分布式操作。用戶不需要使用新的管理工具,只需要利用原有數(shù)據(jù)庫(kù)的管理工具與分布式數(shù)據(jù)層中間件交互。該層把對(duì)多個(gè)物理數(shù)據(jù)庫(kù)的操作透明化。

      圖1 分布式數(shù)據(jù)層原理圖

      2 分布式數(shù)據(jù)層中間件的設(shè)計(jì)方案

      在DDLM設(shè)計(jì)中,不需進(jìn)行垂直分片。一個(gè)全局關(guān)系對(duì)應(yīng)一張數(shù)據(jù)庫(kù)表,這樣就能滿足應(yīng)用中的大多數(shù)需求。而且按照一個(gè)關(guān)系映射一張表的原則拆分,邏輯簡(jiǎn)單清晰,簡(jiǎn)化了數(shù)據(jù)庫(kù)模型的設(shè)計(jì)。DDLM的研究重點(diǎn)是對(duì)表的水平分片以及水平分片后產(chǎn)生的問(wèn)題的解決。

      水平分片把關(guān)系模式R的記錄拆分到n(n≥1)個(gè)物理數(shù)據(jù)庫(kù)中,每個(gè)物理數(shù)據(jù)庫(kù)有m(m≥1)張數(shù)據(jù)表,模式R的記錄被路由到n×m張模式相同的物理數(shù)據(jù)庫(kù)表中。

      水平分片后,記錄存在于不同的物理數(shù)據(jù)庫(kù),隨之產(chǎn)生了兩個(gè)問(wèn)題:查詢數(shù)據(jù)時(shí)需要合并并且排序、主鍵需要全局唯一生成。

      2.1 分庫(kù)策略

      一個(gè)數(shù)據(jù)庫(kù)所能存放的表數(shù)目會(huì)受到文件系統(tǒng)的限制,有必要把一張邏輯表的數(shù)據(jù)拆分到多個(gè)物理數(shù)據(jù)庫(kù)中。為了實(shí)現(xiàn)此功能,在表模式中添加一個(gè)整數(shù)類型的db_num字段,db_num字段的值指示了記錄(也稱作元組)被路由的目標(biāo)數(shù)據(jù)庫(kù)。下面舉例說(shuō)明db_num字段的作用:

      設(shè)關(guān)系模式為 R(id,…,db_num,…),該模式對(duì)應(yīng)的表的數(shù)據(jù)需要被路由到N(N×1)個(gè)物理數(shù)據(jù)庫(kù)內(nèi),任意一條記錄(id_value,…,n,…)存在于第 n個(gè)物理數(shù)據(jù)庫(kù)的某張表中(0

      2.2 分表策略

      數(shù)據(jù)庫(kù)表存放記錄數(shù)量的最大值在理論上可以取很大的值,但在實(shí)際應(yīng)用中通常受到文件系統(tǒng)的限制。當(dāng)一張表的數(shù)據(jù)記錄數(shù)達(dá)到一個(gè)閾值時(shí),操作該表的速率會(huì)急劇下降。在MySql數(shù)據(jù)庫(kù)中,當(dāng)表記錄數(shù)達(dá)到1 000萬(wàn)條時(shí),查詢?cè)摫淼乃俾拭黠@地下降。

      在同一個(gè)數(shù)據(jù)庫(kù)建立多張模式相同的表,數(shù)據(jù)被路由到不同的表中,從而可以很好地解決表記錄過(guò)多引起速率下降的問(wèn)題。每條記錄要唯一地標(biāo)示它所在表的編號(hào),因此必須引入某種編碼手段存放該記錄的編號(hào)。有兩種常用的策略:(1)用記錄的主鍵標(biāo)示該記錄所在表的編號(hào),也就是數(shù)據(jù)庫(kù)表主鍵拆分策略;(2)特意引進(jìn)一個(gè)日期字段標(biāo)示記錄所在表的編號(hào),也就是數(shù)據(jù)庫(kù)表日期字段拆分策略。

      2.2.1 數(shù)據(jù)庫(kù)表主鍵拆分策略

      假設(shè)邏輯表模式R的記錄在一個(gè)數(shù)據(jù)庫(kù)中需要分別路由到M(M≥1)張物理表中,設(shè)邏輯表R的表名為logic_table_name,物理表的表名分別是 table_1,table_2,…,table_M。

      設(shè)表R的模式為R(id,…),其中id是模式的主鍵,其數(shù)據(jù)類型為整數(shù)類型。R的任意一條記錄r(x,…),其主鍵值為x,r被路由到物理表 table_y中 (y的值為 x和M取模的結(jié)果,即:y=x%M)。

      隨著記錄主鍵值id的增加,記錄可以非常均勻地路由到M張物理表中。然而,如果需要?jiǎng)討B(tài)增加M的值,如M的值由M增加到M’,則記錄就不會(huì)均勻地分配到M’張物理表中。此時(shí)可以采取表日期字段拆分法。

      2.2.2 數(shù)據(jù)庫(kù)表日期字段拆分

      按照表的日期字段拆分?jǐn)?shù)據(jù)是另一種常用的拆分策略,當(dāng)數(shù)據(jù)量比較大時(shí),暫時(shí)無(wú)法估算到底需要多少?gòu)埼锢肀聿拍艽娣乓粋€(gè)模式的所有記錄,此時(shí)可以采取按表日期字段拆分策略。

      設(shè)數(shù)據(jù)庫(kù)表模式為 R(id,column1,…,update_time),update_time字段是該記錄創(chuàng)建時(shí)的系統(tǒng)時(shí)間,任意一條記錄 r(x,column1_vlaue,…,update_time_value)。 在應(yīng)用層讀取系統(tǒng)的時(shí)間可以計(jì)算得到update_time_value時(shí)間值是一年中的某天day_of_year,這樣就可以把數(shù)據(jù)拆分到365(或366)張表中,物理表名分別為table_name_0,table_name_1,…,table_name_day_of_year,…,table_name_365(或 365)。

      除了按照取得update_time_value的day_of_year值,也可以取得update_time_value在星期中的某天day_of_week和在月的某天day_of_month。DDLM中間支持按照時(shí)間的各種策略。

      為了最大化地拆分?jǐn)?shù)據(jù),DDLM還提供以上策略的二級(jí)拆分。

      2.3 數(shù)據(jù)合并排序策略

      分庫(kù)分表后,一張邏輯表table_name的數(shù)據(jù)存儲(chǔ)在不同的物理表中,在對(duì)表進(jìn)行查詢、刪除和更新時(shí),一條Sql語(yǔ)句可能會(huì)同時(shí)對(duì)一張或者多張物理表的數(shù)據(jù)產(chǎn)生影響。對(duì)于刪除、更新操作,分別針對(duì)每個(gè)物理數(shù)據(jù)庫(kù)執(zhí)行對(duì)應(yīng)的刪除、更新語(yǔ)句,然而對(duì)于查詢語(yǔ)句涉及到多個(gè)物理數(shù)據(jù)庫(kù)時(shí),不能簡(jiǎn)單地針對(duì)每個(gè)數(shù)據(jù)庫(kù)執(zhí)行查詢語(yǔ)句,還需要合并所有的查詢結(jié)果并且排序。下面舉例說(shuō)明查詢合并以及排序策略。

      假設(shè)物理表表名分別為 table_name0,table_name1,…,table_nameN,同時(shí)設(shè)Sql語(yǔ)句為SELECT*FROM talbe_name WHERE update_time=today OR update_time=yesterday ORDER By id LIMIT a,b(其 中 a,b 為 自 然數(shù)),又假設(shè)該邏輯表table_name是按update_time日期字段水平分片的,則Sql的查詢會(huì)涉及到物理表中的兩張表記為 table_nameX(0≤X≤N),table_name_Y(0≤X≤N)。該Sql的執(zhí)行流程如下:

      (1)對(duì)表table_nameX查詢操作SELECT*FROM table_nameX WHERE update_time=today得到結(jié)果集ResultSet1,并對(duì)表table_nameY執(zhí)行和SELECT*FROM table_nameY WHERE update_time=yesterday得到結(jié)果集ResultSet2。

      (2)從結(jié)果ResultSet1和ResultSet2讀取數(shù)據(jù)存放在一個(gè)集合Result中,按照id字段排序。

      (3)在集合 Result中,讀取 id分布在區(qū)間[a,a+b]上的記錄作為返回結(jié)果。

      通過(guò)上述查詢合并排序策略,當(dāng)在查詢過(guò)程中涉及到多張物理表時(shí),能夠分別讀取多張物理數(shù)據(jù)庫(kù)表的數(shù)據(jù),然后在內(nèi)存中對(duì)數(shù)據(jù)分別執(zhí)行合并、排序和分頁(yè)操作。合并排序需要一定的時(shí)間和空間,所以在查詢時(shí),盡量不要同時(shí)涉及到兩個(gè)或者以上的數(shù)據(jù)庫(kù)。

      2.4 主鍵生成策略設(shè)計(jì)

      在DDLM中,數(shù)據(jù)被路由到多個(gè)數(shù)據(jù)庫(kù)的多張表中,為了確保主鍵的全局唯一性,不能借助于數(shù)據(jù)庫(kù)管理系統(tǒng)DBMS來(lái)生成主鍵,因?yàn)镈BMS生成的主鍵只在當(dāng)前數(shù)據(jù)庫(kù)中具有唯一性,不能確保主鍵的全局唯一性。有兩種策略可以生成具有全局唯一性的主鍵:(1)采用通用的UUID生成策略,UUID是借助主機(jī)的時(shí)間戳、IP地址和網(wǎng)卡Mac地址等生成分布式唯一標(biāo)示符的算法,但是該策略生成的唯一標(biāo)示符需要用32個(gè)字符來(lái)存儲(chǔ),非常浪費(fèi)空間;(2)借助分庫(kù)分表的信息生成主鍵,該策略非常有效地利用了分庫(kù)分表的路由信息,巧妙地生成全局唯一主鍵。下面將詳細(xì)地介紹該策略。

      假設(shè)一張邏輯表logic_name的數(shù)據(jù)分別存儲(chǔ)在數(shù)據(jù)庫(kù) db_1,db_2,…,db_s(s為大于 1的正整數(shù))中,每個(gè)數(shù)據(jù)庫(kù)中有相同的表 table_1,table_2,…,table_t(t為大于 1的正整數(shù))。用三位作為數(shù)據(jù)庫(kù)的編號(hào)、三位作為表的編號(hào)以及一個(gè)隨機(jī)字段來(lái)構(gòu)成全局唯一主鍵。數(shù)學(xué)表達(dá)式為xxxyyym…m,xxx為數(shù)據(jù)庫(kù)的編號(hào),yyy為表的編號(hào),m…m為隨機(jī)數(shù)。該主鍵生成策略有兩個(gè)優(yōu)點(diǎn):(1)實(shí)現(xiàn)方便,通常一張邏輯表的數(shù)據(jù)不會(huì)多得需要被路由到1 000個(gè)物理數(shù)據(jù)庫(kù)以上,也不會(huì)路由到1 000張表以上;(2)主鍵本身就包含有路由信息。使用此策略,由主鍵信息就能路由該記錄,而不必查詢配置信息。假設(shè)一條數(shù)據(jù)庫(kù)記錄的主鍵為10020012345,取出前三位為100,則該記錄應(yīng)該路由到編號(hào)為 100的數(shù)據(jù)庫(kù) (記為db100),取出4~6位為200,則該記錄應(yīng)該路由到db100的編號(hào)為200的表。

      DDLM在應(yīng)用層透明地把邏輯數(shù)據(jù)庫(kù)表的數(shù)據(jù)拆分到多個(gè)物理數(shù)據(jù)庫(kù)的多張表中,同時(shí)提供合并查詢排序、主鍵生成等功能,從而可以在不支持分布特性的數(shù)據(jù)庫(kù)管理系統(tǒng)應(yīng)用分布式特性。

      [1]林昊.分布式 Java應(yīng)用:基礎(chǔ)與實(shí)踐[M].北京:電子工業(yè)出版社,2010.

      [2]何坤.基于內(nèi)存數(shù)據(jù)庫(kù)的分布式數(shù)據(jù)庫(kù)架構(gòu)[J].程序員,2010(7):116.

      [3]潘群華,吳秋云,陳宏盛.分布式數(shù)據(jù)庫(kù)系統(tǒng)中數(shù)據(jù)一致性的維護(hù)方法[J].計(jì)算機(jī)工程,2002(9):12-15.

      [4]習(xí)周龍.分布式數(shù)據(jù)庫(kù)管理系統(tǒng)實(shí)現(xiàn)技術(shù)[M].北京:科學(xué)出版社,1999.

      [5]趙致格.數(shù)據(jù)庫(kù)系統(tǒng)與應(yīng)用[M].北京:高等教育出版社,1994.

      猜你喜歡
      主鍵分片語(yǔ)句
      基于Go 實(shí)現(xiàn)的分布式主鍵系統(tǒng)研究
      上下分片與詞的時(shí)空佈局
      詞學(xué)(2022年1期)2022-10-27 08:06:12
      分片光滑邊值問(wèn)題的再生核方法
      CDN存量MP4視頻播放優(yōu)化方法
      重點(diǎn):語(yǔ)句銜接
      基于外鍵的E-R圖繪制方法研究
      基于模糊二分查找的幀分片算法設(shè)計(jì)與實(shí)現(xiàn)
      精彩語(yǔ)句
      如何搞定語(yǔ)句銜接題
      數(shù)據(jù)庫(kù)主鍵的設(shè)計(jì)方法探討
      盐津县| 泾川县| 江华| 安阳市| 枞阳县| 黄浦区| 岱山县| 赣榆县| 伊宁县| 繁昌县| 利辛县| 合水县| 滁州市| 尉犁县| 阜新市| 舒城县| 西畴县| 八宿县| 余姚市| 大同市| 和龙市| 六枝特区| 辽中县| 电白县| 晋州市| 兴山县| 油尖旺区| 丹江口市| 鸡泽县| 西充县| 山东| 苗栗县| 新邵县| 都昌县| 海淀区| 曲靖市| 原阳县| 丹江口市| 新建县| 宁国市| 上栗县|