MongoDB 安裝配置 及學(xué)習(xí)筆記

[TOC]
未完更新中...

1. MongoDB安裝及配置

  1. 官網(wǎng)下載地址
  2. 安裝msc文件,現(xiàn)在3.4的版本,有了msc,所以沒(méi)有選擇zip格式安裝包,安裝過(guò)程選擇customer,選擇安裝地址,安裝目錄盡量簡(jiǎn)化,其他就是下一步,安裝很簡(jiǎn)單
  3. 我的安裝目錄是 C:\MongoDB\Server,在目錄下新建名字為: "db" 的文件夾,在db目錄下,新建名為:"logs"的文件夾
  4. 在主目錄下,新建名為: "mongo.conf" 的文件,把下邊內(nèi)容黏貼并修改
  5. 修改系統(tǒng)環(huán)境變量,在"Path"系統(tǒng)環(huán)境變量里,添加 "C:\MongoDB\Server\bin",注意增加分號(hào)";"
  6. 添加為自啟動(dòng)系統(tǒng)服務(wù) mongod --config C:\MongoDB\Server\mongo.conf --install --serviceName "MongoDB"
  7. 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 ?

  1. MongoDB 是由C++語(yǔ)言編寫(xiě)的,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)。
  2. 在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。
  3. MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
  4. MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。MongoDB 文檔類似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。

3. 主要特點(diǎn)

  1. MongoDB的提供了一個(gè)面向文檔存儲(chǔ),操作起來(lái)比較簡(jiǎn)單和容易。
  2. 你可以在MongoDB記錄中設(shè)置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來(lái)實(shí)現(xiàn)更快的排序。
  3. 你可以通過(guò)本地或者網(wǎng)絡(luò)創(chuàng)建數(shù)據(jù)鏡像,這使得MongoDB有更強(qiáng)的擴(kuò)展性。
  4. 如果負(fù)載的增加(需要更多的存儲(chǔ)空間和更強(qiáng)的處理能力) ,它可以分布在計(jì)算機(jī)網(wǎng)絡(luò)中的其他節(jié)點(diǎn)上這就是所謂的分片。
  5. Mongo支持豐富的查詢表達(dá)式。查詢指令使用JSON形式的標(biāo)記,可輕易查詢文檔中內(nèi)嵌的對(duì)象及數(shù)組。
  6. MongoDb 使用update()命令可以實(shí)現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段 。
  7. Mongodb中的Map/reduce主要是用來(lái)對(duì)數(shù)據(jù)進(jìn)行批量處理和聚合操作。
  8. Map和Reduce。Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數(shù)進(jìn)行處理。
  9. Map函數(shù)和Reduce函數(shù)是使用Javascript編寫(xiě)的,并可以通過(guò)db.runCommand或mapreduce命令來(lái)執(zhí)行MapReduce操作。
  10. GridFS是MongoDB中的一個(gè)內(nèi)置功能,可以用于存放大量小文件。
  11. MongoDB允許在服務(wù)端執(zhí)行腳本,可以用Javascript編寫(xiě)某個(gè)函數(shù),直接在服務(wù)端執(zhí)行,也可以把函數(shù)的定義存儲(chǔ)在服務(wù)端,下次直接調(diào)用即可。
  12. MongoDB支持各種編程語(yǔ)言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語(yǔ)言。
  13. 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
  1. 先插入測(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})
  1. 使用$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ō)明:

  1. db.col.find({},{"title":1,_id:0}).limit(2)
    • 第一個(gè) {} 放 where 條件,為空表示返回集合中所有文檔。
    • 第二個(gè) {} 指定那些列顯示和不顯示 (0表示不顯示 1表示顯示)
  2. 想要讀取從 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è)。
  3. 當(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í)間。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,553評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,620評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,416評(píng)論 6 405
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,940評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,170評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,709評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,597評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,784評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評(píng)論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,029評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,407評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,663評(píng)論 1 280
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,403評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,746評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容

  • 一、MongoDB簡(jiǎn)介 1.概述 ? MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù),由C++語(yǔ)言編寫(xiě)。旨在為WE...
    鄭元吉閱讀 981評(píng)論 0 2
  • 客戶端https://robomongo.org/ 連接mongodb://[username:password@...
    加勒比兔Z閱讀 338評(píng)論 0 0
  • MongoDB文檔 MongoDB 概念解析 不管我們學(xué)習(xí)什么數(shù)據(jù)庫(kù)都應(yīng)該學(xué)習(xí)其中的基礎(chǔ)概念,在mongodb中基...
    birdflying閱讀 2,004評(píng)論 0 27
  • MongoDB簡(jiǎn)介 MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語(yǔ)言編寫(xiě)。旨在為 WEB 應(yīng)用提...
    奮斗的小鳥(niǎo)GO閱讀 700評(píng)論 0 4
  • 從前 雪會(huì)沒(méi)過(guò)腳脖子 白花花 晃的睜不開(kāi)眼 沙沙掃雪聲 驚醒了清晨 父親在院里院外 揮舞著掃帚 如翻弄著一堆堆棉花...
    一團(tuán)菌閱讀 259評(píng)論 8 5