[TOC]
未完更新中...
1. MongoDB安裝及配置
- 官網(wǎng)下載地址
- 安裝msc文件,現(xiàn)在3.4的版本,有了msc,所以沒(méi)有選擇zip格式安裝包,安裝過(guò)程選擇customer,選擇安裝地址,安裝目錄盡量簡(jiǎn)化,其他就是下一步,安裝很簡(jiǎn)單
- 我的安裝目錄是 C:\MongoDB\Server,在目錄下新建名字為: "db" 的文件夾,在db目錄下,新建名為:"logs"的文件夾
- 在主目錄下,新建名為: "mongo.conf" 的文件,把下邊內(nèi)容黏貼并修改
- 修改系統(tǒng)環(huán)境變量,在"Path"系統(tǒng)環(huán)境變量里,添加 "C:\MongoDB\Server\bin",注意增加分號(hào)";"
- 添加為自啟動(dòng)系統(tǒng)服務(wù) mongod --config C:\MongoDB\Server\mongo.conf --install --serviceName "MongoDB"
- win+r 打開(kāi)運(yùn)行 輸入 services.msc 可以查看 MongoDB服務(wù), net start MongoDB 可以開(kāi)啟 net stop MongoDB 可以關(guān)閉
普通啟動(dòng) 通過(guò)瀏覽器 localhost:27017 打開(kāi)查看
mongod --config C:\MongoDB\Server\mongodb.conf
安裝為Windows服務(wù)
注:2.6版 這種方式在win7、win8 64位版無(wú)法安裝成功,其他系統(tǒng)未測(cè)試
mongod --config C:\MongoDB\Server\mongodb.conf --install --serviceName "MongoDB"
使用SC安裝為Windows服務(wù)
sc create MongoDB binPath= "C:\MongoDB\Server\bin\mongod.exe --service --config=D:\MongoDB\etc\mongodb.conf"
查看端口占用 netstat -ano|findstr 27017
查看進(jìn)程名 tasklist |finstr 14308
殺掉進(jìn)程pid taskkill /pid 14308 -t -f
mongo.conf文件內(nèi)容:
dbpath=C:\MongoDB\Server\db #數(shù)據(jù)庫(kù)路徑
logpath=C:\MongoDB\Server\db\log\mongo.log #日志輸出文件路徑
logappend=true #錯(cuò)誤日志采用追加模式,配置這個(gè)選項(xiàng)后mongodb的日志會(huì)追加到現(xiàn)有的日志文件,而不是從新創(chuàng)建一個(gè)新文件
journal=true #啟用日志文件,默認(rèn)啟用
quiet=false #這個(gè)選項(xiàng)可以過(guò)濾掉一些無(wú)用的日志信息,若需要調(diào)試使用請(qǐng)?jiān)O(shè)置為false
port=27017 #端口號(hào) 默認(rèn)為27017
2. 什么是MongoDB ?
- MongoDB 是由C++語(yǔ)言編寫(xiě)的,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)。
- 在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。
- MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
- MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。MongoDB 文檔類似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。
3. 主要特點(diǎn)
- MongoDB的提供了一個(gè)面向文檔存儲(chǔ),操作起來(lái)比較簡(jiǎn)單和容易。
- 你可以在MongoDB記錄中設(shè)置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來(lái)實(shí)現(xiàn)更快的排序。
- 你可以通過(guò)本地或者網(wǎng)絡(luò)創(chuàng)建數(shù)據(jù)鏡像,這使得MongoDB有更強(qiáng)的擴(kuò)展性。
- 如果負(fù)載的增加(需要更多的存儲(chǔ)空間和更強(qiáng)的處理能力) ,它可以分布在計(jì)算機(jī)網(wǎng)絡(luò)中的其他節(jié)點(diǎn)上這就是所謂的分片。
- Mongo支持豐富的查詢表達(dá)式。查詢指令使用JSON形式的標(biāo)記,可輕易查詢文檔中內(nèi)嵌的對(duì)象及數(shù)組。
- MongoDb 使用update()命令可以實(shí)現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段 。
- Mongodb中的Map/reduce主要是用來(lái)對(duì)數(shù)據(jù)進(jìn)行批量處理和聚合操作。
- Map和Reduce。Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數(shù)進(jìn)行處理。
- Map函數(shù)和Reduce函數(shù)是使用Javascript編寫(xiě)的,并可以通過(guò)db.runCommand或mapreduce命令來(lái)執(zhí)行MapReduce操作。
- GridFS是MongoDB中的一個(gè)內(nèi)置功能,可以用于存放大量小文件。
- MongoDB允許在服務(wù)端執(zhí)行腳本,可以用Javascript編寫(xiě)某個(gè)函數(shù),直接在服務(wù)端執(zhí)行,也可以把函數(shù)的定義存儲(chǔ)在服務(wù)端,下次直接調(diào)用即可。
- MongoDB支持各種編程語(yǔ)言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語(yǔ)言。
- MongoDB安裝簡(jiǎn)單
4. 概念解析
sql database | nosql database | 數(shù)據(jù)庫(kù) |
---|---|---|
table | collection | 數(shù)據(jù)庫(kù)表/集合 |
row | document | 數(shù)據(jù)記錄行/文檔 |
column | field | 數(shù)據(jù)字段/域 |
index | index | 索引 |
table joins | MongoDB不支持 | 表連接 |
primary key | primary key | 主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵 |
5. 創(chuàng)建數(shù)據(jù)庫(kù)
- 創(chuàng)建/使用 use info # info是數(shù)據(jù)庫(kù)名稱,以下凡是用到info的都是泛指數(shù)據(jù)庫(kù)的名稱
- 查看 show dbs
- 查看當(dāng)前使用 db
6. 刪除數(shù)據(jù)庫(kù)
- 刪除數(shù)據(jù)庫(kù) db.dropDatabase()
- 刪除集合 db.info.drop()
6. 插入文檔
- insert方式 db.info.insert({a:"a",b:1})
- document方式
- document=({a:"a",b:1})
- db.info.insert(document)
7. 更新文檔
- update方式 db.info.update({a:"a",b:1},{$set:{a:"b",b:1}})
- update多條記錄方式 db.info.update({a:"a",b:1},{$set:{a:"b",b:1}},{multi:"true"})
- save方式 db.info.save({"_id" : ObjectId("56064f89ade2f21f36b03136"), a:"b"})
更多實(shí)例
只更新第一條記錄:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一條:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加加進(jìn)去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一條記錄:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
8. 刪除文檔
- remove刪除多條 db.info.remove({a:1})
- remove刪除1條 db.info.remove({a:1},1)
9. 查詢文檔
- find方式 db.info.find()
- find易讀方式 db.info.find().pretty()
MongoDB 與 RDBMS Where 語(yǔ)句比較
如果你熟悉常規(guī)的 SQL 數(shù)據(jù),通過(guò)下表可以更好的理解 MongoDB 的條件語(yǔ)句查詢:
操作 | 格式 | 范例 | RDBMS中的類似語(yǔ)句 |
---|---|---|---|
等于 | {<key>:<value>} | db.col.find({"by":"菜鳥(niǎo)教程"}).pretty() | where by = '菜鳥(niǎo)教程' |
小于 | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
- MongoDB AND 條件
- db.col.find({"by":"菜鳥(niǎo)教程", "title":"MongoDB 教程"}).pretty()
- MongoDB OR 條件
- db.col.find({$or:[{"by":"菜鳥(niǎo)教程"},{"title": "MongoDB 教程"}]}).pretty()
- AND 和 OR 聯(lián)合使用
- db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥(niǎo)教程"},{"title": "MongoDB 教程"}]}).pretty()
10. 條件操作符
- 先插入測(cè)試數(shù)據(jù)三條
db.col.insert({title:"a",likes:200})
db.col.insert({title:"a",likes:100})
db.col.insert({title:"a",likes:300})
- 使用find()查找
db.col.find({likes:{$gt:200}}) 大于
db.col.find({likes:{$gte:200}}) 大于等于
db.col.find({likes:{$lt:200}}) 小于
db.col.find({likes:{$lte:200}}) 小于等于
11. $type操作符
$type操作符是基于BSON類型來(lái)檢索集合中匹配的數(shù)據(jù)類型,并返回結(jié)果。
MongoDB 中可以使用的類型如下表所示:
類型 | 數(shù)字 | 備注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已廢棄。 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1. |
Max key | 127 |
- 先插入測(cè)試數(shù)據(jù)三條
db.col.remove({}) # 清空數(shù)據(jù)集合
db.col.insert({title:"a",likes:200})
db.col.insert({title:1,likes:100})
db.col.insert({title:[1,2],likes:300})
- 使用$type查找string數(shù)據(jù)
db.col.find({title:{$type:1}}) # 1標(biāo)識(shí)tuple 結(jié)果 1, [1,2] 兩條
db.col.find({title:{$type:2}}) # 2標(biāo)識(shí)字符串 "a" 一條
db.col.find({title:{$type:3}}) # 4標(biāo)識(shí)Array 沒(méi)有結(jié)果
12. Limit與Skip方法
db.col.find({title:"a"}).limit(1) # 顯示1條
db.col.find({title:"a"}).limit(1).skip(1) # 顯示1條 跳過(guò)1條
補(bǔ)充說(shuō)明:
- db.col.find({},{"title":1,_id:0}).limit(2)
- 第一個(gè) {} 放 where 條件,為空表示返回集合中所有文檔。
- 第二個(gè) {} 指定那些列顯示和不顯示 (0表示不顯示 1表示顯示)
- 想要讀取從 10 條記錄后 100 條記錄,相當(dāng)于 sql 中l(wèi)imit (10,100)。
- db.COLLECTION_NAME.find().skip(10).limit(100)
- 以上實(shí)例在集合中跳過(guò)前面 10 條返回 100 條數(shù)據(jù)。
- skip 和 limit 結(jié)合就能實(shí)現(xiàn)分頁(yè)。
- 當(dāng)查詢時(shí)同時(shí)使用sort,skip,limit,無(wú)論位置先后,最先執(zhí)行順序 sort再skip再limit。
13. sort排序
db.col.find().sort({like:1}) # like字段正序
db.col.find().sort({like:-1}) # like字段倒序
14. ensureIndex()索引
db.col.ensureIndex({"title":1}) # 1正序 -1倒序
db.col.ensureIndex({"title":1,"description":-1}) # 多字段索引
db.values.ensureIndex({open: 1, close: 1}, {background: true}) # background后臺(tái)創(chuàng)建
ensureIndex() 接收可選參數(shù),可選參數(shù)列表如下:
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引過(guò)程會(huì)阻塞其它數(shù)據(jù)庫(kù)操作,background可指定以后臺(tái)方式創(chuàng)建索引,即增加 "background" 可選參數(shù)。 "background" 默認(rèn)值為false。 |
unique | Boolean | 建立的索引是否唯一。指定為true創(chuàng)建唯一索引。默認(rèn)值為false. |
name | string | 索引的名稱。如果未指定,MongoDB的通過(guò)連接索引的字段名和排序順序生成一個(gè)索引名稱。 |
dropDups | Boolean | 在建立唯一索引時(shí)是否刪除重復(fù)記錄,指定 true 創(chuàng)建唯一索引。默認(rèn)值為 false. |
sparse | Boolean | 對(duì)文檔中不存在的字段數(shù)據(jù)不啟用索引;這個(gè)參數(shù)需要特別注意,如果設(shè)置為true的話,在索引字段中不會(huì)查詢出不包含對(duì)應(yīng)字段的文檔.。默認(rèn)值為 false. |
expireAfterSeconds | integer | 指定一個(gè)以秒為單位的數(shù)值,完成 TTL設(shè)定,設(shè)定集合的生存時(shí)間。 |
v | index version | 索引的版本號(hào)。默認(rèn)的索引版本取決于mongod創(chuàng)建索引時(shí)運(yùn)行的版本。 |
weights | document | 索引權(quán)重值,數(shù)值在 1 到 99,999 之間,表示該索引相對(duì)于其他索引字段的得分權(quán)重。 |
default_language | string | 對(duì)于文本索引,該參數(shù)決定了停用詞及詞干和詞器的規(guī)則的列表。 默認(rèn)為英語(yǔ) |
language_override | string | 對(duì)于文本索引,該參數(shù)指定了包含在文檔中的字段名,語(yǔ)言覆蓋默認(rèn)的language,默認(rèn)值為 language. |
15. 聚合
1. 插入數(shù)據(jù)
db.mycol.insert({user_name:"wy",age:2})
db.mycol.insert({user_name:"wy",age:3})
db.mycol.insert({user_name:"sg",age:4})
db.mycol.insert({user_name:"sg",age:5})
2. aggregate()計(jì)算結(jié)果如下
db.mycol.aggregate([{$group:{_id:"$user_name",num_tutorial:{$sum:"$age"}}}])
# $group 是分組顯示, _id 是分組依據(jù)字段的key,"$user_name" 是分組的具體字段,$sum 是求和, "$age" 是具體求和的字段
# 類似于 mysql: select user_name,count(age) from mycol group by user_name;
表達(dá)式 | 描述 | 實(shí)例 |
---|---|---|
$sum | 計(jì)算總和。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 計(jì)算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 獲取集合中所有文檔對(duì)應(yīng)值得最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 獲取集合中所有文檔對(duì)應(yīng)值得最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 在結(jié)果文檔中插入值到一個(gè)數(shù)組中。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在結(jié)果文檔中插入值到一個(gè)數(shù)組中,但不創(chuàng)建副本。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根據(jù)資源文檔的排序獲取第一個(gè)文檔數(shù)據(jù)。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根據(jù)資源文檔的排序獲取最后一個(gè)文檔數(shù)據(jù) | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
管道的概念
管道在Unix和Linux中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個(gè)命令的參數(shù)。
MongoDB的聚合管道將MongoDB文檔在一個(gè)管道處理完畢后將結(jié)果傳遞給下一個(gè)管道處理。管道操作是可以重復(fù)的。
表達(dá)式:處理輸入文檔并輸出。表達(dá)式是無(wú)狀態(tài)的,只能用于計(jì)算當(dāng)前聚合管道的文檔,不能處理其它的文檔。
這里我們介紹一下聚合框架中常用的幾個(gè)操作:
$project:修改輸入文檔的結(jié)構(gòu)。可以用來(lái)重命名、增加或刪除域,也可以用于創(chuàng)建計(jì)算結(jié)果以及嵌套文檔。
$match:用于過(guò)濾數(shù)據(jù),只輸出符合條件的文檔。$match使用MongoDB的標(biāo)準(zhǔn)查詢操作。
$limit:用來(lái)限制MongoDB聚合管道返回的文檔數(shù)。
$skip:在聚合管道中跳過(guò)指定數(shù)量的文檔,并返回余下的文檔。
$unwind:將文檔中的某一個(gè)數(shù)組類型字段拆分成多條,每條包含數(shù)組中的一個(gè)值。
$group:將集合中的文檔分組,可用于統(tǒng)計(jì)結(jié)果。
$sort:將輸入文檔排序后輸出。
$geoNear:輸出接近某一地理位置的有序文檔。
管道操作符實(shí)例
1、$project實(shí)例
db.article.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
這樣的話結(jié)果中就只還有_id,tilte和author三個(gè)字段了,默認(rèn)情況下_id字段是被包含的,如果要想不包含_id話可以這樣:
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1
}});
2.$match實(shí)例
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
$match用于獲取分?jǐn)?shù)大于70小于或等于90記錄,然后將符合條件的記錄送到下一階段$group管道操作符進(jìn)行處理。
3.$skip實(shí)例
db.article.aggregate(
{ $skip : 5 });
經(jīng)過(guò)$skip管道操作符處理后,前五個(gè)文檔被"過(guò)濾"掉。
筆記列表
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
以上實(shí)例類似sql語(yǔ)句:
select by_user as _id, count(*) as num_tutorial from mycol group by by_user
db.articles.aggregate({
$project : {
title: 2,
by_user: 1,
}
})
這樣子也是可行的。也就是說(shuō)非0也可以進(jìn)行表示顯示該字段,負(fù)數(shù)也可以表示顯示該字段。
16. MongoDB復(fù)制原理
MongoDB復(fù)制原理
mongodb的復(fù)制至少需要兩個(gè)節(jié)點(diǎn)。其中一個(gè)是主節(jié)點(diǎn),負(fù)責(zé)處理客戶端請(qǐng)求,其余的都是從節(jié)點(diǎn),負(fù)責(zé)復(fù)制主節(jié)點(diǎn)上的數(shù)據(jù)。
mongodb各個(gè)節(jié)點(diǎn)常見(jiàn)的搭配方式為:一主一從、一主多從。
主節(jié)點(diǎn)記錄在其上的所有操作oplog,從節(jié)點(diǎn)定期輪詢主節(jié)點(diǎn)獲取這些操作,然后對(duì)自己的數(shù)據(jù)副本執(zhí)行這些操作,從而保證從節(jié)點(diǎn)的數(shù)據(jù)與主節(jié)點(diǎn)一致。
副本集特征:
- N 個(gè)節(jié)點(diǎn)的集群
- 任何節(jié)點(diǎn)可作為主節(jié)點(diǎn)
- 所有寫(xiě)入操作都在主節(jié)點(diǎn)上
- 自動(dòng)故障轉(zhuǎn)移
- 自動(dòng)恢復(fù)
實(shí)例:
mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
以上實(shí)例會(huì)啟動(dòng)一個(gè)名為rs0的MongoDB實(shí)例,其端口號(hào)為27017。
啟動(dòng)后打開(kāi)命令提示框并連接上mongoDB服務(wù)。
在Mongo客戶端使用命令rs.initiate()來(lái)啟動(dòng)一個(gè)新的副本集。
我們可以使用rs.conf()來(lái)查看副本集的配置
查看副本集狀態(tài)使用 rs.status() 命令
假設(shè)你已經(jīng)啟動(dòng)了一個(gè)名為mongod1.net,端口號(hào)為27017的Mongo服務(wù)。 在客戶端命令窗口使用rs.add() 命令將其添加到副本集中,命令如下所示:
rs.add("mongod1.net:27017")
MongoDB中你只能通過(guò)主節(jié)點(diǎn)將Mongo服務(wù)添加到副本集中, 判斷當(dāng)前運(yùn)行的Mongo服務(wù)是否為主節(jié)點(diǎn)可以使用命令db.isMaster() 。
MongoDB的副本集與我們常見(jiàn)的主從有所不同,主從在主機(jī)宕機(jī)后所有服務(wù)將停止,而副本集在主機(jī)宕機(jī)后,副本會(huì)接管主節(jié)點(diǎn)成為主節(jié)點(diǎn),不會(huì)出現(xiàn)宕機(jī)的情況。
17. MongoDB 分片
分片
在Mongodb里面存在另一種集群,就是分片技術(shù),可以滿足MongoDB數(shù)據(jù)量大量增長(zhǎng)的需求。
當(dāng)MongoDB存儲(chǔ)海量的數(shù)據(jù)時(shí),一臺(tái)機(jī)器可能不足以存儲(chǔ)數(shù)據(jù),也可能不足以提供可接受的讀寫(xiě)吞吐量。這時(shí),我們就可以通過(guò)在多臺(tái)機(jī)器上分割數(shù)據(jù),使得數(shù)據(jù)庫(kù)系統(tǒng)能存儲(chǔ)和處理更多的數(shù)據(jù)。
為什么使用分片
復(fù)制所有的寫(xiě)入操作到主節(jié)點(diǎn)
延遲的敏感數(shù)據(jù)會(huì)在主節(jié)點(diǎn)查詢
單個(gè)副本集限制在12個(gè)節(jié)點(diǎn)
當(dāng)請(qǐng)求量巨大時(shí)會(huì)出現(xiàn)內(nèi)存不足。
本地磁盤(pán)不足
垂直擴(kuò)展價(jià)格昂貴
MongoDB分片
下圖展示了在MongoDB中使用分片集群結(jié)構(gòu)分布:
上圖中主要有如下所述三個(gè)主要組件:
Shard:
用于存儲(chǔ)實(shí)際的數(shù)據(jù)塊,實(shí)際生產(chǎn)環(huán)境中一個(gè)shard server角色可由幾臺(tái)機(jī)器組個(gè)一個(gè)replica set承擔(dān),防止主機(jī)單點(diǎn)故障
Config Server:
mongod實(shí)例,存儲(chǔ)了整個(gè) ClusterMetadata,其中包括 chunk信息。
Query Routers:
前端路由,客戶端由此接入,且讓整個(gè)集群看上去像單一數(shù)據(jù)庫(kù),前端應(yīng)用可以透明使用。
分片實(shí)例
分片結(jié)構(gòu)端口分布如下:
Shard Server 1:27020
Shard Server 2:27021
Shard Server 3:27022
Shard Server 4:27023
Config Server :27100
Route Process:40000
步驟一:?jiǎn)?dòng)Shard Server
[root@100 /]# mkdir -p /www/mongoDB/shard/s0
[root@100 /]# mkdir -p /www/mongoDB/shard/s1
[root@100 /]# mkdir -p /www/mongoDB/shard/s2
[root@100 /]# mkdir -p /www/mongoDB/shard/s3
[root@100 /]# mkdir -p /www/mongoDB/shard/log
[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27020 --dbpath=/www/mongoDB/shard/s0 --logpath=/www/mongoDB/shard/log/s0.log --logappend --fork
....
[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27023 --dbpath=/www/mongoDB/shard/s3 --logpath=/www/mongoDB/shard/log/s3.log --logappend --fork
步驟二: 啟動(dòng)Config Server
[root@100 /]# mkdir -p /www/mongoDB/shard/config
[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27100 --dbpath=/www/mongoDB/shard/config --logpath=/www/mongoDB/shard/log/config.log --logappend --fork
注意:這里我們完全可以像啟動(dòng)普通mongodb服務(wù)一樣啟動(dòng),不需要添加—shardsvr和configsvr參數(shù)。因?yàn)檫@兩個(gè)參數(shù)的作用就是改變啟動(dòng)端口的,所以我們自行指定了端口就可以。
步驟三: 啟動(dòng)Route Process
/usr/local/mongoDB/bin/mongos --port 40000 --configdb localhost:27100 --fork --logpath=/www/mongoDB/shard/log/route.log --chunkSize 500
mongos啟動(dòng)參數(shù)中,chunkSize這一項(xiàng)是用來(lái)指定chunk的大小的,單位是MB,默認(rèn)大小為200MB.
步驟四: 配置Sharding
接下來(lái),我們使用MongoDB Shell登錄到mongos,添加Shard節(jié)點(diǎn)
[root@100 shard]# /usr/local/mongoDB/bin/mongo admin --port 40000
MongoDB shell version: 2.0.7
connecting to: 127.0.0.1:40000/admin
mongos> db.runCommand({ addshard:"localhost:27020" })
{ "shardAdded" : "shard0000", "ok" : 1 }
......
mongos> db.runCommand({ addshard:"localhost:27029" })
{ "shardAdded" : "shard0009", "ok" : 1 }
mongos> db.runCommand({ enablesharding:"test" }) #設(shè)置分片存儲(chǔ)的數(shù)據(jù)庫(kù)
{ "ok" : 1 }
mongos> db.runCommand({ shardcollection: "test.log", key: { id:1,time:1}})
{ "collectionsharded" : "test.log", "ok" : 1 }
步驟五: 程序代碼內(nèi)無(wú)需太大更改,直接按照連接普通的mongo數(shù)據(jù)庫(kù)那樣,將數(shù)據(jù)庫(kù)連接接入接口40000
18. MongoDB 備份(mongodump)與恢復(fù)(mongorestore)
MongoDB數(shù)據(jù)備份
在Mongodb中我們使用mongodump命令來(lái)備份MongoDB數(shù)據(jù)。該命令可以導(dǎo)出所有數(shù)據(jù)到指定目錄中。
mongodump命令可以通過(guò)參數(shù)指定導(dǎo)出的數(shù)據(jù)量級(jí)轉(zhuǎn)存的服務(wù)器。
語(yǔ)法
mongodump命令腳本語(yǔ)法如下:
mongodump -h dbhost -d dbname -o dbdirectory
-h:
MongDB所在服務(wù)器地址,例如:127.0.0.1,當(dāng)然也可以指定端口號(hào):127.0.0.1:27017
-d:
需要備份的數(shù)據(jù)庫(kù)實(shí)例,例如:test
-o:
備份的數(shù)據(jù)存放位置,例如:c:\data\dump,當(dāng)然該目錄需要提前建立,在備份完成后,系統(tǒng)自動(dòng)在dump目錄下建立一個(gè)test目錄,這個(gè)目錄里面存放該數(shù)據(jù)庫(kù)實(shí)例的備份數(shù)據(jù)。
實(shí)例
在本地使用 27017 啟動(dòng)你的mongod服務(wù)。打開(kāi)命令提示符窗口,進(jìn)入MongoDB安裝目錄的bin目錄輸入命令mongodump:
>mongodump
執(zhí)行以上命令后,客戶端會(huì)連接到ip為 127.0.0.1 端口號(hào)為 27017 的MongoDB服務(wù)上,并備份所有數(shù)據(jù)到 bin/dump/ 目錄中。命令輸出結(jié)果如下:
MongoDB數(shù)據(jù)備份
mongodump 命令可選參數(shù)列表如下所示:
語(yǔ)法 描述 實(shí)例
mongodump --host HOST_NAME --port PORT_NUMBER 該命令將備份所有MongoDB數(shù)據(jù) mongodump --host w3cschool.cc --port 27017
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY mongodump --dbpath /data/db/ --out /data/backup/
mongodump --collection COLLECTION --db DB_NAME 該命令將備份指定數(shù)據(jù)庫(kù)的集合。 mongodump --collection mycol --db test
MongoDB數(shù)據(jù)恢復(fù)
mongodb使用 mongorestore 命令來(lái)恢復(fù)備份的數(shù)據(jù)。
語(yǔ)法
mongorestore命令腳本語(yǔ)法如下:
mongorestore -h <hostname><:port> -d dbname <path>
--host <:port>, -h <:port>:
MongoDB所在服務(wù)器地址,默認(rèn)為: localhost:27017
--db , -d :
需要恢復(fù)的數(shù)據(jù)庫(kù)實(shí)例,例如:test,當(dāng)然這個(gè)名稱也可以和備份時(shí)候的不一樣,比如test2
--drop:
恢復(fù)的時(shí)候,先刪除當(dāng)前數(shù)據(jù),然后恢復(fù)備份的數(shù)據(jù)。就是說(shuō),恢復(fù)后,備份后添加修改的數(shù)據(jù)都會(huì)被刪除,慎用哦!
<path>:
mongorestore 最后的一個(gè)參數(shù),設(shè)置備份數(shù)據(jù)所在位置,例如:c:\data\dump\test。
你不能同時(shí)指定 <path> 和 --dir 選項(xiàng),--dir也可以設(shè)置備份目錄。
--dir:
指定備份的目錄
你不能同時(shí)指定 <path> 和 --dir 選項(xiàng)。
接下來(lái)我們執(zhí)行以下命令:
>mongorestore
執(zhí)行以上命令輸出結(jié)果如下:
MongoDB數(shù)據(jù)恢復(fù)
19. MongoDB 監(jiān)控
在你已經(jīng)安裝部署并允許MongoDB服務(wù)后,你必須要了解MongoDB的運(yùn)行情況,并查看MongoDB的性能。這樣在大流量得情況下可以很好的應(yīng)對(duì)并保證MongoDB正常運(yùn)作。
MongoDB中提供了mongostat 和 mongotop 兩個(gè)命令來(lái)監(jiān)控MongoDB的運(yùn)行情況。
mongostat 命令
mongostat是mongodb自帶的狀態(tài)檢測(cè)工具,在命令行下使用。它會(huì)間隔固定時(shí)間獲取mongodb的當(dāng)前運(yùn)行狀態(tài),并輸出。如果你發(fā)現(xiàn)數(shù)據(jù)庫(kù)突然變慢或者有其他問(wèn)題的話,你第一手的操作就考慮采用mongostat來(lái)查看mongo的狀態(tài)。
啟動(dòng)你的Mongod服務(wù),進(jìn)入到你安裝的MongoDB目錄下的bin目錄, 然后輸入mongostat命令,如下所示:
D:\set up\mongodb\bin>mongostat
以上命令輸出結(jié)果如下:
mongotop 命令
mongotop也是mongodb下的一個(gè)內(nèi)置工具,mongotop提供了一個(gè)方法,用來(lái)跟蹤一個(gè)MongoDB的實(shí)例,查看哪些大量的時(shí)間花費(fèi)在讀取和寫(xiě)入數(shù)據(jù)。 mongotop提供每個(gè)集合的水平的統(tǒng)計(jì)數(shù)據(jù)。默認(rèn)情況下,mongotop返回值的每一秒。
啟動(dòng)你的Mongod服務(wù),進(jìn)入到你安裝的MongoDB目錄下的bin目錄, 然后輸入mongotop命令,如下所示:
D:\set up\mongodb\bin>mongotop
以上命令執(zhí)行輸出結(jié)果如下:
帶參數(shù)實(shí)例
E:\mongodb-win32-x86_64-2.2.1\bin>mongotop 10
后面的10是<sleeptime>參數(shù) ,可以不使用,等待的時(shí)間長(zhǎng)度,以秒為單位,mongotop等待調(diào)用之間。通過(guò)的默認(rèn)mongotop返回?cái)?shù)據(jù)的每一秒。
E:\mongodb-win32-x86_64-2.2.1\bin>mongotop --locks
報(bào)告每個(gè)數(shù)據(jù)庫(kù)的鎖的使用中,使用mongotop - 鎖,這將產(chǎn)生以下輸出:
輸出結(jié)果字段說(shuō)明:
ns:
包含數(shù)據(jù)庫(kù)命名空間,后者結(jié)合了數(shù)據(jù)庫(kù)名稱和集合。
db:
包含數(shù)據(jù)庫(kù)的名稱。名為 . 的數(shù)據(jù)庫(kù)針對(duì)全局鎖定,而非特定數(shù)據(jù)庫(kù)。
total:
mongod花費(fèi)的時(shí)間工作在這個(gè)命名空間提供總額。
read:
提供了大量的時(shí)間,這mongod花費(fèi)在執(zhí)行讀操作,在此命名空間。
write:
提供這個(gè)命名空間進(jìn)行寫(xiě)操作,這mongod花了大量的時(shí)間。