瞭解mongodb

本文大綱

基礎瞭解mongodb(mongodb介紹,跟其他nosql區別,跟內存服務器區別等,使用場景)

 在使用前,強力建議看哈http://wenku.baidu.com/link?url=luqHFDarGTCW5KgDl1eHs8oF9LSbobshfqmvcASYvj-AdluLtiQ3ZKduduEl2M_6GGJb8zfORDyERdquE33W6WzVMN2OiYtwifKbBOXWudK

一、前言

  做個日誌服務器,多臺服務器通過log4j配置,把日誌以json格式輸入到mongodb服務器,每日大概1000萬日誌量,然後後臺提供接口供日誌查詢。

    爲什麼選擇mongodb:

     1:是因爲他的訪問速度很快,尤其是在創建了索引下比mysql,oracle都快。

     2:支持log4J直接入庫,支持json格式入庫等等

     3:mongodb的聚合框架支持所有類似sql的查詢

     4:參考下面的

 

二、MongoDB簡介

  MongoDB是一個高性能,開源,無模式的文檔型數據庫,是當前NoSql數據庫中比較熱門的一種。它在許多場景下可用於替代傳統的關係型數據庫或鍵/值存儲方式。Mongo使用C++開發。Mongo的官方網站地址是:http://www.mongodb.org/,讀者可以在此獲得更詳細的信息。

小插曲:什麼是NoSql?

  NoSql,全稱是 Not Only Sql,指的是非關係型的數據庫。下一代數據庫主要解決幾個要點:非關係型的、分佈式的、開源的、水平可擴展的。原始的目的是爲了大規模web應用,這場運動開始於2009年初,通常特性應用如:模式自由、支持簡易複製、簡單的API、最終的一致性(非ACID)、大容量數據等。NoSQL被我們用得最多的當數key-value存儲,當然還有其他的文檔型的、列存儲、圖型數據庫、xml數據庫等。

  特點:

  高性能、易部署、易使用,存儲數據非常方便。主要功能特性有:

  • 面向集合存儲,易存儲對象類型的數據。
  • 模式自由。
  • 支持動態查詢。
  • 支持完全索引,包含內部對象。
  • 支持查詢。
  • 支持複製和故障恢復。
  • 使用高效的二進制數據存儲,包括大型對象(如視頻等)。
  • 自動處理碎片,以支持雲計算層次的擴展性
  • 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++語言的驅動程序,社區中也提供了對Erlang及.NET等平臺的驅動程序。
  • 文件存儲格式爲BSON(一種JSON的擴展)。
  • 可通過網絡訪問。

  功能:

  • 面向集合的存儲:適合存儲對象及JSON形式的數據。
  • 動態查詢:Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
  • 完整的索引支持:包括文檔內嵌對象及數組。Mongo的查詢優化器會分析查詢表達式,並生成一個高效的查詢計劃。
  • 查詢監視:Mongo包含一個監視工具用於分析數據庫操作的性能。
  • 複製及自動故障轉移:Mongo數據庫支持服務器之間的數據複製,支持主-從模式及服務器之間的相互複製。複製的主要目標是提供冗餘及自動故障轉移。
  • 高效的傳統存儲方式:支持二進制數據及大型對象(如照片或圖片)
  • 自動分片以支持雲級別的伸縮性:自動分片功能支持水平的數據庫集羣,可動態添加額外的機器。

  適用場合:

  • 網站數據:Mongo非常適合實時的插入,更新與查詢,並具備網站實時數據存儲所需的複製及高度伸縮性。
  • 緩存:由於性能很高,Mongo也適合作爲信息基礎設施的緩存層。在系統重啓之後,由Mongo搭建的持久化緩存層可以避免下層的數據源 過載。
  • 大尺寸,低價值的數據:使用傳統的關係型數據庫存儲一些數據時可能會比較昂貴,在此之前,很多時候程序員往往會選擇傳統的文件進行存儲。
  • 高伸縮性的場景:Mongo非常適合由數十或數百臺服務器組成的數據庫。Mongo的路線圖中已經包含對MapReduce引擎的內置支持。
  • 用於對象及JSON數據的存儲:Mongo的BSON數據格式非常適合文檔化格式的存儲及查詢。

         與關係型數據庫相比,MongoDB的優點:

                   性能優越,在於查詢功能比較強大,能存儲海量數據        

         與關係型數據庫相比,MongoDB的缺點:
       ①mongodb不支持事務操作。
             所以事務要求嚴格的系統(如果銀行系統)肯定不能用它。(這點和優點①是對應的)
       ②mongodb佔用空間過大。
             關於其原因,在官方的FAQ中,提到有如下幾個方面:
              1、空間的預分配:爲避免形成過多的硬盤碎片,mongodb每次空間不足時都會申請生成一大塊的硬盤空間,而且申請的量從64M、128M、256M那 樣的指數遞增,直到2G爲單個文件的最大體積。隨着數據量的增加,你可以在其數據目錄裏看到這些整塊生成容量不斷遞增的文件。

             2、字段名所佔用的空間:爲了保持每個記錄內的結構信息用於查詢,mongodb需要把每個字段的key-value都以BSON的形式存儲,如果 value域相對於key域並不大,比如存放數值型的數據,則數據的overhead是最大的。一種減少空間佔用的方法是把字段名儘量取短一些,這樣佔用 空間就小了,但這就要求在易讀性與空間佔用上作爲權衡了。我曾建議作者把字段名作個index,每個字段名用一個字節表示,這樣就不用擔心字段名取多長 了。但作者的擔憂也不無道理,這種索引方式需要每次查詢得到結果後把索引值跟原值作一個替換,再發送到客戶端,這個替換也是挺耗費時間的。現在的實現算是 拿空間來換取時間吧。

             3、刪除記錄不釋放空間:這很容易理解,爲避免記錄刪除後的數據的大規模挪動,原記錄空間不刪除,只標記“已刪除”即可,以後還可以重複利用。

             4、可以定期運行db.repairDatabase()來整理記錄,但這個過程會比較緩慢

         ③MongoDB沒有如MySQL那樣成熟的維護工具,這對於開發和IT運營都是個值得注意的地方。

          同時mysql等sql語言有很多框架支持,比如hibernate,ibatis。

      memcachedredis區別

         memcachedredis 是內存型數據庫,數據保存在內存中,適合做緩存服務器

         memcached基於磁盤的數據庫

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章