mongodb

基於分散式文件存儲的資料庫

MongoDB是一個基於分散式文件存儲的資料庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。

MongoDB是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。它支持的數據結構非常鬆散,是類似json的bson格式,因此可以存儲比較複雜的數據類型。Mongo最大的特點是它支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能,而且還支持對數據建立索引。

特點


它的特點是高性能、易部署、易使用,存儲數據非常方便。主要功能特性有:
mongodb集群參考
mongodb集群參考
*面向集合存儲,易存儲對象類型的數據。
*模式自由。
*支持動態查詢。
*支持完全索引,包含內部對象。
*支持查詢。
*支持複製和故障恢復。
*使用高效的二進位數據存儲,包括大型對象(如視頻等)。
*自動處理碎片,以支持雲計算層次的擴展性。
*支持RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
*文件存儲格式為BSON(一種JSON的擴展)。
*可通過網路訪問。

使用原理


所謂“面向集合”(Collection-Oriented),意思是數據被分組存儲在數據集中,被稱為一個集合(Collection)。每個集合在資料庫中都有一個唯一的標識名,並且可以包含無限數目的文檔。集合的概念類似關係型資料庫(RDBMS)里的表(table),不同的是它不需要定義任何模式(schema)。Nytro MegaRAID技術中的快閃記憶體高速緩存演演算法,能夠快速識別資料庫內大數據集中的熱數據,提供一致的性能改進。
模式自由(schema-free),意味著對於存儲在mongodb資料庫中的文件,我們不需要知道它的任何結構定義。如果需要的話,你完全可以把不同結構的文件存儲在同一個資料庫里。
存儲在集合中的文檔,被存儲為鍵-值對的形式。鍵用於唯一標識一個文檔,為字元串類型,而值則可以是各種複雜的文件類型。我們稱這種存儲形式為BSON(Binary Serialized Document Format)。
MongoDB已經在多個站點部署,其主要場景如下:
1)網站實時數據處理。它非常適合實時的插入、更新與查詢,並具備網站實時數據存儲所需的複製及高度伸縮性。
2)緩存。由於性能很高,它適合作為信息基礎設施的緩存層。在系統重啟之後,由它搭建的持久化緩存層可以避免下層的數據源過載。
3)高伸縮性的場景。非常適合由數十或數百台伺服器組成的資料庫,它的路線圖中已經包含對MapReduce引擎的內置支持。
不適用的場景如下:
1)要求高度事務性的系統。
2)傳統的商業智能應用。
3)複雜的跨文檔(表)級聯查詢。

系統介紹


分散式文件系統(Distributed File System)是指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網路與節點相連。分散式文件系統的設計基於客戶機/伺服器模式。一個典型的網路可能包括多個供多用戶訪問的伺服器。另外,對等特性允許一些系統扮演客戶機和伺服器的雙重角色。
HBase是一個分散式的、面向列的開源資料庫,該技術來源於 Fay Chang 所撰寫的Google論文“Bigtable:一個結構化數據的分散式存儲系統。
Yonghong Data Mart是基於自有技術研發的一款數據存儲、數據處理的軟體。Yonghong Data Mart的分散式文件存儲系統 (ZDFS)是在Hadoop HDFS基礎上進行的改造和擴展,將伺服器集群內所有節點上存儲的文件統一管理和存儲。

實際應用


MongoDB服務端可運行在Linux、Windows或mac os x平台,支持32位和64位應用,默認埠為27017。推薦運行在64位平台,因為MongoDB在32位模式運行時支持的最大文件尺寸為2GB。

版本發布


2012年05月23日,MongoDB2.1 開發分支發布了! 該版本採用全新架構,包含諸多增強。
2012年06月06日,MongoDB 2.0.6 發布,分散式文檔資料庫。
2013年04月23日,MongoDB 2.4.3 發布,此版本包括了一些性能優化,功能增強以及bug修復。
2013年08月20日,MongoDB 2.4.6 發布。
2013年11月01日,MongoDB 2.4.8 發布。
2017年03月17日,MongoDB 3.0.1發布。
2018年08月06日,MongoDB 4.0.2發布,支持多文檔事務。
2019年08月13日,MongoDB 4.2.0 發布,引入分散式事務。

數據開發


服務端

下載地址
在不同的系統上會有不同的版本。

驅動

下載地址
用不同的語言開發會有不同的驅動提供。

設計特徵


MongoDB 的設計目標是高性能、可擴展、易部署、易使用,存儲數據非常方便。其主要功能特性如下。
(1)面向集合存儲,容易存儲對象類型的數據。在MongoDB 中數據被分組存儲在集合中,集合類似RDBMS 中的表,一個集合中可以存儲無限多的文檔。
(2)模式自由,採用無模式結構存儲。在MongoDB 中集合中存儲的數據是無模式的文檔,採用無模式存儲數據是集合區別於RDBMS 中的表的一個重要特徵。
(3)支持完全索引,可以在任意屬性上建立索引,包含內部對象。MongoDB的索引和RDBMS 的索引基本一樣,可以在指定屬性、內部對象上創建索引以提高查詢的速度。除此之外,MongoDB 還提供創建基於地理空間的索引的能力。
(4)支持查詢。MongoDB 支持豐富的查詢操作,MongoDB 幾乎支持SQL中的大部分查詢。
(5)強大的聚合工具。MongoDB 除了提供豐富的查詢功能外,還提供強大的聚合工具,如count、group 等,支持使用MapReduce 完成複雜的聚合任務。
(6)支持複製和數據恢復。MongoDB 支持主從複製機制,可以實現數據備份、故障恢復、讀擴展等功能。而基於副本集的複製機制提供了自動故障恢復的功能,確保了集群數據不會丟失。
(7)使用高效的二進位數據存儲,包括大型對象(如視頻)。使用二進位格式存儲,可以保存任何類型的數據對象。
(8)自動處理分片,以支持雲計算層次的擴展。MongoDB 支持集群自動切分數據,對數據進行分片可以使集群存儲更多的數據,實現更大的負載,也能保證存儲的負載均衡。
(9)支持Perl、PHP、Java、C#、JavaScript、Ruby、C 和C++語言的驅動程序,MongoDB 提供了當前所有主流開發語言的資料庫驅動包,開發人員使用任何一種主流開發語言都可以輕鬆編程,實現訪問MongoDB 資料庫。
(10)文件存儲格式為BSON(JSON 的一種擴展)。BSON 是對二進位格式的JSON 的簡稱,BSON 支持文檔和數組的嵌套。
(11)可以通過網路訪問。可以通過網路遠程訪問MongoDB 資料庫。

基本概念


(1)文檔
文檔是 MongoDB 中數據的基本單位,類似於關係資料庫中的行(但是比行複雜)。多個鍵及其關聯的值有序地放在一起就構成了文檔。不同的編程語言對文檔的表示方法不同,在JavaScript 中文檔表示為:
{“greeting”:“hello,world”}
這個文檔只有一個鍵“greeting”,對應的值為“hello,world”。多數情況下,文檔比這個更複雜,它包含多個鍵/值對。例如:
{“greeting”:“hello,world”,“foo”: 3}
文檔中的鍵/值對是有序的,下面的文檔與上面的文檔是完全不同的兩個文檔。
{“foo”: 3 ,“greeting”:“hello,world”}
文檔中的值不僅可以是雙引號中的字元串,也可以是其他的數據類型,例如,整型、布爾型等,也可以是另外一個文檔,即文檔可以嵌套。文檔中的鍵類型只能是字元串。
(2)集合
集合就是一組文檔,類似於關係資料庫中的表。集合是無模式的,集合中的文檔可以是各式各樣的。例如,{“hello,word”:“Mike”}和{“foo”: 3},它們的鍵不同,值的類型也不同,但是它們可以存放在同一個集合中,也就是不同模式的文檔都可以放在同一個集合中。既然集合中可以存放任何類型的文檔,那麼為什麼還需要使用多個集合?這是因為所有文檔都放在同一個集合中,無論對於開發者還是管理員,都很難對集合進行管理,而且這種情形下,對集合的查詢等操作效率都不高。所以在實際使用中,往往將文檔分類存放在不同的集合中,例如,對於網站的日誌記錄,可以根據日誌的級別進行存儲,Info級別日誌存放在Info 集合中,Debug 級別日誌存放在Debug 集合中,這樣既方便了管理,也提供了查詢性能。但是需要注意的是,這種對文檔進行劃分來分別存儲並不是MongoDB 的強制要求,用戶可以靈活選擇。
可以使用“.”按照命名空間將集合劃分為子集合。例如,對於一個博客系統,可能包括blog.user 和blog.article 兩個子集合,這樣劃分只是讓組織結構更好一些,blog 集合和blog.user、blog.article 沒有任何關係。雖然子集合沒有任何特殊的地方,但是使用子集合組織數據結構清晰,這也是MongoDB 推薦的方法。
(3)資料庫
MongoDB 中多個文檔組成集合,多個集合組成資料庫。一個MongoDB 實例可以承載多個資料庫。它們之間可以看作相互獨立,每個資料庫都有獨立的許可權控制。在磁碟上,不同的資料庫存放在不同的文件中。MongoDB 中存在以下系統資料庫。
● Admin 資料庫:一個許可權資料庫,如果創建用戶的時候將該用戶添加到admin 資料庫中,那麼該用戶就自動繼承了所有資料庫的許可權。
● Local 資料庫:這個資料庫永遠不會被複制,可以用來存儲本地單台伺服器的任意集合。
● Config 資料庫:當MongoDB 使用分片模式時,config 資料庫在內部使用,用於保存分片的信息。

數據模型


一個MongoDB 實例可以包含一組資料庫,一個DataBase 可以包含一組Collection(集合),一個集合可以包含一組Document(文檔)。一個Document包含一組field(欄位),每一個欄位都是一個key/value pair。
key: 必須為字元串類型。
value:可以包含如下類型。
● 基本類型,例如,string,int,float,timestamp,binary 等類型。
● 一個document。
● 數組類型。

適用場景


MongoDB 的主要目標是在鍵/值存儲方式(提供了高性能和高度伸縮性)和傳統的RDBMS 系統(具有豐富的功能)之間架起一座橋樑,它集兩者的優勢於一身。根據官方網站的描述,Mongo 適用於以下場景。
● 網站數據:Mongo 非常適合實時的插入,更新與查詢,並具備網站實時數據存儲所需的複製及高度伸縮性。
● 緩存:由於性能很高,Mongo 也適合作為信息基礎設施的緩存層。在系統重啟之後,由Mongo 搭建的持久化緩存層可以避免下層的數據源過載。
● 大尺寸、低價值的數據:使用傳統的關係型資料庫存儲一些數據時可能會比較昂貴,在此之前,很多時候程序員往往會選擇傳統的文件進行存儲。
● 高伸縮性的場景:Mongo 非常適合由數十或數百台伺服器組成的資料庫,Mongo 的路線圖中已經包含對MapReduce 引擎的內置支持。
● 用於對象及JSON 數據的存儲:Mongo 的BSON 數據格式非常適合文檔化格式的存儲及查詢。
MongoDB 的使用也會有一些限制,例如,它不適合於以下幾個地方。
● 高度事務性的系統:例如,銀行或會計系統。傳統的關係型資料庫目前還是更適用於需要大量原子性複雜事務的應用程序。
● 傳統的商業智能應用:針對特定問題的BI 資料庫會產生高度優化的查詢方式。對於此類應用,數據倉庫可能是更合適的選擇。
● 需要SQL 的問題。

應用案例


下面列舉一些公司MongoDB的實際應用:
• Craiglist上使用MongoDB的存檔數十億條記錄。
• FourSquare,基於位置的社交網站,在Amazon EC2的伺服器上使用MongoDB分享數據。
• Shutterfly,以網際網路為基礎的社會和個人出版服務,使用MongoDB的各種持久性數據存儲的要求。
• bit.ly, 一個基於Web的網址縮短服務,使用MongoDB的存儲自己的數據。
• spike.com,一個MTV網路的聯營公司, spike.com使用MongoDB的。
• Intuit公司,一個為小企業和個人的軟體和服務提供商,為小型企業使用MongoDB的跟蹤用戶的數據。
• sourceforge.net,資源網站查找,創建和發布開源軟體免費,使用MongoDB的後端存儲。
• etsy.com ,一個購買和出售手工製作物品網站,使用MongoDB。
• 紐約時報,領先的在線新聞門戶網站之一,使用MongoDB。
• CERN,著名的粒子物理研究所,歐洲核子研究中心大型強子對撞機的數據使用MongoDB。