mogon簡介
MongoDB 是一個基于分布式文件存儲的數據庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。
MongoDB 是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。
NoSQL簡介
NoSQL:非關系型數據庫(不僅僅是SQL)。目前關系型數據庫占絕大多數。
關系型數據庫遵循ACID規則
- A (Atomicity) 原子性原子性很容易理解,也就是說事務里的所有操作要么全部做完,要么都不做,事務成功的條件是事務里的所有操作都成功,只要有一個操作失敗,整個事務就失敗,需要回滾。
- C (Consistency) 一致性一致性也比較容易理解,也就是說數據庫要一直處于一致的狀態,事務的運行不會改變數據庫原本的一致性約束。
- I (Isolation) 獨立性所謂的獨立性是指并發的事務之間不會互相影響,如果一個事務要訪問的數據正在被另外一個事務修改,只要另外一個事務未提交,它所訪問的數據就不受未提交事務的影響。
- D (Durability) 持久性持久性是指一旦事務提交后,它所做的修改將會永久的保存在數據庫上,即使出現宕機也不會丟失。
分布式計算的優點
可靠性(容錯) :分布式計算系統中的一個重要的優點是可靠性。一臺服務器的系統崩潰并不影響到其余的服務器。
可擴展性:在分布式計算系統可以根據需要增加更多的機器。
資源共享:共享數據是必不可少的應用,如銀行,預訂系統。
靈活性:由于該系統是非常靈活的,它很容易安裝,實施和調試新的服務。
更快的速度:分布式計算系統可以有多臺計算機的計算能力,使得它比其他系統有更快的處理速度。
開放系統:由于它是開放的系統,本地或者遠程都可以訪問到該服務。
更高的性能:相較于集中式計算機網絡集群可以提供更高的性能(及更好的性價比)。
分布式計算的缺點
故障排除: :故障排除和診斷問題。
**軟件: **更少的軟件支持是分布式計算系統的主要缺點。
網絡:網絡基礎設施的問題,包括:傳輸問題,高負載,信息丟失等。
**安全性: **開發系統的特性讓分布式計算系統存在著數據的安全性和共享的風險等問題。
NoSQL 優勢
NoSQL用于超大規模數據的存儲。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數據)。這些類型的數據存儲不需要固定的模式,無需多余操作就可以橫向擴展。
RDBMS vs NoSQL
**RDBMS **
- 高度組織化結構化數據
- 結構化查詢語言(SQL)
- 數據和關系都存儲在單獨的表中。
- 數據操縱語言,數據定義語言
- 嚴格的一致性
- 基礎事務
**NoSQL **
- 代表著不僅僅是SQL
- 沒有聲明性查詢語言
- 沒有預定義的模式
- 鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫
- 最終一致性,而非ACID屬性
- 非結構化和不可預知的數據
- CAP定理
- 高性能,高可用性和可伸縮性
CAP定理(CAP theorem)
在計算機科學中, CAP定理(CAP theorem), 又被稱作 布魯爾定理(Brewer's theorem), 它指出對于一個分布式計算系統來說,不可能同時滿足以下三點:
- 一致性(Consistency) :所有節點在同一時間具有相同的數據
- 可用性(Availability) :保證每個請求不管成功或者失敗都有響應
- 分隔容忍(Partition tolerance) :系統中任意信息的丟失或失敗不會影響系統的繼續運作
CAP理論的核心是:一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求,最多只能同時較好的滿足兩個。因此,根據 CAP 原理將 NoSQL 數據庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三 大類:
- CA(單點集群):滿足一致性,可用性的系統,通常在可擴展性上不太強大。
- CP(滿足一致性):通常性能不是特別高。
- AP(滿足可用性):分區容忍性的系統,通常可能對一致性要求低一些。
NoSQL的優點/缺點
- 優點:
- 高可擴展性
- 分布式計算
- 低成本
- 架構的靈活性,半結構化數據
- 沒有復雜的關系
- 缺點:
- 沒有標準化
- 有限的查詢功能(到目前為止)
- 最終一致是不直觀的程序
BASE
CAP理論的核心是:一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求,最多只能同時較好的滿足兩個。BASE是NoSQL數據庫通常對可用性及一致性的弱要求原則:
- Basically Availble(基本可用)。
- Soft-state(軟狀態/柔性事務): "Soft state" 可以理解為"無連接"的, 而 "Hard state" 是"面向連接"的。
- Eventual Consistency(最終一致性): 也是 ACID 的最終目的。
ACID vs BASE
| ACID | BASE |
|:-------:|:-------:|
| 原子性(Atomicity) | 基本可用(Basically Available) |
| 一致性(Consistency) | 軟狀態/柔性事務(Soft state) |
| 隔離性(Isolation) | 最終一致性 (Eventual consistency) |
| 持久性 (Durable) | |
NoSQL 數據庫分類
| 類型 | 部分代表 | 簡介 |
|:-------:|:-------:|:----------|
| 列存儲 | Hbase | 顧名思義,是按列存儲數據的。最大的特點是方便存儲結構化和半結構化數據,方便做數據壓縮,對針對某一列或者某幾列的查詢有非常大的IO優勢。 |
| 文檔存儲 | MongoDB | 文檔存儲一般用類似json的格式存儲,存儲的內容是文檔型的。這樣也就有有機會對某些字段建立索引,實現關系數據庫的某些功能。 |
| key-value存儲 | Memcache Redis | 可以通過key快速查詢到其value。一般來說,存儲不管value的格式,照單全收。(Redis包含了其他功能) |
| 圖存儲 | FlockDB | 圖形關系的最佳存儲。使用傳統關系數據庫來解決的話性能低下,而且設計使用不方便。 |
| 對象存儲 | Versant | 通過類似面向對象語言的語法操作數據庫,通過對象的方式存取數據。 |
| xml數據庫 | BaseX | 高效的存儲XML數據,并支持XML的內部查詢語法,比如XQuery,Xpath。 |
MongoDB主要特點
- 可以在記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
- 可以通過本地或者網絡創建數據鏡像,使得MongoDB有更強的擴展性。
- 如果負載的增加(需要更多的存儲空間和更強的處理能力) ,可以分布在計算機網絡中的其他節點上,這就是所謂的分片。
- 支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
- 使用update()命令可以實現替換完成的文檔(數據)或者一些指定的數據字段 。
- 其中的Map/reduce主要是用來對數據進行批量處理和聚合操作。
- Map和Reduce。Map函數調用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數進行處理。
- Map函數和Reduce函數是使用Javascript編寫的,并可以通過db.runCommand或mapreduce命令來執行MapReduce操作。
- GridFS是MongoDB中的一個內置功能,可以用于存放大量小文件。
- 允許在服務端執行腳本,可以用Javascript編寫某個函數,直接在服務端執行,也可以把函數的定義存儲在服務端,下次直接調用即可。
Linux平臺安裝MongoDB
1. 下載完安裝包,并解壓 tgz(以下演示的是 64 位 Linux上的安裝) 。
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz # 下載 tar -zxvf mongodb-linux-x86_64-3.0.6.tgz # 解壓 mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb # 將解壓包拷貝到指定目錄
2. MongoDB 的可執行文件位于 bin 目錄下,所以可以將其添加到 PATH 路徑中:
export PATH= /usr/local/mongodb/bin:$PATH
3. 創建數據庫目錄
MongoDB的數據存儲在data目錄的db目錄下,但是這個目錄在安裝過程不會自動創建,所以你需要手動創建data目錄,并在data目錄中創建db目錄。
以下實例中我們將data目錄創建于根目錄下(/)。
注意:/data/db 是 MongoDB 默認的啟動的數據庫路徑(--dbpath)。
mkdir -p /data/db
4. 命令行中運行 MongoDB 服務
你可以再命令行中執行mongo安裝目錄中的bin目錄執行mongod命令來啟動mongdb服務。
注意:如果你的數據庫目錄不是/data/db,可以通過 --dbpath 來指定。
$ ./mongod 2015-09-25T16:39:50.549+0800 I JOURNAL [initandlisten] journal dir=/data/db/journal 2015-09-25T16:39:50.550+0800 I JOURNAL [initandlisten] recover : no journal files present, no recovery needed 2015-09-25T16:39:50.869+0800 I JOURNAL [initandlisten] preallocateIsFaster=true 3.16 2015-09-25T16:39:51.206+0800 I JOURNAL [initandlisten] preallocateIsFaster=true 3.52 2015-09-25T16:39:52.775+0800 I JOURNAL [initandlisten] preallocateIsFaster=true 7.7
5. MongoDB后臺管理 Shell
如果你需要進入MongoDB后臺管理,你需要先打開mongodb裝目錄的下的bin目錄,然后執行mongo命令文件。
MongoDB Shell是MongoDB自帶的交互式Javascript shell,用來對MongoDB進行操作和管理的交互式環境。
當你進入mongoDB后臺后,它默認會鏈接到 test 文檔(數據庫):
$ cd /usr/local/mongodb/bin $ ./mongo MongoDB shell version: 3.0.6 connecting to: test Welcome to the MongoDB shell.
由于它是一個JavaScript shell,您可以運行一些簡單的算術運算:
> 2+2 4 3+6 9
現在讓我們插入一些簡單的數據,并對插入的數據進行檢索:
> db.runoob.insert({x:10}) #在runoob表插入key為x,value為10的一條數據 WriteResult({ "nInserted" : 1 }) #成功 db.runoob.find() #查詢runoob表中的所有數據 { "_id" : ObjectId("5604ff74a274a611b0c990aa"), "x" : 10 } #_id為系統為每條數據默認分配的唯一標識(可以自己指定)key為x的值為10
6. MongoDb web 用戶界面
MongoDB 提供了簡單的 HTTP 用戶界面。 如果你想啟用該功能,需要在啟動的時候指定參數 --rest 。
$ ./mongod --dbpath=/data/db --rest
MongoDB 的 Web 界面訪問端口比服務的端口多1000。
如果你的MongoDB運行端口使用默認的27017,你可以在端口號為28017訪問web用戶界面,即地址為:http://localhost:28017。
MongoDb web 用戶界面
MongoDB 概念解析
1. 在mongodb中基本的概念是文檔、集合、數據庫 **
MongoDB 概念解析
MongoDB 概念解析
2. 數據庫(database) **
一個mongodb中可以建立多個數據庫。
MongoDB的默認數據庫為"db",該數據庫存儲在data目錄中。
MongoDB的單個實例可以容納多個獨立的數據庫,每一個都有自己的集合和權限,不同的數據庫也放置在不同的文件中。
"show dbs" 命令可以顯示所有數據的列表。
$ ./mongo MongoDB shell version: 3.0.6 connecting to: test show dbs local 0.078GB test 0.078GB
執行 "db" 命令可以顯示當前數據庫對象或集合。
$ ./mongo MongoDB shell version: 3.0.6 connecting to: test db test
運行"use"命令,可以連接到一個指定的數據庫。
use local switched to db local db local
數據庫也通過名字來標識。數據庫名可以是滿足以下條件的任意UTF-8字符串。
- 不能是空字符串("")。
- 不得含有' '(空格)、.、$、/、\和\0 (空宇符)。
- 應全部小寫。
- 最多64字節。
有一些數據庫名是保留的,可以直接訪問這些有特殊作用的數據庫。
- admin: 從權限的角度來看,這是"root"數據庫。要是將一個用戶添加到這個數據庫,這個用戶自動繼承所有數據庫的權限。一些特定的服務器端命令也只能從這個數據庫運行,比如列出所有的數據庫或者關閉服務器。
- local: 這個數據永遠不會被復制,可以用來存儲限于本地單臺服務器的任意集合。
- config: 當Mongo用于分片設置時,config數據庫在內部使用,用于保存分片的相關信息。
**3. 文檔(document) **
文檔是一個鍵值(key-value)對(即BSON)。MongoDB 的文檔不需要設置相同的字段,并且相同的字段不需要相同的數據類型,這與關系型數據庫有很大的區別,也是 MongoDB 非常突出的特點。
一個簡單的文檔例子如下:
{"site":"www.runoob.com", "name":"菜鳥教程"}
RDBMS 與 MongoDB 對應的術語
- 文檔中的鍵/值對是有序的。
- 文檔中的值不僅可以是在雙引號里面的字符串,還可以是其他幾種數據類型(甚至可以是整個嵌入的文檔)。
- MongoDB區分類型和大小寫。
- MongoDB的文檔不能有重復的鍵。
- 文檔的鍵是字符串。除了少數例外情況,鍵可以使用任意UTF-8字符。
文檔鍵命名規范:
- 鍵不能含有\0 (空字符)。這個字符用來表示鍵的結尾。
- .和$有特別的意義,只有在特定環境下才能使用。
- 以下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。
**4. 集合(collection) **
集合就是 MongoDB 文檔組,類似于 RDBMS (關系數據庫管理系統:Relational Database Management System)中的表格。
集合存在于數據庫中,集合沒有固定的結構,這意味著你在對集合可以插入不同格式和類型的數據,但通常情況下我們插入集合的數據都會有一定的關聯性。
比如,我們可以將以下不同數據結構的文檔插入到集合中:
{"site":"www.baidu.com"} {"site":"www.google.com","name":"Google"} {"site":"www.runoob.com","name":"菜鳥教程","num":5}
當第一個文檔插入時,集合就會被創建。
集合名命名規范:
- 集合名不能是空字符串""。
- 集合名不能含有\0字符(空字符),這個字符表示集合名的結尾。
- 集合名不能以"system."開頭,這是為系統集合保留的前綴。
- 用戶創建的集合名字不能含有保留字符。有些驅動程序的確支持在集合名里面包含,這是因為某些系統生成的集合中包含該字符。除非你要訪問這種系統創建的集合,否則千萬不要在名字里出現$。
固定大小的集合(Capped collections)
它有很高的性能以及隊列過期的特性(過期按照插入的順序). 有點和 "RRD" 概念類似。
Capped collections是高性能自動的維護對象的插入順序。它非常適合類似記錄日志的功能 和標準的collection不同,你必須要顯式的創建一個capped collection, 指定一個collection的大小,單位是字節。collection的數據存儲空間值提前分配的。
要注意的是指定的存儲大小包含了數據庫的頭信息。
db.createCollection("mycoll", {capped:true, size:100000})
- 在capped collection中,你能添加新的對象。
- 能進行更新,然而,對象不會增加存儲空間。如果增加,更新就會失敗 。
- 數據庫不允許進行刪除。使用drop()方法刪除collection所有的行。
- 注意: 刪除之后,你必須顯式的重新創建這個collection。
- 在32bit機器中,capped collection最大存儲為1e9( 1X109)個字節。
*5. 元數據 **
數據庫的信息是存儲在集合中。它們使用了系統的命名空間:
dbname.system.*
在MongoDB數據庫中名字空間 <dbname>.system. 是包含多種系統信息的特殊集合(Collection),如下:
元數據
對于修改系統集合中的對象有如下限制:
- 在{{system.indexes}}插入數據,可以創建索引。但除此之外該表信息是不可變的(特殊的drop index命令將自動更新相關信息)。
- {{system.users}}是可修改的。
- {{system.profile}}是可刪除的。
**6. MongoDB 數據類型 **
MongoDB 數據類型
MongoDB連接
**1. 啟動 MongoDB服務 **
啟動只需要在MongoDB安裝目錄的bin目錄下執行'mongod'即可。
執行啟動操作后,mongodb在輸出一些必要信息后不會輸出任何信息,之后就等待連接的建立,當連接被建立后,就會開始打印日志信息。
既可以使用 MongoDB shell 來連接,也可以使用php來連接。
**2. 通過shell連接MongoDB服務 **
localhost為主機名,這個選項是必須的:
mongodb://localhost $ ./mongo MongoDB shell version: 3.0.6 connecting to: test mongodb://localhostmongodb://localhost
3. MongoDB連接命令格式 **
使用用戶名和密碼連接到MongoDB服務器,你必須使用 'username:password@hostname/dbname**' 格式,'username'為用戶名,'password' 為密碼。
使用用戶名和密碼連接登陸到默認數據庫:
$ ./mongo MongoDB shell version: 3.0.6 connecting to: test mongodb://admin:123456@localhost/
使用用戶名和密碼連接登陸到指定數據庫:
mongodb://admin:123456@localhost/test
連接本地數據庫服務器,端口是默認的。
mongodb://localhost
使用用戶名fred,密碼foobar登錄localhost的admin數據庫。
mongodb://fred:foobar@localhost
使用用戶名fred,密碼foobar登錄localhost的baz數據庫。
mongodb://fred:foobar@localhost/baz
連接 replica pair, 服務器1為example1.com服務器2為example2。
mongodb://example1.com:27017,example2.com:27017
連接 replica set 三臺服務器 (端口 27017, 27018, 和27019):
mongodb://localhost,localhost:27018,localhost:27019
連接 replica set 三臺服務器, 寫入操作應用在主服務器 并且分布查詢到從服務器。
mongodb://host1,host2,host3/?slaveOk=true
直接連接第一個服務器,無論是replica set一部分或者主服務器或者從服務器。
mongodb://host1,host2,host3/?connect=direct;slaveOk=true
當你的連接服務器有優先級,還需要列出所有服務器,你可以使用上述連接方式:
安全模式連接到localhost。
mongodb://localhost/?safe=true
以安全模式連接到replica set,并且等待至少兩個復制服務器成功寫入,超時時間設置為2秒。
mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000
**4. 參數選項說明 **
標準格式:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]