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