3 月25日 MongoDB(取自“humongous”)1.4 版發佈 後不久,其創始人Dwight Merriman(前DoubleClick CEO/CTO)宣佈10gen —— 開源文檔數據庫MongoDB背後的公司,將爲其提供商業培訓和支持。
InfoQ藉此機會採訪了Merriman,瞭解了MongoDB的特性、適用性以及在NoSQL數據庫社區中的地位,文中適當引用了他的一些回 答。
MongoDB介紹
MongoDB是一個可擴展、高性能的下一代數據庫。MongoDB中的數據以文檔形式存儲,這樣就能在單個數據對象中表示覆雜的關係。文檔可能由 以下幾 部分組成:獨立的基本類型屬性、“內嵌文檔”或文檔數組。
這樣的靈活性讓開發者能以一種易於管理且靈活的方式來對大量的問題進行建模,不必將數據打散到不同的數據表中。在數據不宜被構造成單獨文檔的情況 下,MongoDB有“DBRef”的概念,這是從文檔的一個屬性指向另一個文檔的指針。
從MongoDB數據庫中獲取和查詢數據是十分靈活的——可以基於主文檔、文檔中的任意屬性、任意內嵌文檔、數組中的任意文檔來動態地查詢文檔。可 以通過 “點”符號來訪問內嵌文檔。
特性
用C++開發的MongoDB有以下特性:
- 面向文檔的存儲方式(發揮JSON風格的數據模式的力量和靈活性)
- 內部對象、內嵌數組、地理空間信息
- 動態查詢
- 支持全索引,包括二級索引
- 查詢剖析
- 快速、原地更新
- 對二進制大數據對象(例如照片和視頻)的有效存儲
- 支持複製和故障轉移
- 針對雲級擴展的自動分片(alpha階段)
- 針對複雜聚合的MapReduce
- 商業支持、培訓和諮詢
起源與目的
MongoDB的博 客 上是這樣來介紹他們的目標的:
一直以來,MongoDB的目標都不是處理少數問題的特殊數據庫,而是一種新型數據庫,是可以爲開發者解決大量現實問題的數據庫。
MongoDB項目的重點是將非關係模型的優點和傳統數據庫中常見的重要特性結合起來,前者包括高可擴展性、性能和易於開發,後者在重要的操作型數 據存儲中很有用。
MongoDB不是在實驗室裏設計出來的,它源自於我們自己在構建大規模高可用系統方面的經驗。
MongoDB在14個月前,於2009年2月11日,發佈了第一個正式版本。其背後的哲學 告訴大家,儘管出於可擴展 性和性能的考慮削弱了事務語義,人們還是需要一個功能更強大的工具來應對常見問題,不僅僅是 純Key-Value存儲。
與DDD的關係
文檔化範式是一種有趣的用於持久化複雜對象結構的途徑。尤其是領 域驅動設計(DDD) 所提出的聚合 概念,只有根實 體能被其他實體連接到,被依賴的實體和值只能通過根來訪問。在DDD的項目裏,基於MongoDB的倉庫 能方便地用於提供持久化功 能。另外,還有一個相關的觀點,當關係到業務實體時,業務領域中總是會提到文檔。因此,也許用文檔作爲內部表示方式會比其他數據結構或對象更合適一些。
在無模式的文檔數據庫中,數據建模依然十分重要。在創建文檔前有多方面的關係 需要慎重考 慮,不然會導致數 據重複、性能不佳和其他問題 。
範例與教程
例如,在一個關係型數據庫中,一篇博客(包含文章內容、評論、評論的投票)會被打散在多張數據表中。在MongoDB中,能用一個文檔來表示一篇博客,評 論與投票作爲文檔數組,放在正文主文檔中。這樣數據更易於管理,消除了傳統關係型數據庫中影響性能和水平擴展性的“JOIN”操作。
> db.blogposts.save({ title : "My First Post", author: {name : "Jane", id :1},
comments : [{ by: "Abe", text: "First" },
{ by : "Ada", text : "Good post" }]
})
> db.blogposts.find( { "author.name" : "Jane" } )
> db.blogposts.findOne({ title : "My First Post", "author.name": "Jane",
comments : [{ by: "Abe", text: "First" },
{ by : "Ada", text : "Good post" } ]
})
> db.blogposts.find( { "comments.by" : "Ada" } )
> db.blogposts.ensureIndex( { "comments.by" : 1 } );
你可以直接在交互式MongoDB Web控制檯Shell 裏運行 該範例,其中還嵌入了在線教程 。
InfoQ的CTO Alex Popescu 在myNoSQL 中放了很多新聞、評論和多個NoSQL數據存儲(包括MongoDB )的比較,可以參考他的生 產環境筆記 。
Teach Me To Code 發佈了3 段視頻 ,介紹了MongoDB的諸多特性。
Pivotallabs提供了一段由 10gen的Michael Dirolf做的介紹性演講 的錄像。Slideshare上還能找到Kyle Banker做的一個比較完整地介紹MongoDB的演講 。
安裝與集成
MongoDB數據庫遵循GUN AGPL v3.0協議 發佈 ,mongodb.org 提供的驅動遵循Apache License v2.0 。 你能從github 上獲取它的 C++源代碼 ,並在任 意操作系統上構建 它。
你也能以二進制包 的 形式在Linux、MacOS X、Windows和Solaris上安裝 MongoDB。
MongoDB本身以mongod 守護進程的形式運行,這是核心數據庫服務器, 隨後通過多種驅動來訪問它。分片支持和數據庫路由功能由mongos 服務來提供。
有人努力在幾乎所有編程語言中支持MongoDB。它有多種語言的驅動 :C 、C++ 、C# & .NET , ColdFusion 、Erlang 、Factor 、Java 、Javascript 、PHP 、Python 、Ruby 、Perl ,等等 。
MongoDB還支持其他框架,例如gremlin (圖 數據庫)的“blueprints”連接器庫 。Debasish Ghosh將之集成 到了可擴展Actor框架Akka 中,作爲持久化模塊 。
操作與可擴展性
從操作角度來講,MongoDB可以根據應用程序的需要以兩種模式來運行。第一種是“單主”(single master)模式,只有一臺主服務器來處理所有的寫操作。讀操作能從中分離出去,通過任意數量的從服務器來進行讀操作,這有利於提高讀的可擴展性(使用 場景:Sourceforge)。
對於那些寫數據量很大或寫頻率過高,單臺主服務器無法處理的應用程序,可以使用MongoDB的自動分片模式(正處於alpha階段)。該模式下寫 操作會自動分配到任意數量的“片”中(一般是一臺或一組MongoDB服務器),它們負責這部分數據集的寫和讀。
無論使用哪種模式,MongoDB都會採取“強 一致性 ”方法(你可以把MongoDB看成CAP 理論中的C-P系統)。 高可用性是通過將數據複製到多個MongoDB節點來實現的,每個節點都能及時成爲一個分片的主服務器——MongoDB會自動處理故障轉移。這能讓你在 維持相當高的寫可用性的同時,擁有強一致性特性,這對一些用例來說非常重要。
mongodb站點裏有一個管 理員中心 提供如下操作信息:
文檔、支持與培訓
MongoDB的文檔位於mongodb.org wiki (PDF ), 遵循Creative Commons License。
10gen設計了MongoDB,以此來解決應用程序開發社區中的大量現實問題。我們可以把MongoDB用作很多有數據庫後端的應用程序的數據存 儲部分,實際的客戶部署情況也證明了這一點。
今天,10gen爲那些在生產應用程序中使用了MongoDB的客戶提供支持 、諮詢和培訓 。在不久的將來,10gen將提供基於雲的服務(例如託管的 MongoDB服務)以及針對大規模MongoDB集羣的高級管理工具。
目前的使用情況
1.3版本的MongoDB已被廣泛用於生產系統中,比較知名的用例 有:
- Boxed Ice
- SourceForge
- Justin.tv
- GitHub
- The Business Insider
- Disqus
當然,還有很多其他的用例 。
今後的開發規劃
MongoDB團隊關於數據存儲的願景非常廣闊,他們認爲目前的1.4版本包含了半數他們想要的特性,明年他們會繼續努力。
- 更好的複製功能:實時、複製集、更多數據耐久性選項
- 可用於生產環境的分片
- 內嵌文檔方面的更多特性
- 提 供更多原子更新操作符
- 單服務器耐久性
- 全文檢索
查看英文原文: MongoDB Growing Up: Release 1.4 and Commercial Support by 10gen