Mongo DB 簡介
What is NoSQL?Why NoSQL
MongoDB Introduction
MongoDB HA
MongoDB C# Driver
MongoDB Install & Setup
What is NoSQL?Why NoSQL
MongoDB Introduction
MongoDB HA
MongoDB C# Driver
MongoDB Install & Setup
Relational Database的瓶頸
0 Lock機制保證ACID
0Query cache為Table等級
0 Shema 固定
0連線數無法應付訪問量的增加
0資料量大時IO壓力沉重
0未來連線數只會越來越大,資料量只會越來越多
0擴展不易
RDB+Memcached
0傳統的文件快取不能多台Server共享
0大量的的小資料快取還是有很大的IO壓力
0內部網路速度越來越快
0記憶體越來越便宜
0Memcached變成一種很流行很實用的技術
Memcached(1/3)
Memcached(2/3)
函式庫
Memcached Memcached Memcached
演算法
應用程式
Memcached(3/3)
0高性能
0分散式儲存
0Name-Value Pair
0Key 的長度被限制在 250 characters
0儲存的資料不能超過 1 megabyte
0沒有分散式運算控制器,透過儲存時的演算法達成分散式
0只能分擔讀取的壓力
NoSQL(1/6)
0去掉Relation DB的關聯特性,不嚴謹的保證ACID
0數據間無關聯,可分散式儲存,且增加擴展性
0不用考慮關聯性,增加讀寫性能
0 Cache為記錄級的,非table級,粒度較小
0無固定的Schema,除去大量資料在修改schema時的效能影響
0節省開發成本及維護成本
0不支援SQL
0不保證Transaction
NoSQL(2/6)
0適合
0大量寫入跟更新的資料,資料無需進行關聯式操作,EX:LOG類型,使用者操作紀錄、系統運行記錄,簡訊發送記錄
0大尺寸但低價值的資料,NoSQL成本較低。
0需要大量分散式存取的資料,可支援MapReduce,存取數十或數百台資料伺服器
0不適合0交易一致性需求高的, NoSQL不嚴謹保證ACID
0需要關聯性儲存的資料
0要使用傳統SQL的solution
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)
方便用來儲存大量的圖片數據
NoSQL(4/6)
0RDB已死?
0NoSQL vs. RDB
0功能
0性能
0擴展
0NoSQL+RDB
0選擇適合的NoSQL
0資料結構、數據特性
0 Insert、Update的比例
0 查詢的需求
NoSQL(5/6)
0RDB專門負責處理擅長的關係存儲,NoSQL作為資料的存儲
0節省RDB的IO開銷
0提高SQL cache的hit rate
0提昇RDB主從同步效率
0提昇RDB備份與恢復效率
0提高擴展性及系統承載量
NoSQL(6/6)
NOSQL
What is NoSQL?Why NoSQL
MongoDB Introduction
MongoDB HA
MongoDB C# Driver
MongoDB Install & Setup
MongoDB(1/3)
0 open source
0 C++開發
0高性能
0無Schema
0Doucument儲存
0存儲格式為BSON(一種JSON的擴展)
0支持RUBY,PYTHON,JAVA,PHP,C++,C#等多種語言
MongoDB(2/3)
0支援索引的建立
0支援動態查詢
0支援replica與Sharding
0使用高效的二進位資料存儲,包括大型物件(如影片)
0BSON格式的資料(文檔)存儲有尺寸限制,最大為16M
0MongoDB可運行在Linux、Windows或OS X平台,支援32位和64位應用,默認埠為27017。推薦運行在64位平台,因為MongoDB在32位元模式運行時支援的最大檔尺寸為2GB
MongoDB(3/3)
0Memory-mapped file
0服務本身佔據很少資源、但Memory-mapped會佔用大量內存。
MongoDB結構(1/7)
0邏輯結構關系對比關係型資料庫:MSSQL資料庫(database)、表
(table)、記錄(rows) 三個層次概念組成。
非關係型數據庫:MongoDB 資料庫(database)、集合(collection)、文檔對象(document)三個層次概念組成。
MongoDB 裡的集合對應於關係型數據庫裡的表,但是
集合中沒有列、行和關係的概念,集合中只有document,一個document就相當與一條記錄,這實現了無Schema的特點。
MongoDB結構(2/7)
MongoDB結構(3/7)
0MongoDB的document使用BSON(Binary JSON)來組織資料,BSON類似於JSON,JSON只是一種簡單的表示資料的方式,只包含了6種資料類型(null、布林、數位、字串、陣列及物件),不能完全滿足複雜的需要,因此,BSON還提供日期、32位元數字、64位元數位等類型
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位浮點數
MongoDB結構(5/7)
0 64位浮點數
MongoDB控制台數位的預設類型。
如:{“one”:2.02} {“one”:10}
0字符串
UTF-8字串都可以表示為字串類型的資料。
如:{“one”:”Hello World”}
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}
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}}
基本操作(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" }
基本操作(2/6)
0儲存在MongoDB 集合中的每個document都有一個默認的主鍵_id,它必須是唯一的,這個主鍵名稱是固定的,它可以是MongoDB 支持的任何資料類型,默認是ObjectId。
0若沒有指定,則MongoDB會自動產生一個像GUID的ID
基本操作(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 }
基本操作(4/6)
0 db.collname.remove({條件})(不寫條件則刪除所有記錄)
> db.users.remove({"name":"caida"})> db.users.find(){ "_id" : 1, "name" : "mongo" }{ "_id" : ObjectId("4eb2a199bf10550b2177b6f8"), "age" : 24 }
基本操作(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 }
基本操作(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" }
GridFS
GridFS是一種在MongoDB中儲存大二進位檔案的機制,使用GridFS的原因有以下幾種:儲存巨大的檔,比如影片、高解析度圖片等。
GridFS會直接利用已經建立的replica或sharding機制,故障恢復和擴展都很容易。
GridFS可以避免使用者上傳內容的檔案系統出現問題,像是相同目錄中儲存過量數目檔案的問題
GridFS不產生Disk碎片。
GridFS 檔案分成檔案資訊和區塊(Chunks) 二個部分,檔案資訊用來儲存檔案名稱和容量等資訊,而區塊則是將檔案做分割後儲存,透過分割儲存的方式能夠達到快速讀取檔案中的任一段資料的功能
What is NoSQL?Why NoSQL
MongoDB Introduction
MongoDB HA
MongoDB C# Driver
MongoDB Install & Setup
Replica Set(1/2)
Replica Set(2/2)
0利用Replica Set即可完成簡單的failover與load balance功能
0最小instance數是兩台,但如果只有兩個instance,當其中一個instance掛掉只剩一台時,MongoDB為了避免新寫入的資料會丟失,所以會將整個服務變成唯讀
0只有Primary可以寫入資料,Secondary只能讀取資料,當Primary被寫入資料時,會立即同步至Secondary,若Primary Node掛掉時,則會由其他Node立即選出新的Primary
Sharding(1/7)
0將資料水平切分到不同的物理節點
0利用更多的硬體資源來解決了單機性能極限的問題
0數據量超過伺服器的硬碟容量時,就必需做 sharding
0資水平切分後,會減小每個索引的體積。索引一般都是 B樹 結構,索引體積減小後,索引深度也會隨之減小,索引查詢的速度也會隨之提高
0Mongo的sharding可以動態擴展、自動平衡、統一接口
0搭配replica set提高可用性及容錯
Sharding(2/7)
Sharding(3/7)
0Mongos
0對用戶端來說,直接訪問的是Mongos
0它對外的介面就和普通的 mongod 一樣
0可以使用標準 mongodb 用戶端和驅動進行訪問
0主要作用是資料路由,定位資料位置,合併查詢結果
0 mongos 節點還負責資料移轉和資料自動平衡,並作為sharding 集群的管理節點
0不保存任何資料,可以任意水平擴展,這樣任意一個節點發生故障都可以很容易的進行容錯移轉
Sharding(4/7)
0 Config
0 config 節點存儲了中繼資料,包括資料的位置,即哪些資料位於哪些節點,以及集群配置信息
0 config 節點也是普通的 mongod
0這 3 個 config 節點並非是一個 replica set。它們的資料同步是由 mongos 執行兩階段提交來保證的
0 config 節點一定程度上實現了高可用。在一個或兩個節點發生故障時,config 集群會變成唯讀。但此時,整個sharding 集群仍然可以正常讀寫資料。只是無法進行資料移轉和自動均衡而已
Sharding(5/7)
0 Shard
0實際存放資料的資料節點。
0 每個 shard 節點可以是單個 mongod 實例,也可以是一個 replica set
0通常在使用 sharding 的時候,都會同時使用 replica
set 來實現高可用,避免單點故障的時候影響服務,及數據丟失
0對於每個開啟 sharding 的 db 來說,都會有一個 預設shard 。初始時,第一個 chunk 就會在那裡建立。新資料也就會先插入到那個 shard 節點中去。
Sharding(6/7)
Sharding(7/7)
What is NoSQL?Why NoSQL
MongoDB Introduction
MongoDB HA
MongoDB C# Driver
MongoDB Install & Setup
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操作
Get from NuGet
C# Driver (1/)
C# Driver (1/9)
C# Driver (2/9)
C# Driver (3/9)
C# Driver (4/9)
C# Driver (5/9)
C# Driver (6/9)
C# Driver (7/9)
C# Driver (8/9)
C# Driver (9/9)
What is NoSQL?Why NoSQL
MongoDB Introduction
MongoDB HA
MongoDB C# Driver
MongoDB Install & Setup
架構
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登入時需驗證
下載
0 http://www.mongodb.org/downloads
0下載64-bit *2008R2+的版本
0下載完後解壓縮即可
建立資料夾
0解壓縮完的目錄下需要開一個放資料的目錄跟一個放
log的目錄。
\data\logs
0如果是replica set的話,則必須多開一個放key的目錄,key是各node之間溝通時認證用的,所以每一台
放的key必須一樣
\key\key.txt
安裝服務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
初始化(1/4)
0在初始化之前,必須確保每台node的port : 27017是可以互通不被防火牆擋掉的
0假設我們一開始以10.20.4.102做為Primary,我們就在10.20.4.102的機器上,執行cmd.exe,並透過mongo這個指令連進服務。
初始化(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()來檢視狀態
初始化(3/4)
初始化(4/4)
0這樣replica set的初始化就算完成,但預設Secondary也是無法讀取資料的,所以必須連進101跟103執行rs.slaveOk() ,讓secondary也可以讀取資料,才能達到load balance的效果。
帳號設定
0在primary中執行以下命令
0 use admin
0 db.addUser(“{user}”,”{pwd}”)
0在執行此行指定以前是不進行帳號密碼驗證的
監控網站(1/2)
監控網站(2/2)
MongoVUE(1/2)
0GUI管理工具
0 http://www.mongovue.com/downloads/
MongoVUE(2/2)