72
Mongo DB 簡介

Mongo db 簡介

  • Upload
    -

  • View
    1.016

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Mongo db 簡介

Mongo DB 簡介

Page 2: Mongo db 簡介

What is NoSQL?Why NoSQL

MongoDB Introduction

MongoDB HA

MongoDB C# Driver

MongoDB Install & Setup

Page 3: Mongo db 簡介

What is NoSQL?Why NoSQL

MongoDB Introduction

MongoDB HA

MongoDB C# Driver

MongoDB Install & Setup

Page 4: Mongo db 簡介

Relational Database的瓶頸

0 Lock機制保證ACID

0Query cache為Table等級

0 Shema 固定

0連線數無法應付訪問量的增加

0資料量大時IO壓力沉重

0未來連線數只會越來越大,資料量只會越來越多

0擴展不易

Page 5: Mongo db 簡介

RDB+Memcached

0傳統的文件快取不能多台Server共享

0大量的的小資料快取還是有很大的IO壓力

0內部網路速度越來越快

0記憶體越來越便宜

0Memcached變成一種很流行很實用的技術

Page 6: Mongo db 簡介

Memcached(1/3)

Page 7: Mongo db 簡介

Memcached(2/3)

函式庫

Memcached Memcached Memcached

演算法

應用程式

Page 8: Mongo db 簡介

Memcached(3/3)

0高性能

0分散式儲存

0Name-Value Pair

0Key 的長度被限制在 250 characters

0儲存的資料不能超過 1 megabyte

0沒有分散式運算控制器,透過儲存時的演算法達成分散式

0只能分擔讀取的壓力

Page 9: Mongo db 簡介

NoSQL(1/6)

0去掉Relation DB的關聯特性,不嚴謹的保證ACID

0數據間無關聯,可分散式儲存,且增加擴展性

0不用考慮關聯性,增加讀寫性能

0 Cache為記錄級的,非table級,粒度較小

0無固定的Schema,除去大量資料在修改schema時的效能影響

0節省開發成本及維護成本

0不支援SQL

0不保證Transaction

Page 10: Mongo db 簡介

NoSQL(2/6)

0適合

0大量寫入跟更新的資料,資料無需進行關聯式操作,EX:LOG類型,使用者操作紀錄、系統運行記錄,簡訊發送記錄

0大尺寸但低價值的資料,NoSQL成本較低。

0需要大量分散式存取的資料,可支援MapReduce,存取數十或數百台資料伺服器

0不適合0交易一致性需求高的, NoSQL不嚴謹保證ACID

0需要關聯性儲存的資料

0要使用傳統SQL的solution

Page 11: Mongo db 簡介

NoSQL(3/6)

儲存類型 NoSQL DB 特性

Doucument MongoDB(10 gen)CouchDB(Apache)

使用JSON格式來儲存,內容為Document

型,因此可以對某些屬性建立索引,來實現一些RDB的功能

Row Hbase(Hadoop)Cassandra(Facebook)Hypertable

使用row方式來儲存,最大特性是方便儲

存結構化和半結構化數據,方便做數據壓縮,針對一列或某幾列的查詢有很大

的IO優勢

Key-Value Redis(VMware)Flare(green.jp)SimpleDB(Amazon)

可透過鍵值快速找的值,對值的內容格

式不加以限制

Graph Neo4JFlockDB(Twitter)

方便用來儲存大量的圖片數據

Page 12: Mongo db 簡介

NoSQL(4/6)

0RDB已死?

0NoSQL vs. RDB

0功能

0性能

0擴展

0NoSQL+RDB

0選擇適合的NoSQL

0資料結構、數據特性

0 Insert、Update的比例

0 查詢的需求

Page 13: Mongo db 簡介

NoSQL(5/6)

0RDB專門負責處理擅長的關係存儲,NoSQL作為資料的存儲

0節省RDB的IO開銷

0提高SQL cache的hit rate

0提昇RDB主從同步效率

0提昇RDB備份與恢復效率

0提高擴展性及系統承載量

Page 14: Mongo db 簡介

NoSQL(6/6)

NOSQL

Page 15: Mongo db 簡介
Page 16: Mongo db 簡介
Page 17: Mongo db 簡介

What is NoSQL?Why NoSQL

MongoDB Introduction

MongoDB HA

MongoDB C# Driver

MongoDB Install & Setup

Page 18: Mongo db 簡介

MongoDB(1/3)

0 open source

0 C++開發

0高性能

0無Schema

0Doucument儲存

0存儲格式為BSON(一種JSON的擴展)

0支持RUBY,PYTHON,JAVA,PHP,C++,C#等多種語言

Page 19: Mongo db 簡介

MongoDB(2/3)

0支援索引的建立

0支援動態查詢

0支援replica與Sharding

0使用高效的二進位資料存儲,包括大型物件(如影片)

0BSON格式的資料(文檔)存儲有尺寸限制,最大為16M

0MongoDB可運行在Linux、Windows或OS X平台,支援32位和64位應用,默認埠為27017。推薦運行在64位平台,因為MongoDB在32位元模式運行時支援的最大檔尺寸為2GB

Page 20: Mongo db 簡介

MongoDB(3/3)

0Memory-mapped file

0服務本身佔據很少資源、但Memory-mapped會佔用大量內存。

Page 21: Mongo db 簡介

MongoDB結構(1/7)

0邏輯結構關系對比關係型資料庫:MSSQL資料庫(database)、表

(table)、記錄(rows) 三個層次概念組成。

非關係型數據庫:MongoDB 資料庫(database)、集合(collection)、文檔對象(document)三個層次概念組成。

MongoDB 裡的集合對應於關係型數據庫裡的表,但是

集合中沒有列、行和關係的概念,集合中只有document,一個document就相當與一條記錄,這實現了無Schema的特點。

Page 22: Mongo db 簡介

MongoDB結構(2/7)

Page 23: Mongo db 簡介

MongoDB結構(3/7)

0MongoDB的document使用BSON(Binary JSON)來組織資料,BSON類似於JSON,JSON只是一種簡單的表示資料的方式,只包含了6種資料類型(null、布林、數位、字串、陣列及物件),不能完全滿足複雜的需要,因此,BSON還提供日期、32位元數字、64位元數位等類型

Page 24: Mongo db 簡介

MongoDB結構(4/7)

0 null null類型用於表示空值或不存在的欄位如:{“one”:null}

0 boolean布林類型有兩種值,’true’和’false’ 如:{“one”:true}

0 32位元整數mongoDB的控制台使用JS引擎進行輸入,而JS僅支持64位浮點數,所以32位元整數將會被自動轉義。

0 64位元整數64位元整數與32位元整數一樣,在MongoDB控制台使用時,會轉義成64位浮點數

Page 25: Mongo db 簡介

MongoDB結構(5/7)

0 64位浮點數

MongoDB控制台數位的預設類型。

如:{“one”:2.02} {“one”:10}

0字符串

UTF-8字串都可以表示為字串類型的資料。

如:{“one”:”Hello World”}

Page 26: Mongo db 簡介

MongoDB結構(6/7)

0 ObjectId 類型對象id是文檔中唯一的12位的ID0|1|2|3|4|5|6|7|8|9|10|11 時間戳記 |機器 | PID | 計數器如:ObjectId("4eae239f63520362e051e7fd")

0日期注意:使用的時候要加上new 如:{“one”:new Date()}

0正則運算式文檔鍵值可以包含規則運算式,其規則運算式採用JS語法來表示。如:{“one”:/ho/i}

Page 27: Mongo db 簡介

MongoDB結構(7/7)

0 code

文檔中可以包含JS code

如:{“one”:function(){/*………….*/}}

0 Array

文檔中鍵值可以表示為陣列,在陣列內還可以嵌套陣列;如:{“x”:[“a”,”b”,[“c”,”d”]]}

0 內嵌document

document可以包含別的document

如:{“x”:{“name”:”Tom”,”age”:20}}

Page 28: Mongo db 簡介

基本操作(1/6)

> db.users.insert({"_id":1,"name":"mongo"})> show dbsadmin (empty)local (empty)mydb 0.0625GB> show collectionssystem.indexesusers> db.users.find(){ "_id" : 1, "name" : "mongo" }

Page 29: Mongo db 簡介

基本操作(2/6)

0儲存在MongoDB 集合中的每個document都有一個默認的主鍵_id,它必須是唯一的,這個主鍵名稱是固定的,它可以是MongoDB 支持的任何資料類型,默認是ObjectId。

0若沒有指定,則MongoDB會自動產生一個像GUID的ID

Page 30: Mongo db 簡介

基本操作(3/6)

> a={"name":"caida"} { "name" : "caida" }> b={"age":24} { "age" : 24 }> db.users.insert(a);> db.users.save(b); > db.users.find(){ "_id" : 1, "name" : "mongo" }{ "_id" : ObjectId("4eb2a192bf10550b2177b6f7"), "name" : "caida" }{ "_id" : ObjectId("4eb2a199bf10550b2177b6f8"), "age" : 24 }

Page 31: Mongo db 簡介

基本操作(4/6)

0 db.collname.remove({條件})(不寫條件則刪除所有記錄)

> db.users.remove({"name":"caida"})> db.users.find(){ "_id" : 1, "name" : "mongo" }{ "_id" : ObjectId("4eb2a199bf10550b2177b6f8"), "age" : 24 }

Page 32: Mongo db 簡介

基本操作(5/6)

0 db.collname.update({條件},{內容})

> db.users.update({"_id":1},{"name":"nosql"}) > db.users.find() { "_id" : 1, "name" : "nosql" }{ "_id" : ObjectId("4eb2a199bf10550b2177b6f8"), "age" : 24 }

Page 33: Mongo db 簡介

基本操作(6/6)

0 db.collname.find({條件})(不寫條件查詢所有的資

料)

> db.users.find() { "_id" : 1, "name" : "nosql" }{ "_id" : ObjectId("4eb2a199bf10550b2177b6f8"), "age" : 24 }

> db.users.find({"name":"nosql"}) { "_id" : 1, "name" : "nosql" }

Page 34: Mongo db 簡介

GridFS

GridFS是一種在MongoDB中儲存大二進位檔案的機制,使用GridFS的原因有以下幾種:儲存巨大的檔,比如影片、高解析度圖片等。

GridFS會直接利用已經建立的replica或sharding機制,故障恢復和擴展都很容易。

GridFS可以避免使用者上傳內容的檔案系統出現問題,像是相同目錄中儲存過量數目檔案的問題

GridFS不產生Disk碎片。

GridFS 檔案分成檔案資訊和區塊(Chunks) 二個部分,檔案資訊用來儲存檔案名稱和容量等資訊,而區塊則是將檔案做分割後儲存,透過分割儲存的方式能夠達到快速讀取檔案中的任一段資料的功能

Page 35: Mongo db 簡介

What is NoSQL?Why NoSQL

MongoDB Introduction

MongoDB HA

MongoDB C# Driver

MongoDB Install & Setup

Page 36: Mongo db 簡介

Replica Set(1/2)

Page 37: Mongo db 簡介

Replica Set(2/2)

0利用Replica Set即可完成簡單的failover與load balance功能

0最小instance數是兩台,但如果只有兩個instance,當其中一個instance掛掉只剩一台時,MongoDB為了避免新寫入的資料會丟失,所以會將整個服務變成唯讀

0只有Primary可以寫入資料,Secondary只能讀取資料,當Primary被寫入資料時,會立即同步至Secondary,若Primary Node掛掉時,則會由其他Node立即選出新的Primary

Page 38: Mongo db 簡介

Sharding(1/7)

0將資料水平切分到不同的物理節點

0利用更多的硬體資源來解決了單機性能極限的問題

0數據量超過伺服器的硬碟容量時,就必需做 sharding

0資水平切分後,會減小每個索引的體積。索引一般都是 B樹 結構,索引體積減小後,索引深度也會隨之減小,索引查詢的速度也會隨之提高

0Mongo的sharding可以動態擴展、自動平衡、統一接口

0搭配replica set提高可用性及容錯

Page 39: Mongo db 簡介

Sharding(2/7)

Page 40: Mongo db 簡介

Sharding(3/7)

0Mongos

0對用戶端來說,直接訪問的是Mongos

0它對外的介面就和普通的 mongod 一樣

0可以使用標準 mongodb 用戶端和驅動進行訪問

0主要作用是資料路由,定位資料位置,合併查詢結果

0 mongos 節點還負責資料移轉和資料自動平衡,並作為sharding 集群的管理節點

0不保存任何資料,可以任意水平擴展,這樣任意一個節點發生故障都可以很容易的進行容錯移轉

Page 41: Mongo db 簡介

Sharding(4/7)

0 Config

0 config 節點存儲了中繼資料,包括資料的位置,即哪些資料位於哪些節點,以及集群配置信息

0 config 節點也是普通的 mongod

0這 3 個 config 節點並非是一個 replica set。它們的資料同步是由 mongos 執行兩階段提交來保證的

0 config 節點一定程度上實現了高可用。在一個或兩個節點發生故障時,config 集群會變成唯讀。但此時,整個sharding 集群仍然可以正常讀寫資料。只是無法進行資料移轉和自動均衡而已

Page 42: Mongo db 簡介

Sharding(5/7)

0 Shard

0實際存放資料的資料節點。

0 每個 shard 節點可以是單個 mongod 實例,也可以是一個 replica set

0通常在使用 sharding 的時候,都會同時使用 replica

set 來實現高可用,避免單點故障的時候影響服務,及數據丟失

0對於每個開啟 sharding 的 db 來說,都會有一個 預設shard 。初始時,第一個 chunk 就會在那裡建立。新資料也就會先插入到那個 shard 節點中去。

Page 43: Mongo db 簡介

Sharding(6/7)

Page 44: Mongo db 簡介

Sharding(7/7)

Page 45: Mongo db 簡介

What is NoSQL?Why NoSQL

MongoDB Introduction

MongoDB HA

MongoDB C# Driver

MongoDB Install & Setup

Page 46: Mongo db 簡介

MongoDB C# / .NET Driver

0 http://docs.mongodb.org/ecosystem/drivers/csharp/

0 IDE

0 Visual Studio 2010

0 Visual Studio 2012

0 .NET Versions

0 .NET 3.5

0 .NET 4.0

0 .NET 4.5

0支援LINQ操作

Page 47: Mongo db 簡介

Get from NuGet

Page 48: Mongo db 簡介

C# Driver (1/)

Page 49: Mongo db 簡介

C# Driver (1/9)

Page 50: Mongo db 簡介

C# Driver (2/9)

Page 51: Mongo db 簡介

C# Driver (3/9)

Page 52: Mongo db 簡介

C# Driver (4/9)

Page 53: Mongo db 簡介

C# Driver (5/9)

Page 54: Mongo db 簡介

C# Driver (6/9)

Page 55: Mongo db 簡介

C# Driver (7/9)

Page 56: Mongo db 簡介

C# Driver (8/9)

Page 57: Mongo db 簡介

C# Driver (9/9)

Page 58: Mongo db 簡介

What is NoSQL?Why NoSQL

MongoDB Introduction

MongoDB HA

MongoDB C# Driver

MongoDB Install & Setup

Page 59: Mongo db 簡介

架構

0三台instance做replica set

0三台node的ip分別為10.20.4.101, 10.20.4.102, 10.20.4.103。

0 Port : 27017

0監控port : 28017

0登入時需驗證

Page 61: Mongo db 簡介

建立資料夾

0解壓縮完的目錄下需要開一個放資料的目錄跟一個放

log的目錄。

\data\logs

0如果是replica set的話,則必須多開一個放key的目錄,key是各node之間溝通時認證用的,所以每一台

放的key必須一樣

\key\key.txt

Page 62: Mongo db 簡介

安裝服務0在每一台的命令提示字元下,執行以下命令

0 --dbpath是指定db目錄

0 --logpath指定log位置

0 --auth是指定之後連線必須經過認證過程

0 --install則是將服務安裝為windows service形式

0 -replSet crm2則是指定複本集的名稱為crm2

0 --keyFile指定key位置

0 --rest是指打開內建監控網站的rest api

cd C:\mongodb-win32-x86_64-2008plus-2.4.5\binmongod.exe -dbpath "C:\mongodb-win32-x86_64-2008plus-2.4.5\data" --logpath "C:\mongodb-win32-x86_64-2008plus-2.4.5\logs\mongod.txt" --auth --install --replSet crm2 --keyFile "C:\mongodb-win32-x86_64-2008plus-2.4.5\key\key.txt" --restnet start MongoDB

Page 63: Mongo db 簡介

初始化(1/4)

0在初始化之前,必須確保每台node的port : 27017是可以互通不被防火牆擋掉的

0假設我們一開始以10.20.4.102做為Primary,我們就在10.20.4.102的機器上,執行cmd.exe,並透過mongo這個指令連進服務。

Page 64: Mongo db 簡介

初始化(2/4)

0連進服務後,執行rs.initiate()來初始化replica set服務。

0接著執行rs.add(“10.20.4.101”)將101加入至replica set服務

0執行rs.add(“10.20.4.103”)將103加入至replica set服務

0加完之後可以使用rs.conf()來檢視設定

0也可以使用rs.status()來檢視狀態

Page 65: Mongo db 簡介

初始化(3/4)

Page 66: Mongo db 簡介

初始化(4/4)

0這樣replica set的初始化就算完成,但預設Secondary也是無法讀取資料的,所以必須連進101跟103執行rs.slaveOk() ,讓secondary也可以讀取資料,才能達到load balance的效果。

Page 67: Mongo db 簡介

帳號設定

0在primary中執行以下命令

0 use admin

0 db.addUser(“{user}”,”{pwd}”)

0在執行此行指定以前是不進行帳號密碼驗證的

Page 68: Mongo db 簡介

監控網站(1/2)

Page 69: Mongo db 簡介

監控網站(2/2)

Page 70: Mongo db 簡介

MongoVUE(1/2)

0GUI管理工具

0 http://www.mongovue.com/downloads/

Page 71: Mongo db 簡介

MongoVUE(2/2)

Page 72: Mongo db 簡介