monggoDB學習筆記

1、mongo是什麼

關鍵詞:分佈式、可擴展、介於關係與非關係數據庫之間、文檔存儲、JSON格式存儲(可對字段建索引,實現關係數據庫的某些功能)、默認監聽端口27017

MongoDB是一個基於分佈式文件存儲的開源數據庫系統。由C++語言編寫。旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。嚴格來說屬於NoSQL.

MongoDB是一個介於關係數據庫和非關係數據庫(nosql)之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。

MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似於 JSON 對象,叫BSON(即二進制形式的鍵值對)。字段值可以包含其他文檔,數組及文檔數組

基本概念:文檔、集合、數據庫

SQL術語/概念 MongoDB術語/概念 解釋/說明
database database 數據庫
table collection 數據庫表/集合
row document 數據記錄行/文檔
column field 數據字段/域
index index 索引
table joins   表連接,MongoDB不支持
primary key primary key 主鍵,MongoDB自動將_id字段設置爲主鍵

文檔是一個鍵值(key-value)對(即BSON)。MongoDB 的文檔不需要設置相同的字段,並且相同的字段不需要相同的數據類型,這與關係型數據庫有很大的區別,也是 MongoDB 非常突出的特點。----->即集合無固定模式

如:{"site":"www.runoob.com", "name":"菜鳥教程"}

需要注意的是:

  1. 文檔中的鍵/值對是有序的。
  2. 文檔中的值不僅可以是在雙引號裏面的字符串,還可以是其他幾種數據類型(甚至可以是整個嵌入的文檔)。
  3. MongoDB區分類型和大小寫。
  4. MongoDB的文檔不能有重複的鍵。
  5. 文檔的鍵是字符串。除了少數例外情況,鍵可以使用任意UTF-8字符。

集合就是 MongoDB 文檔組,類似於 RDBMS (關係數據庫管理系統:Relational Database Management System)中的表格。

集合存在於數據庫中,集合沒有固定的結構,這意味着你在對集合可以插入不同格式和類型的數據,但通常情況下我們插入集合的數據都會有一定的關聯性。如,比如,我們可以將以下不同數據結構的文檔插入到集合中:

  1. {"site":"www.baidu.com"} {"site":"www.google.com","name":"Google"} {"site":"www.runoob.com","name":"菜鳥教程","num":5}

當第一個文檔插入時,集合就會被創建。

2、mongo能做什麼

MongoDB是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。他支持的數據結構非常鬆散,是類似json的bjson格式,因此可以存儲比較複雜的數據類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言,幾乎可以實現類似關係數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。

整體架構:

3、mongo特性

  • MongoDB的提供了一個面向文檔存儲,操作起來比較簡單和容易。
  • 你可以在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
  • 你可以通過本地或者網絡創建數據鏡像,這使得MongoDB有更強的擴展性。
  • 如果負載的增加(需要更多的存儲空間和更強的處理能力) ,它可以分佈在計算機網絡中的其他節點上這就是所謂的分片。
  • Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
  • MongoDb 使用update()命令可以實現替換完成的文檔(數據)或者一些指定的數據字段 。
  • Mongodb中的Map/reduce主要是用來對數據進行批量處理和聚合操作。
  • Map和Reduce。Map函數調用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數進行處理。
  • Map函數和Reduce函數是使用Javascript編寫的,並可以通過db.runCommand或mapreduce命令來執行MapReduce操作。
  • GridFS是MongoDB中的一個內置功能,可以用於存放大量小文件。
  • MongoDB允許在服務端執行腳本,可以用Javascript編寫某個函數,直接在服務端執行,也可以把函數的定義存儲在服務端,下次直接調用即可。
  • MongoDB支持各種編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
  • MongoDB把數據存儲在文件中(默認路徑爲:/data/db),爲提高效率使用內存映射文件進行管理。

  • MongoDB安裝簡單。

分片:(高吞吐量與處理大數據量)

分片是在多臺機器之間存儲數據記錄的過程,MongoDB是滿足數據增長需求的方法。 隨着數據的大小增加,單個機器可能不足以存儲所有數據,也不能提供可接受的讀寫吞吐量。 分片解決了水平縮放的問題。 使用分片,可以添加更多的機器來支持數據增長和讀寫操作的需求。

在上圖中,有三個主要組件 -

  • 分片(Shards) - 分片用於存儲數據。它們提供高可用性和數據一致性。 在生產環境中,每個分片是一個單獨的副本集,該副本集保存了集羣整體數據的一部分(若只使用單一服務器,則包含整體數據。一個副本集的各個副本一般分佈在不同分區中(容錯性,分片宕機時,啓動其他副本),即有一個主導副本,接受該副本集中所有讀寫操作,其它從副本集從主副本複製數據,保持同步,每個副本集一般還包括一個仲裁者,只有投票權,不存儲數據)。

  • 複製詳細機制參考https://www.cnblogs.com/duanxz/p/10730096.html

  • 配置服務器(Config Servers) - 配置服務器存儲集羣的元數據(集羣各種信息,如分片、分塊情況)。 該數據包含集羣的數據集與分片的映射。查詢路由器使用此元數據將操作定位到特定的分片。 在生產環境中,分片集羣正好有3個配置服務器(默認需要3個,保證高度一致性)。

  • 查詢路由器(Query Routers) - 查詢路由器基本上是 mongos實例,與客戶端應用程序的接口和直接操作到適當的分片。 查詢路由器處理並將操作定向到碎片,然後將結果返回給客戶端。 分片集羣可以包含多個查詢路由器來分割客戶端請求負載。 客戶端向一個查詢路由器發送請求。 一般來說,分片集羣有許多查詢路由器。

原文鏈接:https://www.yiibai.com/mongodb/mongodb_sharding.html#article-start
 

4、同類數據庫比較

關係數據庫:目前,它是結構化數據存儲網絡和商務應用的主導技術,遵循A(原子性)C(一致性)I(獨立性)D(持久性)原則

分佈式系統:多臺計算機 、通信軟件<------>計算機網絡<---------> 多臺計算機 、通信軟件。分佈式系統是建立在網絡之上的軟件系統,故具有高度的內聚性和透明性。網絡和分佈式系統之間的區別更多的在於高層軟件(特別是操作系統),而不是硬件

分佈式系統可以應用在在不同的平臺上如:Pc、工作站、局域網和廣域網上等。

NoSQL:指的是非關係型的數據庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關係型數據庫的數據庫管理系統的統稱。用於超大規模數據的存儲,這些類別數據不需要固定模式,無需多餘操作便可橫向擴展(水平擴展)

爲什麼要用NoSQL?

數據爆炸性增長,如通過第三方平臺(百度、谷歌等)爬取數據,用戶的各種信息增長迅速。若要對這些數據進行挖掘,SQL數據庫已經不適合這些應用了, NoSQL數據庫的發展也卻能很好的處理這些大的數據。

RDBMS vs NoSQL

RDBMS
- 高度組織化結構化數據
- 結構化查詢語言(SQL) (SQL)
- 數據和關係都存儲在單獨的表中。
- 數據操縱語言,數據定義語言
- 嚴格的一致性
- 基礎事務

NoSQL
- 代表着不僅僅是SQL
- 沒有聲明性查詢語言
- 沒有預定義的模式
-鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫
- 最終一致性,而非ACID屬性
- 非結構化和不可預知的數據
- CAP定理
- 高性能,高可用性和可伸縮性

mongoDB解析  

mongoDB =  shards(分片,包含mongod,即分片存儲數據) + mongos(路由處理,負責路由的選擇和協調)+ config server(配置服務器,存儲集羣的信息,包括分片與塊數據信息,供mongos查詢) + client(客戶端)

分片粒度:數據庫粒度與集合粒度(主要,即將集合中的文檔進行劃分爲塊,存儲在集羣各個分片中)。

分片鍵:shard key,採用某一個字段或多個字段的組合,用以劃分和定位文檔所屬分片以及

分塊:分塊,塊是位於一個分片中的一段連續的分片鍵範圍。單獨的塊可出現在任意分片上,並且塊只是邏輯上的,並非物理上連續的文檔。即一個文檔分片鍵屬於某個塊時,只表明可在該塊所在的分片上找到該分片鍵所指定的文檔。與分片中的文檔集合中的文檔排列沒有必然關係。

負載均衡:拆分+遷移。

閾值觸發機制----->拆分(分塊,一種邏輯上的操作,只操作塊的元數據,不會影響文檔的物理存儲順序)與遷移(需要物理操作,即文檔以塊爲單位由一個分片遷移至另一分片)。

拆分(塊分裂):即一旦分片的某一數據塊上存儲的文檔數或總大小達到某一設定的閾值時,觸發系統的分塊機制,一般是對半拆分塊,將一個塊分成兩個數量相同的塊。

遷移(平衡):當所有分片中文檔數最多分片與最少分片相差達到設定的閾值時(8),觸發遷移機制,即從數據量多的分片遷移至數據量少的分片,以達到負載均衡的目的。

參考網址:https://blog.csdn.net/wanght89/article/details/77842336

                  https://www.cnblogs.com/duanxz/p/10730121.html

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