MongoDB是基于分布式文件存儲(chǔ)的數(shù)據(jù)庫,由C++語言編寫。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案,且MongodDB是一個(gè)介于關(guān)系數(shù)據(jù)庫與非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系型數(shù)據(jù)庫中功能最豐富,最像關(guān)系數(shù)據(jù)庫。
由于MongoDB的特性以及功能,使得其在企業(yè)使用頻率很大,所以很多面試都會(huì)MongoDB的相關(guān)知識,基于網(wǎng)上以及自己閱讀官網(wǎng)文檔總結(jié)2019-2020年MongoDB的面試題。具體如下:
? 1Q:MongoDB的優(yōu)勢有哪些?
面向集合(
Collection)和文檔(document)的存儲(chǔ),以JSON格式的文檔保存數(shù)據(jù)。高性能,支持
Document中嵌入Document減少了數(shù)據(jù)庫系統(tǒng)上的I/O操作以及具有完整的索引支持,支持快速查詢高效的傳統(tǒng)存儲(chǔ)方式:支持二進(jìn)制數(shù)據(jù)及大型對象
高可用性,數(shù)據(jù)復(fù)制集,MongoDB 數(shù)據(jù)庫支持服務(wù)器之間的數(shù)據(jù)復(fù)制來提供自動(dòng)故障轉(zhuǎn)移(
automatic failover)高可擴(kuò)展性,分片(
sharding)將數(shù)據(jù)分布在多個(gè)數(shù)據(jù)中心,MongoDB支持基于分片鍵創(chuàng)建數(shù)據(jù)區(qū)域.豐富的查詢功能, 聚合管道(
Aggregation Pipeline)、全文搜索(Text Search)以及地理空間查詢(Geospatial Queries)支持多個(gè)存儲(chǔ)引擎,WiredTiger存儲(chǔ)引、In-Memory存儲(chǔ)引擎
? 2Q:MongoDB 支持哪些數(shù)據(jù)類型?
java類似數(shù)據(jù)類型:
| 類型 | 解析 |
|---|---|
String |
字符串。存儲(chǔ)數(shù)據(jù)常用的數(shù)據(jù)類型。在 MongoDB 中,UTF-8 編碼的字符串才是合法的 |
Integer |
整型數(shù)值。用于存儲(chǔ)數(shù)值。根據(jù)你所采用的服務(wù)器,可分為 32 位或 64 位 |
Double |
雙精度浮點(diǎn)值。用于存儲(chǔ)浮點(diǎn)值 |
Boolean |
布爾值。用于存儲(chǔ)布爾值(真/假) |
Arrays |
用于將數(shù)組或列表或多個(gè)值存儲(chǔ)為一個(gè)鍵 |
Datetime |
記錄文檔修改或添加的具體時(shí)間 |
MongoDB特有數(shù)據(jù)類型:
| 類型 | 解析 |
|---|---|
ObjectId |
用于存儲(chǔ)文檔 id,ObjectId是基于分布式主鍵的實(shí)現(xiàn)MongoDB分片也可繼續(xù)使用 |
Min/Max Keys |
將一個(gè)值與 BSON(二進(jìn)制的 JSON)元素的最低值和最高值相對比 |
Code |
用于在文檔中存儲(chǔ) JavaScript代碼 |
Regular Expression |
用于在文檔中存儲(chǔ)正則表達(dá)式 |
Binary Data |
二進(jìn)制數(shù)據(jù)。用于存儲(chǔ)二進(jìn)制數(shù)據(jù) |
Null |
用于創(chuàng)建空值 |
Object |
用于內(nèi)嵌文檔 |
?3Q:什么是集合Collection、文檔Document,以及與關(guān)系型數(shù)據(jù)庫術(shù)語類比。
- 集合
Collection位于單獨(dú)的一個(gè)數(shù)據(jù)庫MongoDB 文檔Document集合,它類似關(guān)系型數(shù)據(jù)庫(RDBMS)中的表Table。一個(gè)集合Collection內(nèi)的多個(gè)文檔Document可以有多個(gè)不同的字段。通常情況下,集合Collection中的文檔Document有著相同含義。 - 文檔
Document由key-value構(gòu)成。文檔Document是動(dòng)態(tài)模式,這說明同一集合里的文檔不需要有相同的字段和結(jié)構(gòu)。類似于關(guān)系型數(shù)據(jù)庫中table中的每一條記錄。 - 與關(guān)系型數(shù)據(jù)庫術(shù)語類比
| mongodb | 關(guān)系型數(shù)據(jù)庫 |
|---|---|
| Database | Database |
| Collection | Table |
| Document | Record/Row |
| Filed | Column |
| Embedded Documents | Table join |
? 4Q:什么是”Mongod“,以及MongoDB命令。
mongod是處理MongoDB系統(tǒng)的主要進(jìn)程。它處理數(shù)據(jù)請求,管理數(shù)據(jù)存儲(chǔ),和執(zhí)行后臺(tái)管理操作。當(dāng)我們運(yùn)行mongod命令意味著正在啟動(dòng)MongoDB進(jìn)程,并且在后臺(tái)運(yùn)行。
MongoDB命令:
| 命令 | 說明 |
|---|---|
| use database_name | 切換數(shù)據(jù)庫 |
| db.myCollection.find().pretty() | 格式化打印結(jié)果 |
| db.getCollection(collectionName).find() | 修改Collection名稱 |
? 5Q:"Mongod"默認(rèn)參數(shù)有?
- 傳遞數(shù)據(jù)庫存儲(chǔ)路徑,默認(rèn)是
"/data/db" - 端口號 默認(rèn)是 "27017"
?6Q:MySQL和mongodb的區(qū)別
| 形式 | MongoDB | MySQL |
|---|---|---|
| 數(shù)據(jù)庫模型 | 非關(guān)系型 | 關(guān)系型 |
| 存儲(chǔ)方式 | 虛擬內(nèi)存+持久化 | |
| 查詢語句 | 獨(dú)特的MongoDB查詢方式 | 傳統(tǒng)SQL語句 |
| 架構(gòu)特點(diǎn) | 副本集以及分片 | 常見單點(diǎn)、M-S、MHA、MMM等架構(gòu)方式 |
| 數(shù)據(jù)處理方式 | 基于內(nèi)存,將熱數(shù)據(jù)存在物理內(nèi)存中,從而達(dá)到高速讀寫 | 不同的引擎擁有自己的特點(diǎn) |
| 使用場景 | 事件的記錄,內(nèi)容管理或者博客平臺(tái)等數(shù)據(jù)大且非結(jié)構(gòu)化數(shù)據(jù)的場景 | 適用于數(shù)據(jù)量少且很多結(jié)構(gòu)化數(shù)據(jù) |
?7Q:問mongodb和redis區(qū)別以及選擇原因
| 形式 | MongoDB | redis |
|---|---|---|
| 內(nèi)存管理機(jī)制 | MongoDB 數(shù)據(jù)存在內(nèi)存,由 linux系統(tǒng) mmap 實(shí)現(xiàn),當(dāng)內(nèi)存不夠時(shí),只將熱點(diǎn)數(shù)據(jù)放入內(nèi)存,其他數(shù)據(jù)存在磁盤 | Redis 數(shù)據(jù)全部存在內(nèi)存,定期寫入磁盤,當(dāng)內(nèi)存不夠時(shí),可以選擇指定的 LRU 算法刪除數(shù)據(jù) |
| 支持的數(shù)據(jù)結(jié)構(gòu) | MongoDB 數(shù)據(jù)結(jié)構(gòu)比較單一,但是支持豐富的數(shù)據(jù)表達(dá),索引 | Redis 支持的數(shù)據(jù)結(jié)構(gòu)豐富,包括hash、set、list等 |
| 性能 | mongodb依賴內(nèi)存,TPS較高 | Redis依賴內(nèi)存,TPS非常高。性能上Redis優(yōu)于MongoDB |
| 可靠性 | 支持持久化以及復(fù)制集增加可靠性 | Redis依賴快照進(jìn)行持久化;AOF增強(qiáng)可靠性;增強(qiáng)可靠性的同時(shí),影響訪問性能 |
| 數(shù)據(jù)分析 | mongodb內(nèi)置數(shù)據(jù)分析功能(mapreduce) | Redis不支持 |
| 事務(wù)支持情況 | 只支持單文檔事務(wù),需要復(fù)雜事務(wù)支持的場景暫時(shí)不適合 | Redis 事務(wù)支持比較弱,只能保證事務(wù)中的每個(gè)操作連續(xù)執(zhí)行 |
| 集群 | MongoDB 集群技術(shù)比較成熟 | Redis從3.0開始支持集群 |
選擇原因:
架構(gòu)簡單
沒有復(fù)雜的連接
深度查詢能力,
MongoDB支持動(dòng)態(tài)查詢。容易調(diào)試
容易擴(kuò)展
不需要轉(zhuǎn)化/映射應(yīng)用對象到數(shù)據(jù)庫對象
使用內(nèi)部內(nèi)存作為存儲(chǔ)工作區(qū),以便更快的存取數(shù)據(jù)。
8Q:如何執(zhí)行事務(wù)/加鎖?
mongodb沒有使用傳統(tǒng)的鎖或者復(fù)雜的帶回滾的事務(wù),因?yàn)樗O(shè)計(jì)的宗旨是輕量,快速以及可預(yù)計(jì)的高性能.可以把它類比成mysql mylsam的自動(dòng)提交模式.通過精簡對事務(wù)的支持,性能得到了提升,特別是在一個(gè)可能會(huì)穿過多個(gè)服務(wù)器的系統(tǒng)里.
9Q:更新操作會(huì)立刻fsync到磁盤?
不會(huì),磁盤寫操作默認(rèn)是延遲執(zhí)行的.寫操作可能在兩三秒(默認(rèn)在60秒內(nèi))后到達(dá)磁盤,通過 syncPeriodSecs 啟動(dòng)參數(shù),可以進(jìn)行配置.例如,如果一秒內(nèi)數(shù)據(jù)庫收到一千個(gè)對一個(gè)對象遞增的操作,僅刷新磁盤一次.
MongoDB索引
10Q: 索引類型有哪些?
- 單字段索引(
Single Field Indexes) - 復(fù)合索引(
Compound Indexes) - 多鍵索引(
Multikey Indexes) - 全文索引(
text Indexes) - Hash 索引(
Hash Indexes) - 通配符索引(
Wildcard Index) - 2dsphere索引(
2dsphere Indexes)
11Q:MongoDB在A:{B,C}上建立索引,查詢A:{B,C}和A:{C,B}都會(huì)使用索引嗎?
由于MongoDB索引使用B-tree樹原理,只會(huì)在A:{B,C}上使用索引
MongoDB索引詳情可看文章【MongoDB系列--輕松應(yīng)對面試中遇到的MongonDB索引(index)問題】,其中包括很多索引的問題:
- 創(chuàng)建索引,需要考慮的問題
- 索引限制問題
- 索引類型詳細(xì)解析
- 索引的種類問題
12Q:什么是聚合
聚合操作能夠處理數(shù)據(jù)記錄并返回計(jì)算結(jié)果。聚合操作能將多個(gè)文檔中的值組合起來,對成組數(shù)據(jù)執(zhí)行各種操作,返回單一的結(jié)果。它相當(dāng)于 SQL 中的 count(*) 組合 group by。對于 MongoDB 中的聚合操作,應(yīng)該使用aggregate()方法。
詳情可查看文章【MongoDB系列--深入理解MongoDB聚合(Aggregation)】,其中包括很多聚合的問題:
- 聚合管道(
aggregation pipeline)的問題 Aggregation Pipeline優(yōu)化等問題- Map-Reduce函數(shù)的問題
MongoDB分片
13Q:monogodb 中的分片sharding
分片sharding是將數(shù)據(jù)水平切分到不同的物理節(jié)點(diǎn)。當(dāng)應(yīng)用數(shù)據(jù)越來越大的時(shí)候,數(shù)據(jù)量也會(huì)越來越大。當(dāng)數(shù)據(jù)量增長 時(shí),單臺(tái)機(jī)器有可能無法存儲(chǔ)數(shù)據(jù)或可接受的讀取寫入吞吐量。利用分片技術(shù)可以添加更多的機(jī)器來應(yīng)對數(shù)據(jù)量增加 以及讀寫操作的要求。
14Q:分片(Shard)和復(fù)制(replication)是怎樣工作的?
每一個(gè)分片(shard)是一個(gè)分區(qū)數(shù)據(jù)的邏輯集合。分片可能由單一服務(wù)器或者集群組成,我們推薦為每一個(gè)分片(shard)使用集群。
15Q:如果塊移動(dòng)操作(moveChunk)失敗了,我需要手動(dòng)清除部分轉(zhuǎn)移的文檔嗎?
不需要,移動(dòng)操作是一致(consistent)并且是確定性的(deterministic)。
- 一次失敗后,移動(dòng)操作會(huì)不斷重試。
- 當(dāng)完成后,數(shù)據(jù)只會(huì)出現(xiàn)在新的分片里(shard)
16Q:數(shù)據(jù)在什么時(shí)候才會(huì)擴(kuò)展到多個(gè)分片(Shard)里?
MongoDB 分片是基于區(qū)域(range)的。所以一個(gè)集合(collection)中的所有的對象都被存放到一個(gè)塊(chunk)中,默認(rèn)塊的大小是 64Mb。當(dāng)數(shù)據(jù)容量超過64 Mb,才有可能實(shí)施一個(gè)遷移,只有當(dāng)存在不止一個(gè)塊的時(shí)候,才會(huì)有多個(gè)分片獲取數(shù)據(jù)的選項(xiàng)。
17Q:更新一個(gè)正在被遷移的塊(Chunk)上的文檔時(shí)會(huì)發(fā)生什么?
更新操作會(huì)立即發(fā)生在舊的塊(Chunk)上,然后更改才會(huì)在所有權(quán)轉(zhuǎn)移前復(fù)制到新的分片上。
18Q:如果一個(gè)分片(Shard)停止或很慢的時(shí)候,發(fā)起一個(gè)查詢會(huì)怎樣?
如果一個(gè)分片停止了,除非查詢設(shè)置了 “Partial” 選項(xiàng),否則查詢會(huì)返回一個(gè)錯(cuò)誤。如果一個(gè)分片響應(yīng)很慢,MongoDB 會(huì)等待它的響應(yīng)。
MongoDB復(fù)制集
19Q:MongoDB副本集實(shí)現(xiàn)高可用的原理
MongoDB 使用了其復(fù)制(Replica Set)方案,實(shí)現(xiàn)自動(dòng)容錯(cuò)機(jī)制為高可用提供了基礎(chǔ)。目前,MongoDB 支持兩種復(fù)制模式:
-
Master/Slave,主從復(fù)制,角色包括Master和Slave。 -
Replica Set,復(fù)制集復(fù)制,角色包括Primary和Secondary以及Arbiter。(生產(chǎn)環(huán)境必選)
?20Q:什么是master或primary?
副本集只能有一個(gè)主節(jié)點(diǎn)能夠確認(rèn)寫入操作來接收所有寫操作,并記錄其操作日志中的數(shù)據(jù)集的所有更改(記錄在oplog中)。在集群中,當(dāng)主節(jié)點(diǎn)(master)失效,Secondary節(jié)點(diǎn)會(huì)變?yōu)?code>master
21Q:什么是Slave或Secondary?
復(fù)制主節(jié)點(diǎn)的oplog并將oplog記錄的操作應(yīng)用于其數(shù)據(jù)集,如果主節(jié)點(diǎn)宕機(jī)了,將從符合條件的從節(jié)點(diǎn)選舉選出新的主節(jié)點(diǎn)。
22Q:什么是Arbiter?
仲裁節(jié)點(diǎn)不維護(hù)數(shù)據(jù)集。 仲裁節(jié)點(diǎn)的目的是通過響應(yīng)其他副本集節(jié)點(diǎn)的心跳和選舉請求來維護(hù)副本集中的仲裁
23Q:復(fù)制集節(jié)點(diǎn)類型有哪些?
- 優(yōu)先級0型(
Priority 0)節(jié)點(diǎn) - 隱藏型(
Hidden)節(jié)點(diǎn) - 延遲型(
Delayed)節(jié)點(diǎn) - 投票型(
Vote)節(jié)點(diǎn)以及不可投票節(jié)點(diǎn)
24Q:啟用備份故障恢復(fù)需要多久?
從備份數(shù)據(jù)庫聲明主數(shù)據(jù)庫宕機(jī)到選出一個(gè)備份數(shù)據(jù)庫作為新的主數(shù)據(jù)庫將花費(fèi)10到30秒時(shí)間.這期間在主數(shù)據(jù)庫上的操作將會(huì)失敗–包括寫入和強(qiáng)一致性讀取(strong consistent read)操作.然而,你還能在第二數(shù)據(jù)庫上執(zhí)行最終一致性查詢(eventually consistent query)(在slaveok模式下),即使在這段時(shí)間里.
MongoDB復(fù)制詳解分析可查看文章【MongoDB系列-解決面試中可能遇到的MongoDB復(fù)制集(replica set)問題】
25Q:raft選舉過程,投票規(guī)則?
選舉過程:
當(dāng)系統(tǒng)啟動(dòng)好之后,初始選舉后系統(tǒng)由1個(gè)Leader和若干個(gè)Follower角色組成。然后突然由于某個(gè)異常原因,Leader服務(wù)出現(xiàn)了異常,導(dǎo)致Follower角色檢測到和Leader的上次RPC更新時(shí)間超過給定閾值時(shí)間時(shí)。此時(shí)Follower會(huì)認(rèn)為Leader服務(wù)已出現(xiàn)異常,然后它將會(huì)發(fā)起一次新的Leader選舉行為,同時(shí)將自身的狀態(tài)從Follower切換為Candidate身份。隨后請求其它Follower投票選擇自己。
投票規(guī)則:
- 當(dāng)一個(gè)候選人獲得了同一個(gè)任期號內(nèi)的大多數(shù)選票,就成為領(lǐng)導(dǎo)人。
- 每個(gè)節(jié)點(diǎn)最多在一個(gè)任期內(nèi)投出一張選票。并且按照先來先服務(wù)的原則。
- 一旦候選人贏得選舉,立刻成為領(lǐng)導(dǎo),并發(fā)送心跳維持權(quán)威,同時(shí)阻止新領(lǐng)導(dǎo)人的誕生
可查看文章【通俗易懂的Paxos算法-基于消息傳遞的一致性算法】
26Q:在哪些場景使用MongoDB?
規(guī)則: 如果業(yè)務(wù)中存在大量復(fù)雜的事務(wù)邏輯操作,則不要用MongoDB數(shù)據(jù)庫;在處理非結(jié)構(gòu)化 / 半結(jié)構(gòu)化的大數(shù)據(jù)使用MongoDB,操作的數(shù)據(jù)類型為動(dòng)態(tài)時(shí)也使用MongoDB,比如:
- 內(nèi)容管理系統(tǒng),切面數(shù)據(jù)、日志記錄
- 移動(dòng)端
Apps:O2O送快遞騎手、快遞商家的信息(包含位置信息) - 數(shù)據(jù)管理,監(jiān)控?cái)?shù)據(jù)
作者:Ccww
鏈接:https://juejin.im/post/5d9ee1ce5188255820783df3
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。