MongoDB 是一個基于分布式文件存儲的數據庫,由 C++語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。
MongoDB 適用場景
MongoDB 的主要目標是在鍵/值存儲方式(提供了高性能和高度伸縮性)和傳統的 RDBMS 系統(具有豐富的功能)之間架起一座橋梁,它集兩者的優勢于一身。Mongo 主要適用于以下場景:- 網站數據:Mongo 非常適合實時的插入,更新與查詢,并具備網站實時數據存儲所需的復制及高度伸縮性。
- 緩存:由于性能很高,Mongo 也適合作為信息基礎設施的緩存層。在系統重啟之后, 由 Mongo 搭建的持久化緩存層可以避免下層的數據源過載。
- 大尺寸、低價值的數據:使用傳統的關系型數據庫存儲一些數據時可能會比較昂貴,在此之前,很多時候程序員往往會選擇傳統的文件進行存儲。
- 高伸縮性的場景:Mongo 非常適合由數十或數百臺服務器組成的數據庫,Mongo 的路線圖中已經包含對 MapReduce 引擎的內置支持。
- 用于對象及 JSON 數據的存儲:Mongo 的 BSON 數據格式非常適合文檔化格式的存儲及查詢。
- 高度事務性的系統:例如,銀行或會計系統。傳統的關系型數據庫目前還是更適用于需要大量原子性復雜事務的應用程序。
- 傳統的商業智能應用:針對特定問題的 BI 數據庫會產生高度優化的查詢方式。對于此類應用,數據倉庫可能是更合適的選擇。
- 需要 SQL 的問題。
MongoDB 原理
- MongoDB 復(副)本集與分片:
每個復(副)本集中存儲的數據是相同的,相當于主備方式的數據冗余,目的是為了容災。分片是為了數據的拓展,按照片鍵進行結點劃分,數據根據片鍵存儲到對應的服務器上。
2.MongoDB 部署方案
MongoDB 的集群部署方案中有三類角色:實際數據存儲結點(Shared Sever)、配置文件存儲結點(Config Sever)和路由接入結點(Route Server)。客戶端直接與路由結點相連,從配置結點上查詢數據,根據查詢結果到實際的存儲結點上查詢和存儲數據。MongoDB 讀寫數據的流程如圖:寫入數據時,先由客戶端訪問路由結點,向配置結點獲取相關信息后,將數據寫入存儲結點。讀取數據時,由客戶端訪問路由結點,向配置結點獲取相關信息后,對存儲結點進行訪問, 獲取到相應數據,再經由路由結點將數據返回至客戶端。對于復本集,又有主和從兩種角色,寫數據和讀數據也是不同,寫數據的過程是只寫到主結點中,由主結點以異步的方式同步到從結點中。而讀數據則只要從任一結點中讀取,具體到哪個結點讀取是可以指定的。對于 MongoDB 的分片,假設我們以某一索引鍵(ID)為片鍵,ID 的區間[0,50),劃分成 5 個chunk,分別存儲到 3 個片服務器中,可以進行如下分片:當數據量很大,需要增加片服務器時,只需移動 chunk 來均分數據即可。配置結點:存儲配置文件的服務器其實存儲的是片鍵與 chunk 以及 chunk 與 server 的映射關系。路由結點:路由角色的結點在分片的情況下起到負載均衡的作用。MongoDB 和 MySQL 的區別
- MySQL 是關系型數據庫
- 優點:
- 缺點:
存儲方式:虛擬內存+持久化。查詢語句:獨特的 MongoDB 的查詢方式。架構特點:可以通過副本集,以及分片來實現高可用。數據處理:數據存儲在硬盤上,需要經常讀取的數據(熱數據)會被加載到物理內存中,從而達到高速讀寫的效果。成熟度與廣泛度:新興數據庫,成熟度較低,Nosql 數據庫中最為接近關系型數據庫,比較完善的數據庫之一,適用人群不斷增長。
- 優點:
- 缺點:
不支持事務。
3、MongoDB 與 MySQL 命令對比
傳統的關系數據庫一般由數據庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB 是由數據庫(database)、集合(collection)、文檔對象(document)三個層次組成。MongoDB 對于關系型數據庫里的表,但是集合中不包括列、行和關系概念,這體現了模式自由的特點。MongoDB 備份方式
- 文件快照備份
- 優點:
- 支持時間點
- 高可靠性、高效率
- 增量備份
- 缺點:
- 需要操作系統支持
- 需要開啟日志功能,否則無法保證數據的有效性和一致性
- 其他:
- 可以獲取分片集群的一致快照,需要關閉集群均衡器并在大致相同的時刻從集群的每個分片和配置服務器上抓取快照。
- 沒有開啟日志功能時,備份前需要完全完成寫操作,備份過程中將停止任何寫操作
- 開啟日志功能后,在快照時 MMAPv1 無需停止寫操作達到一致狀態,Wired Tiger 通過最后的檢查點達到一致狀態(檢查點為每 2G 數據或每分鐘一次)。
- 文件快照創建的是整個磁盤的鏡像,所以把數據文件、配置、日志放在一個邏輯磁盤上會節約空間。
執行 mongodump 命令讀取 MongoDB 數據庫,可以生成一個備份文件,該備份文件格式為BJSON,執行 mongorestore 命令可以通過讀取該備份文件將 MongoDB 數據庫恢復。使用這種方式進行備份時,對于小型的 MongoDB 集群而言,占用空間更少,也更高效;但是對于大型的 MongoDB 集群,效率則不是很高。在備份的過程中,可以繼續修改數據,會記錄與 oplog 中;備份的數據也不包括本地數據庫、索引,故而恢復數據庫時必須重建索引;此外備份還會產生網絡流量,影響當前mongod 性能。一旦備份數據超過系統內存,查詢操作就會產生錯誤。執行備份時一定要有對應的訪問控制權限。mongodump 不同版本之間不能互相兼容,無法使用較新的版本備份老數據。