mongodb主要用來幹嘛,什麼時候用,存什麼樣的數據?
簡介MongoDB[1] 是一個基於分散式文件存儲的資料庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。
MongoDB[2] 是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。他支持的數據結構非常鬆散,是類似json的bson格式,因此可以存儲比較複雜的數據類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能,而且還支持對數據建立索引。
特點它的特點是高性能、易部署、易使用,存儲數據非常方便。主要功能特性有:*面向集合存儲,易存儲對象類型的數據。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)。[3] [4] MongoDB已經在多個站點部署,其主要場景如下:1)網站實時數據處理。它非常適合實時的插入、更新與查詢,並具備網站實時數據存儲所需的複製及高度伸縮性。2)緩存。由於性能很高,它適合作為信息基礎設施的緩存層。在系統重啟之後,由它搭建的持久化緩存層可以避免下層的數據源過載。3)高伸縮性的場景。非常適合由數十或數百台伺服器組成的資料庫,它的路線圖中已經包含對MapReduce引擎的內置支持。不適用的場景如下:1)要求高度事務性的系統。2)傳統的商業智能應用。3)複雜的跨文檔(表)級聯查詢。[4] 系統介紹分散式文件系統(Distributed File System)是指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網路與節點相連。分散式文件系統的設計基於客戶機/伺服器模式。一個典型的網路可能包括多個供多用戶訪問的伺服器。另外,對等特性允許一些系統扮演客戶機和伺服器的雙重角色。HBase是一個分散式的、面向列的開源資料庫,該技術來源於 Fay Chang 所撰寫的Google論文「Bigtable:一個結構化數據的分散式存儲系統。Yonghong Data Mart是基於自有技術研發的一款數據存儲、數據處理的軟體。Yonghong Data Mart的分散式文件存儲系統 (ZDFS)是在Hadoop HDFS基礎上進行的改造和擴展,將伺服器集群內所有節點上存儲的文件統一管理和存儲。適用場景MongoDB 的主要目標是在鍵/值存儲方式(提供了高性能和高度伸縮性)和傳統的RDBMS 系統(具有豐富的功能)之間架起一座橋樑,它集兩者的優勢於一身。根據官方網站的描述,Mongo 適用於以下場景。● 網站數據:Mongo 非常適合實時的插入,更新與查詢,並具備網站實時數據存儲所需的複製及高度伸縮性。● 緩存:由於性能很高,Mongo 也適合作為信息基礎設施的緩存層。在系統重啟之後,由Mongo 搭建的持久化緩存層可以避免下層的數據源過載。● 大尺寸、低價值的數據:使用傳統的關係型資料庫存儲一些數據時可能會比較昂貴,在此之前,很多時候程序員往往會選擇傳統的文件進行存儲。● 高伸縮性的場景:Mongo 非常適合由數十或數百台伺服器組成的資料庫,Mongo 的路線圖中已經包含對MapReduce 引擎的內置支持。● 用於對象及JSON 數據的存儲:Mongo 的BSON 數據格式非常適合文檔化格式的存儲及查詢。MongoDB 的使用也會有一些限制,例如,它不適合於以下幾個地方。● 高度事務性的系統:例如,銀行或會計系統。傳統的關係型資料庫目前還是更適用於需要大量原子性複雜事務的應用程序。● 傳統的商業智能應用:針對特定問題的BI 資料庫會產生高度優化的查詢方式。對於此類應用,數據倉庫可能是更合適的選擇。● 需要SQL 的問題。應用案例下面列舉一些公司MongoDB的實際應用:[7]- 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。
一年多一直在使用mongodb,基本上從對mongodb不懂的小白,到現在操作mongodb無任何壓力,最近的一個項目在做mongodb副本集的管理,三組機器做一個副本集,大概要管幾十台上百台副本集,主要用來自動化發布,構建副本集(我們的mongo副本集部署在docker中),所以在寫各種mongo shell的代碼實現,說白了就是調用mongo的commands。看到這個問題特來回答一下。
mongodb眾所周知不支持事務,所以需要強事務的業務根本不能考慮mongodb。
mongodb的優勢就是文檔存儲:
1. 業務經常變動,需要不時的添加欄位,那麼mongodb比較適合,關係型資料庫添加欄位的複雜度也還好
2. 嵌套文檔,業務數據比較複雜,適合嵌套文檔式存儲,那麼mongodb非常合適,這個關係型資料庫比較難搞,雖然MySQL和pg也有文檔存儲,但MySQL的不成熟,pg畢竟現在生產中使用還是偏少,個人也不了解,這裡不談。但這不僅僅這一點優勢,具體下面會細說。
3. upsert支持,查詢速度也不慢
4. 高可用的副本集支持
5. 查詢語法非常豐富,嵌套文檔查詢功能非常強大,不是重度用戶可能不能理解
下面說說一個具體的使用事例:
項目的一條數據在10kb左右,如果使用關係型資料庫那麼需要將這條數據拆分成大概幾百條左右,建造多個表,設計較複雜,這種數據大概在一百萬條左右,想想拆分後在十幾億的數據量就可怕。打平後的數據什麼DB也都可以拿下,只是一百萬變十幾億比較恐怖而已。
如果採用MySQL存儲,每次查詢需要使用外鍵查詢多個表,從這些表中拉取數據,性能肯定要下降很多,比不上只在一個表查詢,而且只拉取少兩個數量級的數據。查詢也還好,業務允許可以對結果做緩存,放到redis里去。
但是重點來了,需求要增量更新部分數據,這時候需要更新多個表,根本沒法做到原子性(注意事務不是原子操作),當然也可以使用cas等技術補償,達到最終一致性。但使用mongodb存儲只需要update一條數據,對相應的嵌套文檔中內容更新,可以做到原子性,是不是很方便?
具體說說該項目的難點,查詢無法使用緩存,可能會很吃驚,但是業務決定了確實做不了,而且增量更新的量達到上萬的QPS,如果不能保證原子性想想多麼可怕!
所以mongodb在這裡幫了大忙,關係型資料庫解決不了這個難題。
有人可能要問,mongodb沒有事務,上游數據寫入也會有問題,你不可能所有數據都存一個表吧?
當然不是的,我們mongodb里的數據是從MySQL中清洗出來存到mongodb中的,mongodb只做單點的業務需求,綜合的數據還是在MySQL中。
此項目我們用了上百個副本集,保證系統的高可用,這些副本集配置只要一條shell就搞定,如果用MySQL的主從不知道怎麼配(我自己不懂),估計DBA得忙死,而該項目完全不需要也沒用到DBA。
說了這麼多mongo的優點,也說說他的缺點:
1. 查詢優化器和MySQL沒法比
2. 不支持reload,只能冷重啟,初始化配置的時候比較麻煩
3. 沒有事務,不敢存儲第一手數據,多用來做備份數據的存儲
mongodb可以做很多事情,取決於你腦洞,性能不差,存一些相對不重要的數據,mongodb嵌套文檔功能強大,多看看官方文檔挖掘挖掘有用信息,每次都能發現驚喜。
希望對你有用!
文中的圖片,是我學習MongoDB之後做的技術分享PPT,可以關注我後發私信「資料」兩個字,我會將完整PPT的下載鏈接發給你,只供個人學習使用喲。
- 什麼是MongoDB
首先,我們對MongoDB下一個定義,它是一個資料庫;再稍微詳細一點兒,它是一個開源的、基於分散式文件存儲的、非關係型資料庫。說到非關係型資料庫,最有名的可能就是Redis了,它是一種Key,Value類型的資料庫,而MongoDB,它是文檔型資料庫的一種,它的存儲方式類似於JSON。
我們常用的關係型資料庫,在有著事務一致性 、支持複雜SQL、成熟、穩定等優點的同時,與此同時,也有諸如數據結構固定 、需要停機遷移等缺點。而MongoDB正是對關係型資料庫進行了完美的補充,它有著數據模式自由 、便於彈性擴展的優點。
MongoDB中的一些基本概念,和關係型資料庫對照著看,還是很好理解的:
MongoDB中的文檔相當於MySQL裡面的一行數據(Record):
MongoDB中的集合相當於MySQL裡面的一張表(Table):
什麼時候用MongoDB
MongoDB更多適用於大數據量、高並發、弱事務、不確定數據類型的應用; 特別是這裡的「不確定數據類型」,也是MongoDB最大的特點之一。
在以往的關係型資料庫中,我們需要提前定義一個表的表結構,當表結構發生改變的時候,我們需要執行DDL語句。而MongoDB數據類型是很自由的,表中的每一行數據實際上都是一個JSON串,在同一張表中,每一個JSON串中的鍵值數量可以是不同的,鍵的內容可以是不同的,甚至是兩個完全不同的JSON串可以共存在一張表中,並且MongoDB是無需事先創建表結構或修改表結構,所有的改變都是動態的。
但是MongoDB不適用高度事務性的系統;它可以用於對象及JSON數據的存儲,或者是一些大尺寸,低價值的數據存儲,而且由於性能很高,MongoDB也適合作為應用的緩存層。
所以總結來說,關係型資料庫和非關係型資料庫MongoDB是不存在誰替代誰的問題,他們應該是各有優勢,相互補充的。就好像我們平時用的無線鍵盤和機械鍵盤一樣,無線鍵盤靈活輕便、外觀比較時尚,而機械鍵盤手感出色、跪起來很舒服,不傷膝蓋,各有優勢。
以上是我對MongoDB簡單分享,如果大家想更深入的了解MongoDB,可以隨時找我交流,我是一個喜歡分享的人,比如你們很多人家裡的無線路由器,都設密碼,不在家的時候還會把無線關了,一點分享的精神都沒有。而我,就一直開著無線路由器,也從不設密碼,讓周圍的人可以搜到我的信號,連接成功,我就會很開心。雖然我沒裝寬頻,但我覺得這並不重要,因為我的分享,給了他們帶來了希望和快樂。
希望我的解答能幫助你!
這個主要看業務,大部分用於存儲一些日誌,統計相關的數據,如果不要求事物的話mongo是很好的選擇,天生具備分散式擴展,大數據量存儲。我們是用java操作,用的spring data mongodb,具體你可以百度猿天地,裡面有視頻教程
是一種存儲json對象,並提供快速查詢,刪除和更新的新一代資料庫服務軟體。可以類比mysql或者sqlserver。但跟傳統資料庫不同,它不依賴schema(類似mysql的table定義)和關係約束。它可以存任何json對象,並提供多種方法進行查詢,聚合,映射。
由於原生json支持,特別適合作為node的資料庫。node中比較知名的mongoose,把mongodb進行了包裝,提供schema檢驗,關係查詢,等傳統sql的功能,通過promise提供並行批量資料庫操作,事務性也可以由第三方插件提供。再結合redis的內存緩存服務,和kareem提供的hook功能。基本上可以優雅的完成自動緩存查詢,自動緩存更新。因此,用node快速開發情況下會選擇mongodb。
不抄百度,純經驗回答,mongo作為存儲json最方便的nosql資料庫。主要兩種情況下使用,1,小網站做著玩,對安全性要求並不高,也沒有事務性需求,2,超大型網站,用於存儲非事務性或非關鍵性數據,用於分散式數據存取或有分庫需求
推薦閱讀: