Mongodb面試題
Mongodb是什么鳖藕?
Mongodb是一個文檔數(shù)據(jù)庫,提供好的性能只锭,領(lǐng)先的非關(guān)系型數(shù)據(jù)著恩。采用BSON存儲文檔數(shù)據(jù)。
BSON()是一種類json的一種二進(jìn)制形式的存儲格式纹烹。
為什么使用Mongodb页滚?
1.快速:擁有適量級內(nèi)存的Mongodb的性能非常迅速,他將數(shù)據(jù)存儲在物理內(nèi)存中铺呵,使得熱數(shù)據(jù)的讀寫變的十分快速,從而提高了整體的速度與效率隧熙。
2.高擴(kuò)展性:Mongodb的高可用與集群架構(gòu)擁有十分高的擴(kuò)展性片挂,通過物理機(jī)器的增加,以及sharding的增加贞盯,Mongodb的擴(kuò)展將達(dá)到一個十分驚人的地步音念。
3.自身的failover機(jī)制!Mongodb的副本集配置中躏敢,當(dāng)主庫遇到問題闷愤,無法繼續(xù)提供服務(wù)的時候,副本集將選舉出一個新的主庫來繼續(xù)提供服務(wù)件余。
4.json的存儲格式讥脐!Mongodb的json與bson存儲格式十分適合文檔格式的存儲與查詢遭居。
Mongodb適合哪些場景?
游戲場景:使用Mongodb存儲游戲用戶信息旬渠,用戶的裝備俱萍,機(jī)分等直接以內(nèi)嵌文檔的形式存儲,方便查詢和更新告丢。
物流場景:使用Mongodb存儲訂單信息枪蘑,訂單狀態(tài)在運送過程中會不斷更新,以Mongodb內(nèi)嵌數(shù)組的形式存儲岖免,一次查找就能把訂單所有的變更讀取出來岳颇。
社交場景:使用Mongodb存儲用戶信息,以及用戶發(fā)表的朋友圈信息颅湘,通過地理位置索引實現(xiàn)附近的人话侧,地點等功能。
- 你說的NoSQL數(shù)據(jù)庫是什么意思?NoSQL與RDBMS直接有什么區(qū)別?為什么要使用和不使用NoSQL數(shù)據(jù)庫?說一說NoSQL數(shù)據(jù)庫的幾個優(yōu)點?**
nosql是非關(guān)系型數(shù)據(jù)庫栅炒,nosql=not only sql
關(guān)系型數(shù)據(jù)庫采用結(jié)構(gòu)化的數(shù)據(jù)掂摔,nosql采用的是鍵值對的方式存儲數(shù)據(jù)。
在處理非結(jié)構(gòu)化/半結(jié)構(gòu)化的數(shù)據(jù)赢赊,在水平方向上進(jìn)行擴(kuò)展時乙漓,隨時應(yīng)對動態(tài)增加的數(shù)據(jù)項時可以優(yōu)先考慮使用nosql數(shù)據(jù)庫。
在考慮數(shù)據(jù)庫的成熟度释移,支持叭披,分析和商業(yè)智能,管理及專業(yè)性等問題時玩讳,應(yīng)優(yōu)先考慮關(guān)系型數(shù)據(jù)庫涩蜘。
2.名字空間(namespace)是什么?
Mongodb存儲BSON對象在從集(collection)中熏纯。數(shù)據(jù)庫名字和從集名字以句點聯(lián)結(jié)起來叫做名字空間同诫。
Mongodb中的分片是什么意思?
分片是數(shù)據(jù)水平切分到不同的物理節(jié)點樟澜,當(dāng)應(yīng)用數(shù)據(jù)越來越大的時候误窖,數(shù)據(jù)量也會越來越大,當(dāng)數(shù)據(jù)量增長時秩贰,單臺機(jī)器可能無法存儲數(shù)據(jù)或可接受的讀取寫入吞吐量霹俺,利用分片技術(shù)可以添加更多的機(jī)器來應(yīng)對數(shù)據(jù)量整漲。以及讀寫操作的要求毒费。
3.允許空值null嗎?
對于對象用戶而言丙唧,可以添加,但是觅玻,用戶不能添加空值到數(shù)據(jù)庫從集想际,因為空值不是對象培漏,然而用戶能夠添加空對象{}。
4.更新操作fsync到磁盤沼琉?
不會北苟,磁盤寫操作默認(rèn)是延遲執(zhí)行的,寫操作可能在量三秒后到達(dá)磁盤打瘪,例如友鼻,如果一秒內(nèi)數(shù)據(jù)庫收到一千個對一個對象遞增的操作,僅刷新磁盤一次闺骚。
5.如何執(zhí)行事務(wù)/加鎖彩扔?
Mongodb沒有使用傳統(tǒng)的鎖或者復(fù)雜的帶回滾的事務(wù),因為他設(shè)計的宗旨是輕量級僻爽,快速以及可預(yù)計的高性能虫碉,可能把它類比成mysql myisam的自動提交模式,通過精簡對事務(wù)的支持胸梆,性能得到了提升敦捧,特別是在一個可能會穿過多個服務(wù)器的系統(tǒng)里。
6.啟動備份故障恢復(fù)需要多久碰镜?
從備份數(shù)據(jù)庫聲明主數(shù)據(jù)庫宕機(jī)到選出一個備份數(shù)據(jù)庫作為新的主數(shù)據(jù)庫將花費10秒到30秒時間兢卵,這期間在數(shù)據(jù)庫主庫上的操作將會失敗--包括寫入和強(qiáng)一致性讀取操作。然而绪颖,你還能在第二數(shù)據(jù)庫上執(zhí)行最終一致性查詢秽荤,即使在這段時間里。
7.什么是master
它是當(dāng)前備份集群(replica set)中負(fù)責(zé)處理所有寫入操作的主要節(jié)點/成員.在一個備份集群中,當(dāng)失效備援(failover)事件發(fā)生時,一個另外的成員會變成primary.
mongodb是否支持事務(wù)
MongoDB 4.0的新特性——事務(wù)(Transactions):MongoDB 是不支持事務(wù)的柠横,因此開發(fā)者在需要用到事務(wù)的時候窃款,不得不借用其他工具,在業(yè)務(wù)代碼層面去彌補(bǔ)數(shù)據(jù)庫的不足牍氛。
事務(wù)和會話(Sessions)關(guān)聯(lián)晨继,一個會話同一時刻只能開啟一個事務(wù)操作,當(dāng)一個會話斷開搬俊,這個會話中的事務(wù)也會結(jié)束踱稍。primary?
他指的是當(dāng)前備份集群(replica set)中負(fù)責(zé)處理所有寫操作的主要節(jié)點/成員。在一個備份級群中悠抹,當(dāng)失效備援事件發(fā)生是,另一個成員會變成primary.
8 我應(yīng)該啟動一個集群分片(sharded)還是一個非集群分片的 Mongodb 環(huán)境?
數(shù)據(jù)量大用集群分片扩淀,數(shù)據(jù)量小用非集群楔敌。
為開發(fā)便捷起見,我們建議以非集群分片(unsharded)方式開始一個Mongodb環(huán)境驻谆,除非一臺服務(wù)器不足以存放你的初始數(shù)據(jù)集卵凑,從非集群分片升級到集群分片是無縫的庆聘,所以在你的數(shù)據(jù)集部署很大的時候沒必要考慮集群分片。
9.數(shù)據(jù)在什么時候才會擴(kuò)展到多個分片里勺卢?
Mongodb分片是基于區(qū)域的伙判,所以一個集合中的所有的對象都被存放在一個塊中,只有當(dāng)存在多余一個塊的時候黑忱,才會有多個分片獲取數(shù)據(jù)的選項宴抚,現(xiàn)在每個默認(rèn)塊的大小是64mb,所以至少64mb的空間才可以實施一個遷移甫煞。
10當(dāng)我試圖更新一個正在被遷移的塊(chunk)上的文檔時會發(fā)生什么?
更新操作會立即發(fā)生在舊的分片上菇曲,然后更改才會在所有全轉(zhuǎn)移前復(fù)制到新的分片中。
如果在一個分片(shard)停止或者很慢的時候,我發(fā)起一個查詢會怎樣?
如果一個分片停止了抚吠,除非查詢設(shè)置了“partial”選項常潮,否則查詢會返回一個錯誤,如果一個分片響應(yīng)很慢楷力,Mongodb則會等待他的響應(yīng)喊式。
可以把movechunk目錄里的舊文件刪除嗎?
沒問題,這些文件是在分片(shard)進(jìn)行均衡操作(balancing)的時候產(chǎn)生的臨時文件.一旦這些操作已經(jīng)完成,相關(guān)的臨時文件也應(yīng)該被刪除掉.但目前清理工作是需要手動的,所以請小心地考慮再釋放這些文件的空間.
48 如果塊移動操作(movechunk)失敗了,我需要手動清除部分轉(zhuǎn)移的文檔嗎?
不需要,移動操作是一致(consistent)并且是確定性的(deterministic);一次失敗后,移動操作會不斷重試;當(dāng)完成后,數(shù)據(jù)只會出現(xiàn)在新的分片里(shard).
49 Mongodb是否支持事務(wù)
MongoDB 4.0的新特性——事務(wù)(Transactions):MongoDB 是不支持事務(wù)的,因此開發(fā)者在需要用到事務(wù)的時候萧朝,不得不借用其他工具岔留,在業(yè)務(wù)代碼層面去彌補(bǔ)數(shù)據(jù)庫的不足。
事務(wù)和會話(Sessions)關(guān)聯(lián)剪勿,一個會話同一時刻只能開啟一個事務(wù)操作贸诚,當(dāng)一個會話斷開,這個會話中的事務(wù)也會結(jié)束厕吉。