日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

一次sharding,shardingjdbc

【一次sharding,shardingjdbc】Sharding-JDBC,查詢量大如何優(yōu)化?

一次sharding,shardingjdbc


在互聯(lián)網(wǎng)時(shí)代,隨著業(yè)務(wù)數(shù)量的暴增和應(yīng)用規(guī)模的不斷擴(kuò)大,無論是oracle還是mysql這樣子的關(guān)系型數(shù)據(jù)庫(kù),都會(huì)面臨服務(wù)器CPU、磁盤IO和內(nèi)存的各種瓶頸問題 。基于此情況,各個(gè)業(yè)務(wù)團(tuán)隊(duì)迫切需要一種數(shù)據(jù)分片的方案將業(yè)務(wù)數(shù)據(jù)量存儲(chǔ)成本分?jǐn)偟匠杀究煽氐母鱾€(gè)普通數(shù)據(jù)庫(kù)服務(wù)器上,數(shù)據(jù)庫(kù)切分的方案便應(yīng)運(yùn)而生 。本文將結(jié)合實(shí)際的業(yè)務(wù)場(chǎng)景進(jìn)行分析(Java自學(xué)網(wǎng)推薦),詳細(xì)闡述選型開源組件—ShardingJdbc時(shí)候的一些思考,并最終給讀者呈現(xiàn)業(yè)務(wù)系統(tǒng)集成ShardingJdbc的最終設(shè)計(jì)方案 。
另外,本文僅為使用開源組件ShardingJdbc第一篇幅,后續(xù)篇幅還將繼續(xù)介紹開源組件ShardingJdbc的一些其他進(jìn)階用法 。數(shù)據(jù)的切分方式一般,線上系統(tǒng)的業(yè)務(wù)量不是很大,比如說單庫(kù)的數(shù)據(jù)量在百萬級(jí)別以下,那么MySQL的單庫(kù)即可完成任何增/刪/改/查的業(yè)務(wù)操作 。隨著業(yè)務(wù)的發(fā)展,單個(gè)DB中保存的數(shù)據(jù)量(用戶、訂單、計(jì)費(fèi)明細(xì)和權(quán)限規(guī)則等數(shù)據(jù))呈現(xiàn)指數(shù)級(jí)增長(zhǎng),那么各種業(yè)務(wù)處理操作都會(huì)面臨單DB的IO讀寫瓶頸帶來的性能問題 。
垂直切分方案這時(shí)候,我們會(huì)考慮使用對(duì)之前的整個(gè)單DB采用垂直數(shù)據(jù)切分的方案,根據(jù)不同的業(yè)務(wù)類型劃分庫(kù)表,比如訂單相關(guān)若干表放在訂單庫(kù),用戶相關(guān)的表放在用戶庫(kù),賬務(wù)明細(xì)相關(guān)的表放在賬務(wù)庫(kù)等 。這樣就將數(shù)據(jù)分擔(dān)到了不同的庫(kù)上,達(dá)到專庫(kù)專用的效果 。使用垂直切分方案的主要優(yōu)點(diǎn)如下:a.拆分后業(yè)務(wù)清晰,符合微服務(wù)的總體設(shè)計(jì)理念;b.子系統(tǒng)之間的整合與擴(kuò)展相對(duì)容易;c.按照不同的業(yè)務(wù)類型,將不同的庫(kù)表放在不同的數(shù)據(jù)庫(kù)服務(wù)器上,便于管理;d.根據(jù)業(yè)務(wù)數(shù)據(jù)的“冷”、“熱”狀態(tài),采用不同的緩存和數(shù)據(jù)庫(kù)模式設(shè)計(jì)方案;垂直切分的缺點(diǎn)如下:a.跨庫(kù)的Join查詢,需要使用不同子系統(tǒng)的API接口讀取后在內(nèi)存中完成關(guān)聯(lián)查詢,提高系統(tǒng)復(fù)雜度;b.如果某一種類型的業(yè)務(wù)呈現(xiàn)爆發(fā)式地增長(zhǎng),該業(yè)務(wù)對(duì)應(yīng)的庫(kù)表還是會(huì)存在單DB的IO讀寫的瓶頸問題,從這一點(diǎn)來說垂直切分并未從根本解決單庫(kù)單表數(shù)據(jù)量過大的問題;c.存在跨庫(kù)事務(wù)的一致性問題,解決起來比較麻煩,當(dāng)然也可以采用分布式事務(wù)來解決;水平切分方案由于本文主題講的是利用開源組件ShardingJdbc進(jìn)行數(shù)據(jù)水平切分的實(shí)踐,因此對(duì)于垂直切分方案的一些細(xì)節(jié)問題就不做過多的詳細(xì)介紹了 。
與垂直切分對(duì)比,這里講的水平切分不是將庫(kù)表根據(jù)業(yè)務(wù)類型進(jìn)行分類存儲(chǔ),而是將其按照數(shù)據(jù)表中某個(gè)字段或某幾個(gè)字段的某種規(guī)則切分存儲(chǔ)至多個(gè)DB中,在每個(gè)庫(kù)每個(gè)表中所包含的只是其中的一部分?jǐn)?shù)據(jù),所有庫(kù)表加起來的才是全量的業(yè)務(wù)數(shù)據(jù) 。這種對(duì)數(shù)據(jù)的切分方式,基本可以保證經(jīng)過水平切分后的單庫(kù)單表存儲(chǔ)的容量不會(huì)太大,從而保證了對(duì)單表的增/刪/改/查的SQL執(zhí)行效率和處理能力 。
其中,數(shù)據(jù)的分片規(guī)則也是需要重點(diǎn)考慮的,因?yàn)樗鼤?huì)使得數(shù)據(jù)分片在多個(gè)庫(kù)表中是否均勻分布存儲(chǔ) 。然而,數(shù)據(jù)水平切分方案為業(yè)務(wù)系統(tǒng)帶來福音的同時(shí)也給系統(tǒng)構(gòu)建帶來了一些值得思考的問題 。使用水平切分方案的主要優(yōu)點(diǎn)如下:a.單庫(kù)單表的數(shù)據(jù)容量可以維持在一個(gè)量級(jí),有助于提高業(yè)務(wù)SQL的執(zhí)行效率和系統(tǒng)性能;b.不管是利用ShardingJdbc組件還是MyCat框架,業(yè)務(wù)系統(tǒng)的應(yīng)用層涉及改造得都較少,只需要根據(jù)實(shí)際的業(yè)務(wù)情況來設(shè)計(jì)數(shù)據(jù)分片的路由規(guī)則即可;c.可以提高業(yè)務(wù)系統(tǒng)的穩(wěn)定性和負(fù)載能力;使用水平切分方案的主要缺點(diǎn)如下:a.數(shù)據(jù)水平切分后,分布在多庫(kù)多表中,跨庫(kù)Join查詢比較復(fù)雜;b.分片數(shù)據(jù)的一致性較為難保證;c.對(duì)于歷史數(shù)據(jù)的遷移和數(shù)據(jù)庫(kù)的擴(kuò)容需要較大的維護(hù)工作量;選型ShardingJdbc組件的分析對(duì)于,“流水”/“明細(xì)”一類的業(yè)務(wù)數(shù)據(jù),通常的業(yè)務(wù)需求是準(zhǔn)實(shí)時(shí)或者說相對(duì)滯后,這些數(shù)據(jù)是按小時(shí)、按日和按月匯總加工處理后生成最終業(yè)務(wù)需求的數(shù)據(jù)(比如用戶賬單、報(bào)表和話單) 。

推薦閱讀