[TOC]
未完更新中...
1. MongoDB安裝及配置
- 官網(wǎng)下載地址
- 安裝msc文件,現(xiàn)在3.4的版本,有了msc,所以沒有選擇zip格式安裝包,安裝過程選擇customer,選擇安裝地址,安裝目錄盡量簡化,其他就是下一步,安裝很簡單
- 我的安裝目錄是 C:\MongoDB\Server,在目錄下新建名字為: "db" 的文件夾,在db目錄下,新建名為:"logs"的文件夾
- 在主目錄下,新建名為: "mongo.conf" 的文件,把下邊內(nèi)容黏貼并修改
- 修改系統(tǒng)環(huán)境變量,在"Path"系統(tǒng)環(huán)境變量里,添加 "C:\MongoDB\Server\bin",注意增加分號";"
- 添加為自啟動系統(tǒng)服務(wù) mongod --config C:\MongoDB\Server\mongo.conf --install --serviceName "MongoDB"
- win+r 打開運行 輸入 services.msc 可以查看 MongoDB服務(wù), net start MongoDB 可以開啟 net stop MongoDB 可以關(guān)閉
普通啟動 通過瀏覽器 localhost:27017 打開查看
mongod --config C:\MongoDB\Server\mongodb.conf
安裝為Windows服務(wù)
注:2.6版 這種方式在win7摆马、win8 64位版無法安裝成功涎跨,其他系統(tǒng)未測試
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
查看進程名 tasklist |finstr 14308
殺掉進程pid taskkill /pid 14308 -t -f
mongo.conf文件內(nèi)容:
dbpath=C:\MongoDB\Server\db #數(shù)據(jù)庫路徑
logpath=C:\MongoDB\Server\db\log\mongo.log #日志輸出文件路徑
logappend=true #錯誤日志采用追加模式剃斧,配置這個選項后mongodb的日志會追加到現(xiàn)有的日志文件,而不是從新創(chuàng)建一個新文件
journal=true #啟用日志文件,默認啟用
quiet=false #這個選項可以過濾掉一些無用的日志信息淤井,若需要調(diào)試使用請設(shè)置為false
port=27017 #端口號 默認為27017
2. 什么是MongoDB ?
- MongoDB 是由C++語言編寫的,是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng)。
- 在高負載的情況下邓线,添加更多的節(jié)點,可以保證服務(wù)器性能煌恢。
- MongoDB 旨在為WEB應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案褂痰。
- MongoDB 將數(shù)據(jù)存儲為一個文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對組成症虑。MongoDB 文檔類似于 JSON 對象缩歪。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組谍憔。
3. 主要特點
- MongoDB的提供了一個面向文檔存儲匪蝙,操作起來比較簡單和容易。
- 你可以在MongoDB記錄中設(shè)置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現(xiàn)更快的排序习贫。
- 你可以通過本地或者網(wǎng)絡(luò)創(chuàng)建數(shù)據(jù)鏡像逛球,這使得MongoDB有更強的擴展性。
- 如果負載的增加(需要更多的存儲空間和更強的處理能力) 苫昌,它可以分布在計算機網(wǎng)絡(luò)中的其他節(jié)點上這就是所謂的分片颤绕。
- Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記祟身,可輕易查詢文檔中內(nèi)嵌的對象及數(shù)組奥务。
- MongoDb 使用update()命令可以實現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段 。
- Mongodb中的Map/reduce主要是用來對數(shù)據(jù)進行批量處理和聚合操作袜硫。
- Map和Reduce氯葬。Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數(shù)進行處理婉陷。
- Map函數(shù)和Reduce函數(shù)是使用Javascript編寫的帚称,并可以通過db.runCommand或mapreduce命令來執(zhí)行MapReduce操作。
- GridFS是MongoDB中的一個內(nèi)置功能秽澳,可以用于存放大量小文件闯睹。
- MongoDB允許在服務(wù)端執(zhí)行腳本,可以用Javascript編寫某個函數(shù)担神,直接在服務(wù)端執(zhí)行楼吃,也可以把函數(shù)的定義存儲在服務(wù)端,下次直接調(diào)用即可。
- MongoDB支持各種編程語言:RUBY所刀,PYTHON衙荐,JAVA,C++浮创,PHP忧吟,C#等多種語言。
- MongoDB安裝簡單
4. 概念解析
sql database | nosql database | 數(shù)據(jù)庫 |
---|---|---|
table | collection | 數(shù)據(jù)庫表/集合 |
row | document | 數(shù)據(jù)記錄行/文檔 |
column | field | 數(shù)據(jù)字段/域 |
index | index | 索引 |
table joins | MongoDB不支持 | 表連接 |
primary key | primary key | 主鍵,MongoDB自動將_id字段設(shè)置為主鍵 |
5. 創(chuàng)建數(shù)據(jù)庫
- 創(chuàng)建/使用 use info # info是數(shù)據(jù)庫名稱,以下凡是用到info的都是泛指數(shù)據(jù)庫的名稱
- 查看 show dbs
- 查看當(dāng)前使用 db
6. 刪除數(shù)據(jù)庫
- 刪除數(shù)據(jù)庫 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"})
更多實例
只更新第一條記錄:
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 );
全部添加加進去:
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 語句比較
如果你熟悉常規(guī)的 SQL 數(shù)據(jù)斩披,通過下表可以更好的理解 MongoDB 的條件語句查詢:
操作 | 格式 | 范例 | RDBMS中的類似語句 |
---|---|---|---|
等于 | {<key>:<value>} | db.col.find({"by":"菜鳥教程"}).pretty() | where by = '菜鳥教程' |
小于 | {<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":"菜鳥教程", "title":"MongoDB 教程"}).pretty()
- MongoDB OR 條件
- db.col.find({$or:[{"by":"菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
- AND 和 OR 聯(lián)合使用
- db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
10. 條件操作符
- 先插入測試數(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類型來檢索集合中匹配的數(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 |
- 先插入測試數(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標識tuple 結(jié)果 1, [1,2] 兩條
db.col.find({title:{$type:2}}) # 2標識字符串 "a" 一條
db.col.find({title:{$type:3}}) # 4標識Array 沒有結(jié)果
12. Limit與Skip方法
db.col.find({title:"a"}).limit(1) # 顯示1條
db.col.find({title:"a"}).limit(1).skip(1) # 顯示1條 跳過1條
補充說明:
- db.col.find({},{"title":1,_id:0}).limit(2)
- 第一個 {} 放 where 條件煌抒,為空表示返回集合中所有文檔。
- 第二個 {} 指定那些列顯示和不顯示 (0表示不顯示 1表示顯示)
- 想要讀取從 10 條記錄后 100 條記錄厕倍,相當(dāng)于 sql 中l(wèi)imit (10,100)寡壮。
- db.COLLECTION_NAME.find().skip(10).limit(100)
- 以上實例在集合中跳過前面 10 條返回 100 條數(shù)據(jù)。
- skip 和 limit 結(jié)合就能實現(xiàn)分頁讹弯。
- 當(dāng)查詢時同時使用sort,skip,limit况既,無論位置先后,最先執(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后臺創(chuàng)建
ensureIndex() 接收可選參數(shù)棒仍,可選參數(shù)列表如下:
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引過程會阻塞其它數(shù)據(jù)庫操作,background可指定以后臺方式創(chuàng)建索引臭胜,即增加 "background" 可選參數(shù)莫其。 "background" 默認值為false。 |
unique | Boolean | 建立的索引是否唯一耸三。指定為true創(chuàng)建唯一索引乱陡。默認值為false. |
name | string | 索引的名稱。如果未指定吕晌,MongoDB的通過連接索引的字段名和排序順序生成一個索引名稱蛋褥。 |
dropDups | Boolean | 在建立唯一索引時是否刪除重復(fù)記錄,指定 true 創(chuàng)建唯一索引。默認值為 false. |
sparse | Boolean | 對文檔中不存在的字段數(shù)據(jù)不啟用索引睛驳;這個參數(shù)需要特別注意,如果設(shè)置為true的話膜廊,在索引字段中不會查詢出不包含對應(yīng)字段的文檔.乏沸。默認值為 false. |
expireAfterSeconds | integer | 指定一個以秒為單位的數(shù)值,完成 TTL設(shè)定爪瓜,設(shè)定集合的生存時間蹬跃。 |
v | index version | 索引的版本號。默認的索引版本取決于mongod創(chuàng)建索引時運行的版本。 |
weights | document | 索引權(quán)重值蝶缀,數(shù)值在 1 到 99,999 之間丹喻,表示該索引相對于其他索引字段的得分權(quán)重。 |
default_language | string | 對于文本索引翁都,該參數(shù)決定了停用詞及詞干和詞器的規(guī)則的列表碍论。 默認為英語 |
language_override | string | 對于文本索引,該參數(shù)指定了包含在文檔中的字段名柄慰,語言覆蓋默認的language鳍悠,默認值為 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()計算結(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;
表達式 | 描述 | 實例 |
---|---|---|
$sum | 計算總和。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 計算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 獲取集合中所有文檔對應(yīng)值得最小值坐搔。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 獲取集合中所有文檔對應(yīng)值得最大值藏研。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 在結(jié)果文檔中插入值到一個數(shù)組中。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在結(jié)果文檔中插入值到一個數(shù)組中概行,但不創(chuàng)建副本蠢挡。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根據(jù)資源文檔的排序獲取第一個文檔數(shù)據(jù)。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根據(jù)資源文檔的排序獲取最后一個文檔數(shù)據(jù) | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
管道的概念
管道在Unix和Linux中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個命令的參數(shù)凳忙。
MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢后將結(jié)果傳遞給下一個管道處理业踏。管道操作是可以重復(fù)的。
表達式:處理輸入文檔并輸出消略。表達式是無狀態(tài)的堡称,只能用于計算當(dāng)前聚合管道的文檔,不能處理其它的文檔艺演。
這里我們介紹一下聚合框架中常用的幾個操作:
$project:修改輸入文檔的結(jié)構(gòu)却紧。可以用來重命名胎撤、增加或刪除域晓殊,也可以用于創(chuàng)建計算結(jié)果以及嵌套文檔。
$match:用于過濾數(shù)據(jù)伤提,只輸出符合條件的文檔巫俺。$match使用MongoDB的標準查詢操作。
$limit:用來限制MongoDB聚合管道返回的文檔數(shù)肿男。
$skip:在聚合管道中跳過指定數(shù)量的文檔介汹,并返回余下的文檔。
$unwind:將文檔中的某一個數(shù)組類型字段拆分成多條舶沛,每條包含數(shù)組中的一個值嘹承。
$group:將集合中的文檔分組,可用于統(tǒng)計結(jié)果如庭。
$sort:將輸入文檔排序后輸出叹卷。
$geoNear:輸出接近某一地理位置的有序文檔。
管道操作符實例
1、$project實例
db.article.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
這樣的話結(jié)果中就只還有_id,tilte和author三個字段了骤竹,默認情況下_id字段是被包含的帝牡,如果要想不包含_id話可以這樣:
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1
}});
2.$match實例
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
$match用于獲取分數(shù)大于70小于或等于90記錄,然后將符合條件的記錄送到下一階段$group管道操作符進行處理蒙揣。
3.$skip實例
db.article.aggregate(
{ $skip : 5 });
經(jīng)過$skip管道操作符處理后靶溜,前五個文檔被"過濾"掉。
筆記列表
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
以上實例類似sql語句:
select by_user as _id, count(*) as num_tutorial from mycol group by by_user
db.articles.aggregate({
$project : {
title: 2,
by_user: 1,
}
})
這樣子也是可行的鸣奔。也就是說非0也可以進行表示顯示該字段,負數(shù)也可以表示顯示該字段墨技。
16. MongoDB復(fù)制原理
MongoDB復(fù)制原理
mongodb的復(fù)制至少需要兩個節(jié)點。其中一個是主節(jié)點挎狸,負責(zé)處理客戶端請求扣汪,其余的都是從節(jié)點,負責(zé)復(fù)制主節(jié)點上的數(shù)據(jù)锨匆。
mongodb各個節(jié)點常見的搭配方式為:一主一從崭别、一主多從。
主節(jié)點記錄在其上的所有操作oplog恐锣,從節(jié)點定期輪詢主節(jié)點獲取這些操作茅主,然后對自己的數(shù)據(jù)副本執(zhí)行這些操作,從而保證從節(jié)點的數(shù)據(jù)與主節(jié)點一致土榴。
副本集特征:
- N 個節(jié)點的集群
- 任何節(jié)點可作為主節(jié)點
- 所有寫入操作都在主節(jié)點上
- 自動故障轉(zhuǎn)移
- 自動恢復(fù)
實例:
mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
以上實例會啟動一個名為rs0的MongoDB實例诀姚,其端口號為27017。
啟動后打開命令提示框并連接上mongoDB服務(wù)玷禽。
在Mongo客戶端使用命令rs.initiate()來啟動一個新的副本集赫段。
我們可以使用rs.conf()來查看副本集的配置
查看副本集狀態(tài)使用 rs.status() 命令
假設(shè)你已經(jīng)啟動了一個名為mongod1.net,端口號為27017的Mongo服務(wù)矢赁。 在客戶端命令窗口使用rs.add() 命令將其添加到副本集中糯笙,命令如下所示:
rs.add("mongod1.net:27017")
MongoDB中你只能通過主節(jié)點將Mongo服務(wù)添加到副本集中, 判斷當(dāng)前運行的Mongo服務(wù)是否為主節(jié)點可以使用命令db.isMaster() 撩银。
MongoDB的副本集與我們常見的主從有所不同给涕,主從在主機宕機后所有服務(wù)將停止,而副本集在主機宕機后额获,副本會接管主節(jié)點成為主節(jié)點够庙,不會出現(xiàn)宕機的情況。
17. MongoDB 分片
分片
在Mongodb里面存在另一種集群抄邀,就是分片技術(shù),可以滿足MongoDB數(shù)據(jù)量大量增長的需求首启。
當(dāng)MongoDB存儲海量的數(shù)據(jù)時,一臺機器可能不足以存儲數(shù)據(jù)撤摸,也可能不足以提供可接受的讀寫吞吐量。這時,我們就可以通過在多臺機器上分割數(shù)據(jù)准夷,使得數(shù)據(jù)庫系統(tǒng)能存儲和處理更多的數(shù)據(jù)钥飞。
為什么使用分片
復(fù)制所有的寫入操作到主節(jié)點
延遲的敏感數(shù)據(jù)會在主節(jié)點查詢
單個副本集限制在12個節(jié)點
當(dāng)請求量巨大時會出現(xiàn)內(nèi)存不足。
本地磁盤不足
垂直擴展價格昂貴
MongoDB分片
下圖展示了在MongoDB中使用分片集群結(jié)構(gòu)分布:
上圖中主要有如下所述三個主要組件:
Shard:
用于存儲實際的數(shù)據(jù)塊衫嵌,實際生產(chǎn)環(huán)境中一個shard server角色可由幾臺機器組個一個replica set承擔(dān)读宙,防止主機單點故障
Config Server:
mongod實例,存儲了整個 ClusterMetadata楔绞,其中包括 chunk信息结闸。
Query Routers:
前端路由,客戶端由此接入酒朵,且讓整個集群看上去像單一數(shù)據(jù)庫桦锄,前端應(yīng)用可以透明使用。
分片實例
分片結(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
步驟一:啟動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
步驟二: 啟動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
注意:這里我們完全可以像啟動普通mongodb服務(wù)一樣啟動蔫耽,不需要添加—shardsvr和configsvr參數(shù)结耀。因為這兩個參數(shù)的作用就是改變啟動端口的,所以我們自行指定了端口就可以匙铡。
步驟三: 啟動Route Process
/usr/local/mongoDB/bin/mongos --port 40000 --configdb localhost:27100 --fork --logpath=/www/mongoDB/shard/log/route.log --chunkSize 500
mongos啟動參數(shù)中图甜,chunkSize這一項是用來指定chunk的大小的,單位是MB鳖眼,默認大小為200MB.
步驟四: 配置Sharding
接下來黑毅,我們使用MongoDB Shell登錄到mongos,添加Shard節(jié)點
[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è)置分片存儲的數(shù)據(jù)庫
{ "ok" : 1 }
mongos> db.runCommand({ shardcollection: "test.log", key: { id:1,time:1}})
{ "collectionsharded" : "test.log", "ok" : 1 }
步驟五: 程序代碼內(nèi)無需太大更改钦讳,直接按照連接普通的mongo數(shù)據(jù)庫那樣矿瘦,將數(shù)據(jù)庫連接接入接口40000
18. MongoDB 備份(mongodump)與恢復(fù)(mongorestore)
MongoDB數(shù)據(jù)備份
在Mongodb中我們使用mongodump命令來備份MongoDB數(shù)據(jù)。該命令可以導(dǎo)出所有數(shù)據(jù)到指定目錄中蜂厅。
mongodump命令可以通過參數(shù)指定導(dǎo)出的數(shù)據(jù)量級轉(zhuǎn)存的服務(wù)器匪凡。
語法
mongodump命令腳本語法如下:
mongodump -h dbhost -d dbname -o dbdirectory
-h:
MongDB所在服務(wù)器地址,例如:127.0.0.1掘猿,當(dāng)然也可以指定端口號:127.0.0.1:27017
-d:
需要備份的數(shù)據(jù)庫實例病游,例如:test
-o:
備份的數(shù)據(jù)存放位置,例如:c:\data\dump稠通,當(dāng)然該目錄需要提前建立衬衬,在備份完成后,系統(tǒng)自動在dump目錄下建立一個test目錄改橘,這個目錄里面存放該數(shù)據(jù)庫實例的備份數(shù)據(jù)滋尉。
實例
在本地使用 27017 啟動你的mongod服務(wù)。打開命令提示符窗口飞主,進入MongoDB安裝目錄的bin目錄輸入命令mongodump:
>mongodump
執(zhí)行以上命令后狮惜,客戶端會連接到ip為 127.0.0.1 端口號為 27017 的MongoDB服務(wù)上高诺,并備份所有數(shù)據(jù)到 bin/dump/ 目錄中。命令輸出結(jié)果如下:
MongoDB數(shù)據(jù)備份
mongodump 命令可選參數(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ù)庫的集合碾篡。 mongodump --collection mycol --db test
MongoDB數(shù)據(jù)恢復(fù)
mongodb使用 mongorestore 命令來恢復(fù)備份的數(shù)據(jù)虱而。
語法
mongorestore命令腳本語法如下:
mongorestore -h <hostname><:port> -d dbname <path>
--host <:port>, -h <:port>:
MongoDB所在服務(wù)器地址,默認為: localhost:27017
--db , -d :
需要恢復(fù)的數(shù)據(jù)庫實例开泽,例如:test牡拇,當(dāng)然這個名稱也可以和備份時候的不一樣,比如test2
--drop:
恢復(fù)的時候穆律,先刪除當(dāng)前數(shù)據(jù)惠呼,然后恢復(fù)備份的數(shù)據(jù)。就是說峦耘,恢復(fù)后剔蹋,備份后添加修改的數(shù)據(jù)都會被刪除,慎用哦贡歧!
<path>:
mongorestore 最后的一個參數(shù)滩租,設(shè)置備份數(shù)據(jù)所在位置,例如:c:\data\dump\test利朵。
你不能同時指定 <path> 和 --dir 選項律想,--dir也可以設(shè)置備份目錄。
--dir:
指定備份的目錄
你不能同時指定 <path> 和 --dir 選項绍弟。
接下來我們執(zhí)行以下命令:
>mongorestore
執(zhí)行以上命令輸出結(jié)果如下:
MongoDB數(shù)據(jù)恢復(fù)
19. MongoDB 監(jiān)控
在你已經(jīng)安裝部署并允許MongoDB服務(wù)后技即,你必須要了解MongoDB的運行情況,并查看MongoDB的性能樟遣。這樣在大流量得情況下可以很好的應(yīng)對并保證MongoDB正常運作而叼。
MongoDB中提供了mongostat 和 mongotop 兩個命令來監(jiān)控MongoDB的運行情況。
mongostat 命令
mongostat是mongodb自帶的狀態(tài)檢測工具豹悬,在命令行下使用葵陵。它會間隔固定時間獲取mongodb的當(dāng)前運行狀態(tài),并輸出瞻佛。如果你發(fā)現(xiàn)數(shù)據(jù)庫突然變慢或者有其他問題的話脱篙,你第一手的操作就考慮采用mongostat來查看mongo的狀態(tài)。
啟動你的Mongod服務(wù)伤柄,進入到你安裝的MongoDB目錄下的bin目錄绊困, 然后輸入mongostat命令,如下所示:
D:\set up\mongodb\bin>mongostat
以上命令輸出結(jié)果如下:
mongotop 命令
mongotop也是mongodb下的一個內(nèi)置工具适刀,mongotop提供了一個方法秤朗,用來跟蹤一個MongoDB的實例,查看哪些大量的時間花費在讀取和寫入數(shù)據(jù)笔喉。 mongotop提供每個集合的水平的統(tǒng)計數(shù)據(jù)取视。默認情況下硝皂,mongotop返回值的每一秒。
啟動你的Mongod服務(wù)贫途,進入到你安裝的MongoDB目錄下的bin目錄吧彪, 然后輸入mongotop命令,如下所示:
D:\set up\mongodb\bin>mongotop
以上命令執(zhí)行輸出結(jié)果如下:
帶參數(shù)實例
E:\mongodb-win32-x86_64-2.2.1\bin>mongotop 10
后面的10是<sleeptime>參數(shù) 丢早,可以不使用,等待的時間長度秧倾,以秒為單位怨酝,mongotop等待調(diào)用之間。通過的默認mongotop返回數(shù)據(jù)的每一秒那先。
E:\mongodb-win32-x86_64-2.2.1\bin>mongotop --locks
報告每個數(shù)據(jù)庫的鎖的使用中农猬,使用mongotop - 鎖,這將產(chǎn)生以下輸出:
輸出結(jié)果字段說明:
ns:
包含數(shù)據(jù)庫命名空間售淡,后者結(jié)合了數(shù)據(jù)庫名稱和集合斤葱。
db:
包含數(shù)據(jù)庫的名稱。名為 . 的數(shù)據(jù)庫針對全局鎖定揖闸,而非特定數(shù)據(jù)庫揍堕。
total:
mongod花費的時間工作在這個命名空間提供總額。
read:
提供了大量的時間汤纸,這mongod花費在執(zhí)行讀操作衩茸,在此命名空間。
write:
提供這個命名空間進行寫操作贮泞,這mongod花了大量的時間楞慈。