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在16個月前,於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網站裡有一個管 理員中心 提供如下操作資訊: 管理員操作介面 託管中 心 匯入匯出工具 監視 及診斷 、Shell 中的DBA操作 數 據庫剖析 分區 、複製 生 產環境筆記 安 全與身分識別驗證 架 構與組件 備份 、故障檢修 、耐久性與修複 文檔、支援與培訓
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
轉自:http://www.infoq.com/cn/news/2010/04/mongodb