天天看點

《大資料存儲:MongoDB實戰指南》一1.6 MongoDB特點

本節書摘來異步社群《大資料存儲:mongodb實戰指南》一書中的第1章,第1.6節,作者: 郭遠威 , 彭文波 責編: 陳冀康,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

大資料存儲:mongodb實戰指南

它的存儲模型與關系資料庫的比較如表1-1所示。

《大資料存儲:MongoDB實戰指南》一1.6 MongoDB特點

關系資料庫中最基本的單元是行,而mongodb中最基本存儲單元是document,典型結構如下所示。

它用與json格式類似的鍵值對來存儲(在mongodb中叫bson對象),其中值的資料類型有常見的字元串、數字、日期,還可以是bson對象、數組以及數組的元素,也可以是bson對象,通過這種嵌套的方式,使mongodb的資料類型變得相當豐富。

mongodb與傳統關系資料庫還有一個重大差別就是:可擴充的表結構。也就是說collection(表)中的document(一行記錄)所擁有的字段(列)是可以變化的,下面文檔對象document(一行記錄)比上面列出的文檔對象document(一行記錄)多一個time字段,但它們可以共存在同一個collection(表)中。

mongodb查詢語句不是按照sql的标準來開發的,它圍繞json這種特殊格式的文檔型存儲模型開發了一套自己的查詢體系,這就是現在非常流行的nosql體系。關系資料庫中常用的sql語句在mongodb中都有對應的解決方案。當然也有例外,mongodb不支援join語句。我們知道傳統關系資料庫中join操作可能會産生笛卡爾積的虛拟表,消耗較多系統資源,而mongodb的文檔對象集合collection可以是任何結構,我們可以通過設計較好的資料模型盡量避開這樣的操作需求。如果真的需要從多個collection(表)中檢索資料,那我們可以通過多次查詢得到。

在關系資料庫中經常用到的group by等分組聚集函數,在mongodb中也有,而且mongodb提供了更加強大的mapreduce方案(google提出的并行程式設計),為海量資料的統計、分析提供了便利。

mongodb支援日志功能journaling,對資料庫的增、删、改操作會記錄在日志檔案中。mongodb每100ms将記憶體中的資料刷到磁盤上,如果意外停機,在資料庫重新啟動時,mongodb能通過journaling日志功能恢複。

mongodb支援複制集(replset),一個複制集在生産環境中最少需要3台獨立的機器(測試的時候為了友善可能都部署在一台機器上),一台作主節點(primary),一台作次節點(secondary),一台作仲裁節點(隻負責選出主節點),備份、自動故障轉移,這些特性都是複制集支援的。

mongodb支援自動分片sharding,分片的功能實作海量資料的分布式存儲,分片通常與複制集配合起來使用,實作讀寫分離、負載均衡,當然如何選擇片鍵是實作分片功能的關鍵。如何實作讀寫分離我們後面會詳細分析。

總之,mongodb最吸引人的地方應該就是自由的表結構、mapreduce、分片、複制集,通過這些功能實作海量資料的存儲、高效地讀寫以及資料的分析。