auto-sharding 無(wú)用論:auto-sharding vs. manual-sharding
auto-sharding一直是MongoDB的一項(xiàng)引以為豪的特性,而這一回它可以會(huì)像我們國(guó)內(nèi)的某些磚家叫獸一樣,成了理論的巨人,實(shí)踐的侏儒。下面一篇文章從各個(gè)方面對(duì)auto-shrading的可用性進(jìn)行了批駁。希望能引發(fā)你一些新的思考。
原文鏈接:auto-sharding 無(wú)用論:auto-sharding vs. manual-sharding
一、美好的藍(lán)圖
剛接觸MongoDB的時(shí)候,看到它的auto-sharding功能圖,配合上replica sets簡(jiǎn)直有一種一統(tǒng)世界的感覺。既下圖:
圖中路由機(jī)mongos可以有多臺(tái),config機(jī)器可以多臺(tái)配置成主從或者replica sets,sharding的每個(gè)結(jié)點(diǎn)是三臺(tái)mongod組成的replica sets。高可用性,無(wú)限擴(kuò)展性盡在眼前。看似宏偉壯觀。
然而當(dāng)我真的打算要用auto-sharding功能的時(shí)候,才發(fā)現(xiàn)此設(shè)計(jì)根本不適用,下面談一點(diǎn)我個(gè)人的看法。
Sharding一詞的翻譯是分片,在這里的意思是將數(shù)據(jù)進(jìn)行水平切分。最簡(jiǎn)單的例子就是我們?cè)跀?shù)據(jù)庫(kù)設(shè)計(jì)中的分庫(kù)分表,在Memcached緩存中的多結(jié)點(diǎn)hash存儲(chǔ)。而MongoDB的auto-sharding功能重在一個(gè)auto(自動(dòng)化分片)。官方稱,使用這一功能,你只需要指定數(shù)據(jù)分片依賴的某個(gè)字段值,既可在不關(guān)心具體結(jié)點(diǎn)數(shù)量的情況下存儲(chǔ)你的數(shù)據(jù),數(shù)據(jù)會(huì)自動(dòng)平均分配到后端結(jié)點(diǎn),在增加結(jié)點(diǎn)時(shí),數(shù)據(jù)又會(huì)自動(dòng)的進(jìn)行遷移,對(duì)整個(gè)系統(tǒng)進(jìn)行負(fù)載平衡。相比我們傳統(tǒng)的分庫(kù)分表,它是auto(自動(dòng))的,而傳統(tǒng)方法是manual(手動(dòng))的。
二、Foursquare宕機(jī)事件
看罷上面的描述,好像沒有任何可以挑剔的理由,但事實(shí)并不如描繪的那樣美好,從Foursquare長(zhǎng)達(dá)11小時(shí)的宕機(jī)事件分析中,我們可以看到如下一些問(wèn)題:
auto-sharding算法導(dǎo)致數(shù)據(jù)分配不均:事實(shí)上數(shù)據(jù)并不會(huì)那么平均的在各個(gè)機(jī)器間平均分配,由此而造成的短板效應(yīng)是無(wú)法忍受的。
數(shù)據(jù)遷移代價(jià)過(guò)大:在增加新的sharding結(jié)點(diǎn)時(shí),數(shù)據(jù)確實(shí)會(huì)自動(dòng)的進(jìn)行遷移,而這種遷移對(duì)于原來(lái)線上服務(wù)的結(jié)點(diǎn),服務(wù)上是有影響的。所以我們最好在存儲(chǔ)瓶頸到來(lái)很早之前就開始做這個(gè)遷移,而這樣做,和我們手動(dòng)進(jìn)行分片,預(yù)先估算好數(shù)據(jù)量相比,優(yōu)勢(shì)不再明顯。
數(shù)據(jù)遷移造成碎片:同樣是Foursquare的失敗經(jīng)驗(yàn),在數(shù)據(jù)遷移時(shí),我們需要遷移的數(shù)據(jù)通常并不會(huì)在磁盤上進(jìn)行連續(xù)存儲(chǔ)(除非你的hash條件是天然的insert時(shí)間戳)。而我們又知道MongoDB采用的是磁盤空間預(yù)分配的機(jī)制,于是在數(shù)據(jù)遷移時(shí),可能并不會(huì)減小磁盤占用空間,反而會(huì)使得磁盤碎片化。更甚的是由于MongoDB在是采用mmap提速數(shù)據(jù)訪問(wèn),磁盤空洞并不會(huì)減小mmap的大小,反而導(dǎo)致內(nèi)存也碎片化。
而以上一些問(wèn)題,在我們預(yù)先規(guī)劃好存儲(chǔ)量的manual-sharding上,是不存在的。
三、冷數(shù)據(jù)不冷
我認(rèn)為在存儲(chǔ)規(guī)劃上,可以簡(jiǎn)單的從兩方面來(lái)評(píng)估,一是磁盤占用,也就是總數(shù)據(jù)量,二是內(nèi)存占用,也就是熱數(shù)據(jù)量。熱數(shù)據(jù)在全部數(shù)據(jù)的中所占的比例,通常會(huì)越來(lái)越小。造成這一原因的是老數(shù)據(jù)的訪問(wèn)量下降。我們考慮這樣一種情況,如果你的應(yīng)用用戶量和每日新增數(shù)據(jù)量已經(jīng)相當(dāng)穩(wěn)定,我們以最近三天的數(shù)據(jù)為熱數(shù)據(jù)進(jìn)行評(píng)估,那么總數(shù)據(jù)量會(huì)隨著時(shí)間的增長(zhǎng)而增長(zhǎng),而熱數(shù)據(jù)量永遠(yuǎn)是三天的量。我們這里舉的是一個(gè)極端的例子,可能你的用戶量會(huì)每天增長(zhǎng),但是熱數(shù)據(jù)量在全部數(shù)據(jù)中占的比例,通常是越來(lái)越少的,這個(gè)事實(shí)不容反駁。
上面說(shuō)了這么多,下面我們來(lái)看我們的問(wèn)題。
auto-sharding數(shù)據(jù)量變化情況:和我們上面說(shuō)的情況一樣,auto-sharding機(jī)群會(huì)通過(guò)增加結(jié)點(diǎn)數(shù)來(lái)擴(kuò)展集群的存儲(chǔ)能力。結(jié)點(diǎn)數(shù)和數(shù)據(jù)量成線性的正比關(guān)系。
auto-sharding的熱數(shù)據(jù)比例:auto-sharding一旦一個(gè)結(jié)點(diǎn)配置完成,那么這些機(jī)器的內(nèi)存與磁盤空間比就定了。于是整個(gè)集群的熱數(shù)據(jù)比例占所有數(shù)據(jù)的比例也是一定的。
而對(duì)比我們上面的說(shuō)法,熱數(shù)據(jù)占比例在所有數(shù)據(jù)中是會(huì)越來(lái)越小的。于是我們可以認(rèn)為,auto-sharding中的老結(jié)點(diǎn)浪費(fèi)掉了大量的內(nèi)存和CPU資源。
而如果我們是人為手動(dòng)進(jìn)行分片,我們完全可以自己控制數(shù)據(jù)的存儲(chǔ),自行設(shè)定自己的LRU或者TTL機(jī)制,將老數(shù)據(jù),冷數(shù)據(jù)進(jìn)行存儲(chǔ)轉(zhuǎn)移,不再占用高性能機(jī)器的各項(xiàng)機(jī)能。從而讓我們公司花大錢買來(lái)的機(jī)器能夠物盡其用。
好了,就說(shuō)這一些,理解不一定正確,歡迎探討,拍磚。
|