mongodb初步使用體驗

前言

  Mongodb是一個很是有名的緩存數據庫,和它名氣至關的還有redis和hbase。筆者以前使用過redis,memcache和elasticsearch,藉着工做機會,正好能夠好好學習一下mongodb。php

安裝,部署

  筆者在百度搜索下的mongodb官網上沒有看到直接的下載連接,反而還要註冊,比較麻煩。最後是在一篇博文裏找到了直接的下載地址。直接選擇一個較新的以msi爲後綴的下載地址下載便可(筆者的環境是windows7 64位環境)。php的mongodb擴展也可搜索下載便可。在windows下每次啓動mongodb須要在cmd進入對應目錄啓動,比較繁瑣。按照這篇博文的作法,能夠將mongodb註冊爲windows的一個服務,使用起來就很是的方便了。html

  筆者使用的ide是netbean8.2,在裏面插件管理搜索mongodb能夠找到一款小型的mongodb可視化插件,對於簡單的mongodb管理已經足夠了。redis

定義

  MongoDB  是一個基於分佈式文件存儲的數據庫。由C++語言編寫。旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB  是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。(來源:百度百科)sql

  讓咱們來仔細分析下定義:mongodb

  1)分佈式文件存儲。 這個名詞聽着就很厲害。顧名思義,就是存儲的內容不在一臺主機上,而是能夠有多個節點主機,數據分散存在上面。  經過進一步查資料瞭解到, 對於客戶端來講,無需知道數據被拆分了,也無需知道服務端哪一個分片對應哪些數據。數據在分片以前須要運行一個路由進程,進程名爲mongos。這個路由器知道全部數據的存放位置,知道數據和片的對應關係。好吧,的確很神奇。具體能夠參考《淺談MongoDB數據庫分佈式存儲管理》。對於redis,也有相似的集羣和分佈式解決方案,好比Redis Sharding(應用時間較長)和Redis Cluster(redis3.0推出的官方解決方案),參考知乎的這個回答數據庫

  2)介於關係數據庫和非關係數據庫。windows

    關係型數據庫是指mongodb有着相似於傳統關係型數據庫的組織結構。參考下面的對比:數組

    RDBMS:  數據庫(DATABASE) ==》 表(TABLE) ==》 行(ROW) ==>  列(COLUMN)==》 表聯合(TABLE JOI) ==>主鍵(PRIMARYKEY)
緩存

    MONGODB:數據庫(DATABASE) ==》 集合(COLLECTION) ==》 文檔(DOCUMENT) ==>  字段(FIELD) ==》內嵌文檔(embeded docment) ==>主鍵.key爲_id(PRIMARYKEY)服務器

    咱們能夠用相似於sql語句中的增刪改查的語句去操做mongodb,雖然有些麻煩,但仍是能夠很快上手的。

    另外一方面。mongodb也是一個非關係型數據庫。mongodb其實沒有嚴格意義的行和列,而是將數據存儲成文檔。數據結構由鍵值(key=>value)對組成,MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組

 

結構

  

  1. MongoDB在數據存儲上按命名空間來劃分,一個collection是一個命名空間,一個索引也是一個命名空間
  2. 同一個命名空間的數據被分紅不少個Extent,Extent之間使用雙向鏈表鏈接
  3. 在每個Extent中,保存了具體每一行的數據,這些數據也是經過雙向連接鏈接的
  4. 每一行數據存儲空間不只包括數據佔用空間,還可能包含一部分附加空間,這使得在數據update變大後能夠不移動位置
  5. 索引以BTree結構實現

 

存儲策略

 

   以上是mongodb3.0的數據存儲模型。mongodb3.0開始支持WiredTiger存儲引擎,In-Memory引擎也支持不過是企業級別須要收費。如下圖標作個對比:

 

   能夠看到WiredTiger數據引擎,支持文檔級鎖(多個客戶端能夠併發的修改一個集合中多個不一樣的文檔),提升了併發性。

  對於持久化,WiredTiger的作法是:在一個操做開始時,WiredTiger會拷貝該時間點的事務數據快照(snapshot)。快照表示的是內存中數據的一份一致性的視圖。WiredTiger也會以數據一致的方式將快照中的全部數據寫到磁盤全部數據文件中,而且記錄一個檢查點(checkpoint),這個檢查點還能夠扮演恢復點(recovery points)的角色,當MongoDB崩潰重啓後,MongoDB能夠從最後有效的檢查點進行恢復。

 

  衆所周知,mongodb的一大優點就是可使用磁盤來存儲數據。那麼mongodb和操做系統,磁盤的數據交換機制是怎樣的呢?參考這篇文章獲得答案。雖然介紹的是MMAP存儲引擎的機制。但也大同小異。利用操做系統的內存映射,映射到一個虛擬內存的區域。虛擬內存再對應物理內存,若是訪問的數據不在物理內存中,則將數據從磁盤加載到物理內存中。

  • 有了內存映射文件,要訪問的數據就好像都在內存裏面,簡單化了MongoDB訪問和修改數據的邏輯
  • MongoDB讀寫都只是和虛擬內存打交道,剩下都交給OS打理
  • MongoDB佔用內存比redis高,通常適合大數據量存儲

  

優缺點

   優勢:

  •  相似於傳統數據庫的數據訪問方式,支持索引,數據組織更加靈活;
  •  官方提供了分片和主從複製的相關解決方案,使得在設置集羣服務器方面更有優點;
  •  適合大數據量存儲,依賴系統虛擬內存,採用鏡像文件存儲;內存佔用率比較高;
  •     內置數據分析功能(mapreduce)

   缺點:

  •  訪問的QPS不及redis;
  •     不支持事務;
  •     3.0版本如下,不要長時間佔用寫鎖,會致使鎖表。(3.0以上版本採用WiredTiger存儲引擎,聽說是document鎖,不知道性能如何)。  

 

總結

  以上,只是我初次使用mongodb的一點學習總結,不少地方不完善,原理也不是很透徹,甚至很多是直接引用網上別人的文章語句。但我以爲,這也是一個本身學習思考的過程,有必要記錄下來。畢竟信息爆炸的時代,不是每一個人都有時間和有必要去重讀官方文檔和深刻了解細節,畢竟本身的理解尚未到達那個高度,容易掉入紙上談兵的陷阱。在之後具體項目用到的時候再進行學習和總結也會更加的深入一些。

  

參考文檔:

MongoDB架構圖解

MongoDB數據服務的邏輯結構

MongoDB如何存儲數據

Mongodb Wiredtiger存儲引擎實現原理

相關文章
相關標籤/搜索