MongoDB 面試題

banq發表於2021-12-23

您在建立MongoDB時想解決什麼問題?

我們曾經並且正在嘗試構建我們作為開發人員一直想要的資料庫。對於純報告,SQL 和關係是很好的,但是在構建資料時總是需要一些不同的東西:使編碼水平擴充套件的東西。

MongoDB 早期的主要障礙是什麼?

整個 nosql 領域的一大障礙是,從關係轉向任何事物對使用者來說都是一大步。關係是一個偉大的每個從學校畢業的人都知道。然而,計算機架構正在發生變化,雲端計算即將到來。我們需要在完全不同的環境中執行的解決方案。也很有趣——因此產品的動態模式性質。

未來 3 個月 MongoDB 將何去何從?6個月?12個月?

我們當然相信還有很多事情要做,而且需要數年甚至數月的時間。路線圖中的重點是更快的聚合能力、全文搜尋、更好的併發性以及輕鬆的大型叢集設定和管理。目前的普遍關注點是確保產品適用於關鍵任務生產應用程式。

您希望對MongoDB做一些不同的事情嗎?

事後看來,我對兩三年前做出的許多設計決定感到非常高興。我們在那裡很幸運。我非常喜歡資料模型。我喜歡強一致的操作是可能的:有很多用例,例如只註冊一個新使用者,在那裡人們需要它。更重要的是,還有一長串我們想做但還沒有做的事情。

什麼使 Mongodb 最好?

面向文件

高效能

高可用性

易於擴充套件

豐富的查詢語言

如果我使用複製,某些成員可以使用日記功能而其他成員不可以嗎?

是的

我可以使用日誌功能來執行安全的熱備份嗎?

是的

什麼是 32 位細微差別?

有日誌記錄的額外記憶體對映檔案活動。這將進一步限制 32 位構建的有限資料庫大小。因此,目前在 32 位系統上預設禁用日誌記錄。

如果條目不完整(例如失敗發生在一箇中間),日誌重播是否會出現問題?

每個日誌(組)寫入都是一致的,除非完成,否則在恢復期間不會重放。

Profiler 在 MongoDB 中的作用是什麼?

MongoDB 包含一個資料庫分析器,它顯示針對資料庫的每個操作的效能特徵。使用分析器,您可以找到比應有的速度慢的查詢(和寫入操作);例如,使用此資訊來確定何時需要索引。

什麼是“名稱空間”?

MongoDB 將 BSON 物件儲存在集合中。資料庫名稱和集合名稱(中間有句點)的串聯稱為名稱空間。

如果刪除物件屬性,它是否會從商店中刪除?

是的,您刪除該屬性,然後 re-save() 物件。

是否允許空值?

對於物件的成員,是的。儘管 null 不是物件,但您不能將 null 新增到資料庫集合中。不過,您可以新增 {}。

是否立即將 fsync 更新到磁碟?

不,預設情況下寫入磁碟是惰性的。幾秒鐘後寫入可能會命中磁碟。例如,如果資料庫在一秒內收到一個物件的一千個增量,它只會被重新整理到磁碟一次。(注意 fsync 選項在命令列和通過 getLastError_old 都可用。)

我如何進行交易/鎖定?

MongoDB 不使用傳統的鎖定或帶回滾的複雜事務,因為它被設計為輕量級、快速且效能可預測。它可以被認為類似於 MySQL MyISAM 自動提交模型。通過保持事務支援極其簡單,效能得到了增強,尤其是在可能跨多個伺服器執行的系統中。

為什麼我的資料檔案這麼大?

MongoDB會主動預分配保留空間以避免檔案系統碎片化。

副本集故障轉移需要多長時間?

其他成員可能需要 10 到 30 秒的時間來宣佈主要成員退出並選出新的主要成員。在這段時間內,叢集因“主要”操作(即寫入和強一致性讀取)而關閉。但是,您可以隨時(在 slaveOk 模式下)對輔助節點執行最終一致的查詢,包括在此視窗期間。

什麼是大師或初級?

這是一個節點/成員,它當前是主節點並處理副本集的所有寫入。在副本集中,在發生故障轉移事件時,不同的成員可以成為主要成員。

什麼是次要或奴隸?

輔助節點是從當前主節點應用操作的節點/成員。這是通過拖尾複製 oplog (local.oplog.rs) 來完成的。

從主節點到輔助節點的複製是非同步的,但是輔助節點會盡量保持最新狀態(通常在 LAN 上只有幾毫秒)。

我是否必須呼叫 getLastError 才能使寫入持久化?

不。如果您不呼叫 getLastError(又名“安全模式”),伺服器會執行與您呼叫時完全相同的行為。getLastError 呼叫只是讓人們確認寫入操作已成功提交。當然,通常您會需要這種確認,但寫入的安全性及其耐用性是獨立的。

我應該從分片還是非分片的 MongoDB 環境開始?

為了簡單和快速啟動,我們建議不分片開始,除非您的初始資料集不適合單個伺服器。從未分片升級到分片是簡單且無縫的,因此在資料集很大之前設定分片並沒有太多優勢。

分片如何與複製一起工作?

每個分片都是分割槽資料的邏輯集合。分片可以由單個伺服器或一組副本組成。我們建議為每個分片使用一個副本集。

資料何時會在多個分片上?

MongoDB 分片是基於範圍的。所以集合中的所有物件都被放入一個塊中。只有當有超過 1 個塊時,才有多個分片獲取資料的選項。現在,預設塊大小為 64mb,因此您至少需要 64mb 才能進行遷移。

如果我嘗試更新正在遷移的塊上的文件,會發生什麼?

更新將立即在舊分片上進行,然後更改將在所有權轉移之前複製到新分片。

如果分片出現故障或速度緩慢而我執行查詢怎麼辦?

如果分片關閉,除非設定了“部分”查詢選項,否則查詢將返回錯誤。如果分片響應緩慢,mongos 將等待它。

我可以刪除 moveChunk 目錄中的舊檔案嗎?

是的,這些檔案是在正常的分片平衡操作期間作為備份製作的。操作完成後就可以刪除了。清理過程目前是手動的,因此請務必注意以釋放空間。

如何檢視 mongos 使用的連線?

db._adminCommand(“connPoolStats”);

如果 moveChunk 失敗,我是否需要清理部分移動的文件?

不,塊移動是一致且確定的;移動將重試,完成後資料將僅在新分片上。

相關文章