一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Mysql海量數(shù)據(jù)存儲(chǔ)和解決方案之一

 WindySky 2016-04-15

http://blog./uid-25979788-id-3270311.html


1)  分布式DB水平切分中用到的主要關(guān)鍵技術(shù):分庫(kù),分表,M-S,集群,負(fù)載均衡

2) 需求分析:一個(gè)大型互聯(lián)網(wǎng)應(yīng)用每天幾十億的PV對(duì)DB造成了相當(dāng)高的負(fù)載,對(duì)系統(tǒng)的穩(wěn)定性的擴(kuò)展性帶來(lái)極大挑戰(zhàn)。

3) 現(xiàn)有解決方式:通過(guò)數(shù)據(jù)切分提高網(wǎng)站性能,橫向擴(kuò)展數(shù)據(jù)層

      水平切分DB,有效降低了單臺(tái)機(jī)器的負(fù)載,也減小了宕機(jī)的可能性。

      集群方案:解決DB宕機(jī)帶來(lái)的單點(diǎn)DB不能訪問(wèn)問(wèn)題。

      讀寫分離策略:極大限度提高了應(yīng)用中Read數(shù)據(jù)的速度和并發(fā)量。

      典型例子:Taobao,Alibaba,Tencent,它們大都實(shí)現(xiàn)了自己的分布式數(shù)據(jù)訪問(wèn)層(DDAL)。Taobao的基于ibatisSpring的的分布式數(shù)據(jù)訪問(wèn)層,已有多年的應(yīng)用,運(yùn)行效率和生產(chǎn)實(shí)效性得到了開(kāi)發(fā)人員和用戶的肯定。

      水平切分需要考慮的后續(xù)問(wèn)題:分庫(kù)后路由規(guī)則的選擇和制定,以及后期擴(kuò)展。如,如何以最少的數(shù)據(jù)遷移達(dá)到最大容量的擴(kuò)展。因些路由表分規(guī)則以及負(fù)載均衡的考慮很重要。

 

4)對(duì)于DB切分,實(shí)質(zhì)上就是數(shù)據(jù)切分。下面從What, Why, How三個(gè)方面來(lái)講述。

What?什么是數(shù)據(jù)切分?

      

      具體將有什么樣的切分方式呢和路由方式呢?舉個(gè)簡(jiǎn)單的例子:我們針對(duì)一個(gè)Blog應(yīng)用中的日志來(lái)說(shuō)明,比如日志文章(article)表有如下字段:

article_id(int),title(varchar(128)),content(varchar(1024)),user_id(int)

    面對(duì)這樣的一個(gè)表,我們?cè)鯓忧蟹帜??怎樣將這樣的數(shù)據(jù)分布到不同的數(shù)據(jù)庫(kù)中的表中去呢?其實(shí)分析blog的應(yīng)用,我們不難得出這樣的結(jié)論:blog的應(yīng)用中,用戶分為兩種:瀏覽者和blog的主人。瀏覽者瀏覽某個(gè)blog,實(shí)際上是在一個(gè)特定的用戶的blog下進(jìn)行瀏覽的,而blog的主人管理自己的blog,也同樣是在特定的用戶blog下進(jìn)行操作的(在自己的空間下)。所謂的特定的用戶,用數(shù)據(jù)庫(kù)的字段表示就是“user_id”。就是這個(gè)“user_id”,它就是我們需要的分庫(kù)的依據(jù)和規(guī)則的基礎(chǔ)。我們可以這樣做,將user_id110000的所有的文章信息放入DB1中的article表中,將user_id1000120000的所有文章信息放入DB2中的article表中,以此類推,一直到DBn。這樣一來(lái),文章數(shù)據(jù)就很自然的被分到了各個(gè)數(shù)據(jù)庫(kù)中,達(dá)到了數(shù)據(jù)切分的目的。接下來(lái)要解決的問(wèn)題就是怎樣找到具體的數(shù)據(jù)庫(kù)呢?其實(shí)問(wèn)題也是簡(jiǎn)單明顯的,既然分庫(kù)的時(shí)候我們用到了區(qū)分字段user_id,那么很自然,數(shù)據(jù)庫(kù)路由的過(guò)程當(dāng)然還是少不了user_id的??紤]一下我們剛才呈現(xiàn)的blog應(yīng)用,不管是訪問(wèn)別人的blog還是管理自己的blog,總之我都要知道這個(gè)blog的用戶是誰(shuí)吧,也就是我們知道了這個(gè)bloguser_id,就利用這個(gè)user_id,利用分庫(kù)時(shí)候的規(guī)則,反過(guò)來(lái)定位具體的數(shù)據(jù)庫(kù),比如user_id234,利用該才的規(guī)則,就應(yīng)該定位到DB1,假如user_id12343,利用該才的規(guī)則,就應(yīng)該定位到DB2。以此類推,利用分庫(kù)的規(guī)則,反向的路由到具體的DB,這個(gè)過(guò)程我們稱之為“DB路由”。

    當(dāng)然考慮到數(shù)據(jù)切分的DB設(shè)計(jì)必然是非常規(guī),不正統(tǒng)的DB設(shè)計(jì)。那么什么樣的DB設(shè)計(jì)是正統(tǒng)的DB設(shè)計(jì)呢?

    我們平常規(guī)規(guī)矩矩用的基本都是。平常我們會(huì)自覺(jué)的按照范式來(lái)設(shè)計(jì)我們的數(shù)據(jù)庫(kù),負(fù)載高點(diǎn)可能考慮使用相關(guān)的Replication機(jī)制來(lái)提高讀寫的吞吐和性能,這可能已經(jīng)可以滿足很多需求,但這套機(jī)制自身的缺陷還是比較顯而易見(jiàn)的。上面提到的“自覺(jué)的按照范式設(shè)計(jì)”??紤]到數(shù)據(jù)切分的DB設(shè)計(jì),將違背這個(gè)通常的規(guī)矩和約束,為了切分,我們不得不在數(shù)據(jù)庫(kù)的表中出現(xiàn)冗余字段,用作區(qū)分字段或者叫做分庫(kù)的標(biāo)記字段,比如上面的article的例子中的user_id這樣的字段(當(dāng)然,剛才的例子并沒(méi)有很好的體現(xiàn)出user_id的冗余性,因?yàn)?/span>user_id這個(gè)字段即使就是不分庫(kù),也是要出現(xiàn)的,算是我們撿了便宜吧)。當(dāng)然冗余字段的出現(xiàn)并不只是在分庫(kù)的場(chǎng)景下才出現(xiàn)的,在很多大型應(yīng)用中,冗余也是必須的,這個(gè)涉及到高效DB的設(shè)計(jì)。

      

Why?為什么要切分?jǐn)?shù)據(jù)?

1)      Oracle這樣成熟穩(wěn)定的DB可以支撐海量數(shù)據(jù)的存儲(chǔ)和查詢,但是價(jià)格不是所有人都承受得起。

2)      負(fù)載高點(diǎn)時(shí),Master-Slaver模式中存在瓶頸?,F(xiàn)有技術(shù)中,在負(fù)載高點(diǎn)時(shí)使用相關(guān)的Replication機(jī)制來(lái)實(shí)現(xiàn)相關(guān)的讀寫的吞吐性能。這種機(jī)制存在兩個(gè)瓶頸:一是有效性依賴于讀操作的比例,這里Master往往會(huì)成為瓶頸所在,寫操作時(shí)需要一個(gè)順序隊(duì)列來(lái)執(zhí)行,過(guò)載時(shí)Master會(huì)承受不住,Slaver的數(shù)據(jù)同步延遲也會(huì)很大,同時(shí)還會(huì)消耗CPU的計(jì)算能力,為write操作在Master上執(zhí)行以后還是需要在每臺(tái)slave機(jī)器上都跑一次。而Sharding可以輕松的將計(jì)算,存儲(chǔ),I/O并行分發(fā)到多臺(tái)機(jī)器上,這樣可以充分利用多臺(tái)機(jī)器各種處理能力,同時(shí)可以避免單點(diǎn)失敗,提供系統(tǒng)的可用性,進(jìn)行很好的錯(cuò)誤隔離。

3)      用免費(fèi)的MySQL和廉價(jià)的Server甚至是PC做集群,達(dá)到小型機(jī)+大型商業(yè)DB的效果,減少大量的資金投入,降低運(yùn)營(yíng)成本,何樂(lè)而不為呢?

 

How?如何切分?jǐn)?shù)據(jù)?

    先對(duì)數(shù)據(jù)切分的方法和形式進(jìn)行比較詳細(xì)的闡述和說(shuō)明。

    數(shù)據(jù)切分可以是物理上的,對(duì)數(shù)據(jù)通過(guò)一系列的切分規(guī)則將數(shù)據(jù)分布到不同的DB服務(wù)器上,通過(guò)路由規(guī)則路由訪問(wèn)特定的數(shù)據(jù)庫(kù),這樣一來(lái)每次訪問(wèn)面對(duì)的就不是單臺(tái)服務(wù)器了,而是N臺(tái)服務(wù)器,這樣就可以降低單臺(tái)機(jī)器的負(fù)載壓力。

    數(shù)據(jù)切分也可以是數(shù)據(jù)庫(kù)內(nèi)的,對(duì)數(shù)據(jù)通過(guò)一系列的切分規(guī)則,將數(shù)據(jù)分布到一個(gè)數(shù)據(jù)庫(kù)的不同表中,比如將article分為article_001,article_002等子表,若干個(gè)子表水平拼合有組成了邏輯上一個(gè)完整的article表,這樣做的目的其實(shí)也是很簡(jiǎn)單的。舉個(gè)例子說(shuō)明,比如article表中現(xiàn)在有5000w條數(shù)據(jù),此時(shí)我們需要在這個(gè)表中增加(insert)一條新的數(shù)據(jù),insert完畢后,數(shù)據(jù)庫(kù)會(huì)針對(duì)這張表重新建立索引,5000w行數(shù)據(jù)建立索引的系統(tǒng)開(kāi)銷還是不容忽視的。但是反過(guò)來(lái),假如我們將這個(gè)表分成100個(gè)table呢,從article_001一直到article_100,5000w行數(shù)據(jù)平均下來(lái),每個(gè)子表里邊就只有50萬(wàn)行數(shù)據(jù),這時(shí)候我們向一張只有50w行數(shù)據(jù)的tableinsert數(shù)據(jù)后建立索引的時(shí)間就會(huì)呈數(shù)量級(jí)的下降,極大了提高了DB的運(yùn)行時(shí)效率,提高了DB的并發(fā)量。當(dāng)然分表的好處還不知這些,還有諸如寫操作的鎖操作等,都會(huì)帶來(lái)很多顯然的好處。

    綜上,分庫(kù)降低了單點(diǎn)機(jī)器的負(fù)載;分表,提高了數(shù)據(jù)操作的效率,尤其是Write操作的效率。

    上文中提到,要想做到數(shù)據(jù)的水平切分,在每一個(gè)表中都要有相冗余字符作為切分依據(jù)和標(biāo)記字段,通常的應(yīng)用中我們選用user_id作為區(qū)分字段,基于此就有如下三種分庫(kù)的方式和規(guī)則:(當(dāng)然還可以有其他的方式)

按號(hào)段分:

(1)    user_id為區(qū)分,11000的對(duì)應(yīng)DB1,10012000的對(duì)應(yīng)DB2,以此類推;

優(yōu)點(diǎn):可部分遷移

缺點(diǎn):數(shù)據(jù)分布不均

(2)    hash取模分:

對(duì)user_id進(jìn)行hash(或者如果user_id是數(shù)值型的話直接使用user_id的值也可),然后用一個(gè)特定的數(shù)字,比如應(yīng)用中需要將一個(gè)數(shù)據(jù)庫(kù)切分成4個(gè)數(shù)據(jù)庫(kù)的話,我們就用4這個(gè)數(shù)字對(duì)user_idhash值進(jìn)行取模運(yùn)算,也就是user_id%4,這樣的話每次運(yùn)算就有四種可能:結(jié)果為1的時(shí)候?qū)?yīng)DB1;結(jié)果為2的時(shí)候?qū)?yīng)DB2;結(jié)果為3的時(shí)候?qū)?yīng)DB3;結(jié)果為0的時(shí)候?qū)?yīng)DB4,這樣一來(lái)就非常均勻的將數(shù)據(jù)分配到4個(gè)DB中。

優(yōu)點(diǎn):數(shù)據(jù)分布均勻

缺點(diǎn):數(shù)據(jù)遷移的時(shí)候麻煩,不能按照機(jī)器性能分?jǐn)倲?shù)據(jù)

(3)    在認(rèn)證庫(kù)中保存數(shù)據(jù)庫(kù)配置

就是建立一個(gè)DB,這個(gè)DB單獨(dú)保存user_idDB的映射關(guān)系,每次訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候都要先查詢一次這個(gè)數(shù)據(jù)庫(kù),以得到具體的DB信息,然后才能進(jìn)行我們需要的查詢操作。

優(yōu)點(diǎn):靈活性強(qiáng),一對(duì)一關(guān)系

缺點(diǎn):每次查詢之前都要多一次查詢,性能大打折扣

以上就是通常的開(kāi)發(fā)中我們選擇的三種方式,有些復(fù)雜的項(xiàng)目中可能會(huì)混合使用這三種

方式。

 

4)      接下來(lái)對(duì)分布式數(shù)據(jù)庫(kù)解決海量數(shù)據(jù)的存訪問(wèn)題做進(jìn)一步介紹

分布式數(shù)據(jù)方案提供功能如下:

1)提供分庫(kù)規(guī)則和路由規(guī)則(RouteRule簡(jiǎn)稱RR),將上面的說(shuō)明中提到的三中切分規(guī)則直接內(nèi)嵌入本系統(tǒng),具體的嵌入方式在接下來(lái)的內(nèi)容中進(jìn)行詳細(xì)的說(shuō)明和論述;

2)引入集群(Group)的概念,解決容錯(cuò)性的問(wèn)題,保證數(shù)據(jù)的高可用性;

3)引入負(fù)載均衡策略(LoadBalancePolicy簡(jiǎn)稱LB);

4)引入集群節(jié)點(diǎn)可用性探測(cè)機(jī)制,對(duì)單點(diǎn)機(jī)器的可用性進(jìn)行定時(shí)的偵測(cè),以保證LB策略的正確實(shí)施,以確保系統(tǒng)的高度穩(wěn)定性;

5)引入讀/寫分離,提高數(shù)據(jù)的查詢速度;


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产精品久久香蕉国产线| 国产又黄又爽又粗视频在线| 日韩国产欧美中文字幕| 91免费精品国自产拍偷拍| 国产精品视频久久一区| 91欧美一区二区三区| 亚洲一区二区三区四区| 国产精品亚洲二区三区| 欧美精品在线观看国产| 91在线国内在线中文字幕| 色欧美一区二区三区在线| 国产真人无遮挡免费视频一区| 99国产精品国产精品九九| 黄片三级免费在线观看| 邻居人妻人公侵犯人妻视频| 国产剧情欧美日韩中文在线| 欧洲一区二区三区蜜桃| 国产精品视频第一第二区| 国产人妻精品区一区二区三区| 日韩精品一区二区三区射精| 亚洲婷婷开心色四房播播| 日韩女优视频国产一区| 91日韩欧美国产视频| 日本最新不卡免费一区二区| 大香蕉再在线大香蕉再在线| 东京干男人都知道的天堂| 国产精品午夜福利在线观看| 中文文精品字幕一区二区| 欧美成人一区二区三区在线 | 日本东京热视频一区二区三区| 日韩欧美黄色一级视频| 麻豆视传媒短视频免费观看| 亚洲精品偷拍视频免费观看| 日本欧美视频在线观看免费| 亚洲国产精品国自产拍社区| 偷拍洗澡一区二区三区| 亚洲国产日韩欧美三级| 又黄又硬又爽又色的视频| 美女被后入视频在线观看| 日韩精品小视频在线观看| 午夜福利直播在线视频|