一年多一直在使用mongodb臣淤,基本上從對(duì)mongodb不懂的小白,到現(xiàn)在操作mongodb無任何壓力窃爷,最近的一個(gè)項(xiàng)目在做mongodb副本集的管理邑蒋,三組機(jī)器做一個(gè)副本集,大概要管幾十臺(tái)上百臺(tái)副本集按厘,主要用來自動(dòng)化發(fā)布医吊,構(gòu)建副本集(我們的mongo副本集部署在docker中),所以在寫各種mongo shell的代碼實(shí)現(xiàn)逮京,說白了就是調(diào)用mongo的commands卿堂。看到這個(gè)問題特來回答一下懒棉。
mongodb眾所周知不支持事務(wù)草描,所以需要強(qiáng)事務(wù)的業(yè)務(wù)根本不能考慮mongodb。
mongodb的優(yōu)勢就是文檔存儲(chǔ):
1. 業(yè)務(wù)經(jīng)常變動(dòng)策严,需要不時(shí)的添加字段陶珠,那么mongodb比較適合,關(guān)系型數(shù)據(jù)庫添加字段的復(fù)雜度也還好
2. 嵌套文檔享钞,業(yè)務(wù)數(shù)據(jù)比較復(fù)雜揍诽,適合嵌套文檔式存儲(chǔ),那么mongodb非常合適栗竖,這個(gè)關(guān)系型數(shù)據(jù)庫比較難搞暑脆,雖然MySQL和pg也有文檔存儲(chǔ),但MySQL的不成熟狐肢,pg畢竟現(xiàn)在生產(chǎn)中使用還是偏少添吗,個(gè)人也不了解,這里不談份名。但這不僅僅這一點(diǎn)優(yōu)勢碟联,具體下面會(huì)細(xì)說。
3. upsert支持僵腺,查詢速度也不慢
4. 高可用的副本集支持
5. 查詢語法非常豐富鲤孵,嵌套文檔查詢功能非常強(qiáng)大,不是重度用戶可能不能理解
下面說說一個(gè)具體的使用事例:
項(xiàng)目的一條數(shù)據(jù)在10kb左右辰如,如果使用關(guān)系型數(shù)據(jù)庫那么需要將這條數(shù)據(jù)拆分成大概幾百條左右普监,建造多個(gè)表,設(shè)計(jì)較復(fù)雜,這種數(shù)據(jù)大概在一百萬條左右凯正,想想拆分后在十幾億的數(shù)據(jù)量就可怕毙玻。打平后的數(shù)據(jù)什么DB也都可以拿下,只是一百萬變十幾億比較恐怖而已廊散。
如果采用MySQL存儲(chǔ)桑滩,每次查詢需要使用外鍵查詢多個(gè)表,從這些表中拉取數(shù)據(jù)允睹,性能肯定要下降很多运准,比不上只在一個(gè)表查詢,而且只拉取少兩個(gè)數(shù)量級(jí)的數(shù)據(jù)擂找。查詢也還好,業(yè)務(wù)允許可以對(duì)結(jié)果做緩存浩销,放到redis里去贯涎。
但是重點(diǎn)來了,需求要增量更新部分?jǐn)?shù)據(jù)慢洋,這時(shí)候需要更新多個(gè)表塘雳,根本沒法做到原子性(注意事務(wù)不是原子操作),當(dāng)然也可以使用cas等技術(shù)補(bǔ)償普筹,達(dá)到最終一致性败明。但使用mongodb存儲(chǔ)只需要update一條數(shù)據(jù),對(duì)相應(yīng)的嵌套文檔中內(nèi)容更新太防,可以做到原子性妻顶,是不是很方便?
具體說說該項(xiàng)目的難點(diǎn)蜒车,查詢無法使用緩存讳嘱,可能會(huì)很吃驚,但是業(yè)務(wù)決定了確實(shí)做不了酿愧,而且增量更新的量達(dá)到上萬的QPS沥潭,如果不能保證原子性想想多么可怕!
所以mongodb在這里幫了大忙嬉挡,關(guān)系型數(shù)據(jù)庫解決不了這個(gè)難題钝鸽。
有人可能要問,mongodb沒有事務(wù)庞钢,上游數(shù)據(jù)寫入也會(huì)有問題拔恰,你不可能所有數(shù)據(jù)都存一個(gè)表吧?
當(dāng)然不是的基括,我們mongodb里的數(shù)據(jù)是從MySQL中清洗出來存到mongodb中的仁连,mongodb只做單點(diǎn)的業(yè)務(wù)需求,綜合的數(shù)據(jù)還是在MySQL中。
此項(xiàng)目我們用了上百個(gè)副本集饭冬,保證系統(tǒng)的高可用使鹅,這些副本集配置只要一條shell就搞定,如果用MySQL的主從不知道怎么配(我自己不懂)昌抠,估計(jì)DBA得忙死患朱,而該項(xiàng)目完全不需要也沒用到DBA。
說了這么多mongo的優(yōu)點(diǎn)炊苫,也說說他的缺點(diǎn):
1. 查詢優(yōu)化器和MySQL沒法比
2. 不支持reload裁厅,只能冷重啟,初始化配置的時(shí)候比較麻煩
3. 沒有事務(wù)侨艾,不敢存儲(chǔ)第一手?jǐn)?shù)據(jù)执虹,多用來做備份數(shù)據(jù)的存儲(chǔ)
mongodb可以做很多事情,取決于你腦洞唠梨,性能不差袋励,存一些相對(duì)不重要的數(shù)據(jù),mongodb嵌套文檔功能強(qiáng)大当叭,多看看官方文檔挖掘挖掘有用信息茬故,每次都能發(fā)現(xiàn)驚喜。
希望對(duì)你有用蚁鳖!