上一篇文章練習了,MongoDB 的如下操做html
接下來繼續mongodb
MongoDB Limit() 方法shell
若是你須要在MongoDB中讀取指定數量的數據記錄,可使用MongoDB的Limit方法,limit()方法接受一個數字參數,該參數指定從MongoDB中讀取的記錄條數。數據庫
插入測試數據ubuntu
db.col.insert({title: 'MongoDB-1'})
db.col.insert({title: 'MongoDB-2'})
db.col.insert({title: 'MongoDB-3'})
db.col.insert({title: 'MongoDB-4'})
複製代碼
MongoDB Enterprise > db.col.find()
{ "_id" : ObjectId("5a6e8eaef14a3f270ba2dd0c"), "title" : "MongoDB-1" }
{ "_id" : ObjectId("5a6e8ec8f14a3f270ba2dd0d"), "title" : "MongoDB-2" }
{ "_id" : ObjectId("5a6e8ecbf14a3f270ba2dd0e"), "title" : "MongoDB-3" }
{ "_id" : ObjectId("5a6e8ed5f14a3f270ba2dd0f"), "title" : "MongoDB-4" }
MongoDB Enterprise >
複製代碼
語法數組
limit()方法基本語法以下所示:安全
> db.COLLECTION_NAME.find().limit(NUMBER)
複製代碼
以上實例爲顯示查詢文檔中的兩條記錄:服務器
MongoDB Enterprise > db.col.find().limit(2)
{ "_id" : ObjectId("5a6e8eaef14a3f270ba2dd0c"), "title" : "MongoDB-1" }
{ "_id" : ObjectId("5a6e8ec8f14a3f270ba2dd0d"), "title" : "MongoDB-2" }
MongoDB Enterprise > db.col.find({},{"title":1,_id:0}).limit(2)
{ "title" : "MongoDB-1" }
{ "title" : "MongoDB-2" }
MongoDB Enterprise >
複製代碼
注:若是大家沒有指定limit()方法中的參數則顯示集合中的全部數據。
MongoDB Enterprise > db.col.find({},{"title":1,_id:0}).limit()
{ "title" : "MongoDB-1" }
{ "title" : "MongoDB-2" }
{ "title" : "MongoDB-3" }
{ "title" : "MongoDB-4" }
複製代碼
咱們除了可使用limit()方法來讀取指定數量的數據外,還可使用skip()方法來跳過指定數量的數據,skip方法一樣接受一個數字參數做爲跳過的記錄條數。 語法
skip() 方法腳本語法格式以下:
> db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
複製代碼
實例
以上實例只會顯示第二條文檔數據
MongoDB Enterprise > db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
{ "title" : "MongoDB-2" }
MongoDB Enterprise >
複製代碼
注:skip()方法默認參數爲 0
在MongoDB中使用使用sort()方法對數據進行排序,sort()方法能夠經過參數指定排序的字段
使用 1 和 -1 來指定排序的方式,其中 1 爲升序排列,而-1是用於降序排列。
語法
sort()方法基本語法以下所示:
> db.COLLECTION_NAME.find().sort({KEY:1})
複製代碼
col 集合中的數據以下:
MongoDB Enterprise > db.col.find()
{ "_id" : ObjectId("5a6e8eaef14a3f270ba2dd0c"), "title" : "MongoDB-1" }
{ "_id" : ObjectId("5a6e8ec8f14a3f270ba2dd0d"), "title" : "MongoDB-2" }
{ "_id" : ObjectId("5a6e8ecbf14a3f270ba2dd0e"), "title" : "MongoDB-3" }
{ "_id" : ObjectId("5a6e8ed5f14a3f270ba2dd0f"), "title" : "MongoDB-4" }
MongoDB Enterprise >
複製代碼
其中 1 爲升序排列,而-1是用於降序排列
如下實例演示了 col 集合中的數據按字段 title 的降序排列:
MongoDB Enterprise > db.col.find({},{"title":1,_id:0}).sort({"title":-1})
{ "title" : "MongoDB-4" }
{ "title" : "MongoDB-3" }
{ "title" : "MongoDB-2" }
{ "title" : "MongoDB-1" }
MongoDB Enterprise >
複製代碼
注: 若是沒有指定sort()方法的排序方式,默認按照文檔的升序排列。
索引一般可以極大的提升查詢的效率,若是沒有索引,MongoDB在讀取數據時必須掃描集合中的每一個文件並選取那些符合查詢條件的記錄。
這種掃描全集合的查詢效率是很是低的,特別在處理大量的數據時,查詢能夠要花費幾十秒甚至幾分鐘,這對網站的性能是很是致命的。
索引是特殊的數據結構,索引存儲在一個易於遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構
MongoDB使用 ensureIndex() 方法來建立索引。
語法
ensureIndex()方法基本語法格式以下所示:
> db.COLLECTION_NAME.ensureIndex({KEY:1})
複製代碼
語法中 Key 值爲你要建立的索引字段,1爲指定按升序建立索引,若是你想按降序來建立索引指定爲-1便可。
實例
> db.COLLECTION_NAME.ensureIndex({KEY:1})
複製代碼
語法中 Key 值爲你要建立的索引字段,1爲指定按升序建立索引,若是你想按降序來建立索引指定爲-1便可。
實例
MongoDB Enterprise > db.col.ensureIndex({"title":1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
MongoDB Enterprise >
複製代碼
db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一個 Nosql 數據庫',
by: '搜雲庫教程-專一於開發技術的研究與知識分享',
url: 'http://www.souyunku.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
複製代碼
ensureIndex() 方法中你也能夠設置使用多個字段建立索引(關係型數據庫中稱做複合索引)。
MongoDB Enterprise > db.col.ensureIndex({"title":1,"description":1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 3,
"numIndexesAfter" : 4,
"ok" : 1
}
複製代碼
ensureIndex() 接收可選參數,可選參數列表以下:
實例
在後臺建立索引:
建索引過程會阻塞其它數據庫操做,background可指定之後臺方式建立索引,即增長 "background" 可選參數。 "background" 默認值爲false。
MongoDB Enterprise > db.col.ensureIndex({"url":1}, {background: true})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 5,
"numIndexesAfter" : 6,
"ok" : 1
}
MongoDB Enterprise >
複製代碼
MongoDB 聚合
MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點相似sql語句中的 count(*)。
刪除以前的測試數據
MongoDB Enterprise > db.col.remove({})
WriteResult({ "nRemoved" : 5 })
MongoDB Enterprise >
複製代碼
插入新的測試數據
db.col.insert({
title: 'MongoDB 教程',
description: 'MongoDB 是一個 Nosql 數據庫',
by_user: 'penglei',
url: 'http://www.souyunku.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
db.col.insert({
title: 'MongoDB 教程',
description: 'MongoDB 是一個 Nosql 數據庫',
by_user: 'penglei',
url: 'http://www.souyunku.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 200
})
db.col.insert({
title: 'MongoDB 教程',
description: 'MongoDB 是一個 Nosql 數據庫',
by_user: 'penglei',
url: 'http://www.souyunku.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 300
})
複製代碼
MongoDB Enterprise > db.col.find()
{ "_id" : ObjectId("5a6ebfab5326a260464a4072"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by_user" : "penglei", "url" : "http://www.souyunku.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5a6ebfab5326a260464a4073"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by_user" : "penglei", "url" : "http://www.souyunku.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 200 }
{ "_id" : ObjectId("5a6ebfab5326a260464a4074"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by_user" : "penglei", "url" : "http://www.souyunku.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 300 }
MongoDB Enterprise >
複製代碼
MongoDB中聚合的方法使用aggregate()。
語法
aggregate() 方法的基本語法格式以下所示:
> db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
複製代碼
MongoDB Enterprise > db.col.aggregate([{$group : {_id : "$by_user", num_tutorials : {$sum : 1}}}])
{
"_id": "penglei",
"num_tutorials": 3
}
MongoDB Enterprise > db.col.aggregate([{$group : {_id : "$by_user", totle : {$sum : 1}}}])
{
"_id": "penglei",
"totle": 3
}
MongoDB Enterprise >
複製代碼
以上實例相似sql語句:select by_user, count(*) from col group by by_user
在上面的例子中,咱們經過字段by_user字段對數據進行分組,並計算by_user字段相同值的總和。
下表展現了一些聚合的表達式:
管道在Unix和Linux中通常用於將當前命令的輸出結果做爲下一個命令的參數。
MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操做是能夠重複的。
表達式:處理輸入文檔並輸出。表達式是無狀態的,只能用於計算當前聚合管道的文檔,不能處理其它的文檔。
這裏咱們介紹一下聚合框架中經常使用的幾個操做:
一、$project實例
MongoDB Enterprise > db.col.aggregate(
{ $project : {
title : 1 ,
by_user : 1 ,
}}
);
{ "_id" : ObjectId("5a6ebfab5326a260464a4072"), "title" : "MongoDB 教程", "by_user" : "penglei" }
{ "_id" : ObjectId("5a6ebfab5326a260464a4073"), "title" : "MongoDB 教程", "by_user" : "penglei" }
{ "_id" : ObjectId("5a6ebfab5326a260464a4074"), "title" : "MongoDB 教程", "by_user" : "penglei" }
MongoDB Enterprise >
複製代碼
這樣的話結果中就只還有_id,tilte和by_user三個字段了,默認狀況下_id字段是被包含的,若是要想不包含_id話能夠這樣:
MongoDB Enterprise > db.col.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
by_user : 1
}});
複製代碼
{ "title" : "MongoDB 教程", "by_user" : "penglei" }
{ "title" : "MongoDB 教程", "by_user" : "penglei" }
{ "title" : "MongoDB 教程", "by_user" : "penglei" }
複製代碼
2.$match實例
db.col.aggregate( [
{ $match : { likes : { $gt : 90, $lte : 200 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
複製代碼
group管道操做符進行處理。
MongoDB Enterprise > db.col.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{ "_id" : "penglei", "num_tutorial" : 3 }
MongoDB Enterprise >
複製代碼
以上實例相似sql語句:
select by_user as _id, count(*) as num_tutorial from mycol group by by_user
複製代碼
按日、按月、按年、按周、按小時、按分鐘聚合操做以下:
db.getCollection('m_msg_tb').aggregate(
[
{$match:{m_id:10001,mark_time:{$gt:new Date(2017,8,0)}}},
{$group: {
_id: {$dayOfMonth:'$mark_time'},
pv: {$sum: 1}
}
},
{$sort: {"_id": 1}}
])
複製代碼
時間關鍵字以下:
MongoDB複製是將數據同步在多個服務器的過程。
複製提供了數據的冗餘備份,並在多個服務器上存儲數據副本,提升了數據的可用性, 並能夠保證數據的安全性。
複製還容許您從硬件故障和服務中斷中恢復數據。
官方文檔 docs.mongodb.com/manual/repl…
mongodb的複製至少須要兩個節點。其中一個是主節點,負責處理客戶端請求,其他的都是從節點,負責複製主節點上的數據。
mongodb各個節點常見的搭配方式爲:一主一從、一主多從。
主節點記錄在其上的全部操做oplog,從節點按期輪詢主節點獲取這些操做,而後對本身的數據副本執行這些操做,從而保證從節點的數據與主節點一致。
MongoDB複製結構圖以下所示:
以上結構圖中,客戶端從主節點讀取數據,在客戶端寫入數據到主節點時, 主節點與從節點進行數據交互保障數據的一致性。
一、關閉正在運行的MongoDB服務器。
service mongod stop
複製代碼
2.節點建點
首先須要去你選擇的mongodb數據文件存放的文件夾新建三個數據庫,用來模擬三臺不通的機器,博主的路徑以下
mkdir -p /data/db/node1
mkdir -p /data/db/node2
mkdir -p /data/db/node3
複製代碼
3.啓動三個數據庫(dbpath),而且端口(--port 1000x),集羣名稱(--replSet gabriel),關閉日誌選項(--nojournal),守護進程方式啓動,會自動拉起(--fork),日誌目錄(--logpath)
mongod --dbpath /data/db/node1 --port 10001 --replSet gabriel --nojournal --fork --logpath /data/db/node1.log
mongod --dbpath /data/db/node2 --port 10002 --replSet gabriel --nojournal --fork --logpath /data/db/node2.log
mongod --dbpath /data/db/node3 --port 10003 --replSet gabriel --nojournal --fork --logpath /data/db/node3.log
複製代碼
4.順便鏈接一個服務器,作初始化操做,這裏博主連入10001端口
終端下進入
mongo localhost:10001
複製代碼
進入後輸入初始化方法
MongoDB Enterprise gabriel:OTHER> rs.initiate({_id:"gabriel",members:[
{_id:1,host:"localhost:10001"},
{_id:2,host:"localhost:10002"},
{_id:3,host:"localhost:10003"},
]})
複製代碼
收到以下信息就成功了。
{
"ok" : 1,
"operationTime" : Timestamp(1517221411, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1517221411, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
MongoDB Enterprise gabriel:OTHER>
複製代碼
此時會發現終端上的輸出已經有了變化。
//從單個一個
>
//變成了
gabriel:OTHER>
複製代碼
5.查詢狀態
MongoDB Enterprise gabriel:OTHER> rs.status()
{
"set" : "gabriel",
"date" : ISODate("2018-01-29T10:33:21.227Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1517221984, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1517221984, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1517221994, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1517221994, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 1,
"name" : "localhost:10001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 659,
"optime" : {
"ts" : Timestamp(1517221994, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-01-29T10:33:14Z"),
"electionTime" : Timestamp(1517221422, 1),
"electionDate" : ISODate("2018-01-29T10:23:42Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 2,
"name" : "localhost:10002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 589,
"optime" : {
"ts" : Timestamp(1517221994, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1517221984, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-01-29T10:33:14Z"),
"optimeDurableDate" : ISODate("2018-01-29T10:33:04Z"),
"lastHeartbeat" : ISODate("2018-01-29T10:33:20.972Z"),
"lastHeartbeatRecv" : ISODate("2018-01-29T10:33:19.923Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "localhost:10001",
"configVersion" : 1
},
{
"_id" : 3,
"name" : "localhost:10003",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 589,
"optime" : {
"ts" : Timestamp(1517221994, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1517221984, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-01-29T10:33:14Z"),
"optimeDurableDate" : ISODate("2018-01-29T10:33:04Z"),
"lastHeartbeat" : ISODate("2018-01-29T10:33:20.972Z"),
"lastHeartbeatRecv" : ISODate("2018-01-29T10:33:19.921Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "localhost:10001",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1517221994, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1517221994, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
複製代碼
在返回中,參數set後面爲集羣名稱,每一個members下面能夠看到他們各自的狀況,其中stateStr是角色,主節點爲(PRIMARY)。
6.進入主節點插入數據,進入從節點查看數據
博主主節點在10001接口
mongo localhost:10001
複製代碼
插入數據
MongoDB Enterprise gabriel:PRIMARY> use test
switched to db test
複製代碼
db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一個 Nosql 數據庫',
by: '搜雲庫教程-專一於開發技術的研究與知識分享',
url: 'http://www.souyunku.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
複製代碼
MongoDB Enterprise gabriel:PRIMARY> db.col.find()
{ "_id" : ObjectId("5a6ef998525d903d07a00cdf"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "搜雲庫教程-專一於開發技術的研究與知識分享", "url" : "http://www.souyunku.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
MongoDB Enterprise gabriel:PRIMARY>
複製代碼
博主切換從節點10002
mongo localhost:10002
複製代碼
切換到從節點,你會發現使用show dbs 會報錯,是由於尚未開啓權限,輸入rs.slaveOk();就能夠順利訪問了。
MongoDB Enterprise gabriel:SECONDARY> show dbs
2018-01-29T10:40:37.362+0000 E QUERY [thread1] Error: listDatabases failed:{
"operationTime" : Timestamp(1517222434, 1),
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1517222434, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:65:1
shellHelper.show@src/mongo/shell/utils.js:813:19
shellHelper@src/mongo/shell/utils.js:703:15
@(shellhelp2):1:1
MongoDB Enterprise gabriel:SECONDARY>
複製代碼
MongoDB Enterprise gabriel:SECONDARY> rs.slaveOk()
複製代碼
再次查看
MongoDB Enterprise gabriel:SECONDARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
MongoDB Enterprise gabriel:SECONDARY>
複製代碼
切到test 庫,查看數據已經同步過來了
MongoDB Enterprise gabriel:SECONDARY> use test
switched to db test
MongoDB Enterprise gabriel:SECONDARY> db.col.find()
{ "_id" : ObjectId("5a6ef998525d903d07a00cdf"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "搜雲庫教程-專一於開發技術的研究與知識分享", "url" : "http://www.souyunku.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
MongoDB Enterprise gabriel:SECONDARY>
複製代碼
以上就是簡單的主從複製創建過程,如今已經能夠在從服務器看到主服務器插入的數據了。
切換從節點10003 同樣的問題
刪除從節點
rs.remove('ip:port')
複製代碼
關閉主服務器後,再從新啓動,會發現原來的從服務器變爲了從服務器,新啓動的服務器(原來的從服務器)變爲了從服務器
首先經過 rs.status()
查看,能夠看到主節點是10001,主節點"name" : "localhost:10001", "stateStr" : "PRIMARY"
接下來中止 10001 主節點,測試故障切換
MongoDB Enterprise gabriel:PRIMARY> rs.status()
{
"set" : "gabriel",
"date" : ISODate("2018-01-30T02:39:58.468Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1517279986, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1517279986, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1517279996, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1517279996, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 1,
"name" : "localhost:10001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 58656,
"optime" : {
"ts" : Timestamp(1517279996, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-01-30T02:39:56Z"),
"electionTime" : Timestamp(1517221422, 1),
"electionDate" : ISODate("2018-01-29T10:23:42Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 2,
"name" : "localhost:10002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 58586,
"optime" : {
"ts" : Timestamp(1517279996, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1517279986, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-01-30T02:39:56Z"),
"optimeDurableDate" : ISODate("2018-01-30T02:39:46Z"),
"lastHeartbeat" : ISODate("2018-01-30T02:39:58.289Z"),
"lastHeartbeatRecv" : ISODate("2018-01-30T02:39:57.220Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "localhost:10001",
"configVersion" : 1
},
{
"_id" : 3,
"name" : "localhost:10003",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2018-01-30T02:39:58.304Z"),
"lastHeartbeatRecv" : ISODate("2018-01-30T02:39:21.208Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "Connection refused",
"configVersion" : -1
}
],
"ok" : 1,
"operationTime" : Timestamp(1517279996, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1517279996, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
MongoDB Enterprise gabriel:PRIMARY>
複製代碼
鏈接到主節點
mongo localhost:10001
複製代碼
關閉主節點
mongo localhost:10001
複製代碼
顯示全部數據庫
MongoDB Enterprise gabriel:PRIMARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
複製代碼
切換到admin
MongoDB Enterprise gabriel:PRIMARY> use admin
switched to db admin
複製代碼
中止數據庫,必須進入 admin 庫
MongoDB Enterprise gabriel:PRIMARY> db.shutdownServer()
複製代碼
響應
2018-01-30T02:51:34.503+0000 I NETWORK [thread1] trying reconnect to localhost:10001 (127.0.0.1) failed
2018-01-30T02:51:35.398+0000 I NETWORK [thread1] Socket recv() Connection reset by peer 127.0.0.1:10001
2018-01-30T02:51:35.398+0000 I NETWORK [thread1] SocketException: remote: (NONE):0 error: SocketException socket exception [RECV_ERROR] server [127.0.0.1:10001]
2018-01-30T02:51:35.399+0000 I NETWORK [thread1] reconnect localhost:10001 (127.0.0.1) failed failed
2018-01-30T02:51:35.404+0000 I NETWORK [thread1] trying reconnect to localhost:10001 (127.0.0.1) failed
2018-01-30T02:51:35.404+0000 W NETWORK [thread1] Failed to connect to 127.0.0.1:10001, in(checking socket for error after poll), reason: Connection refused
2018-01-30T02:51:35.404+0000 I NETWORK [thread1] reconnect localhost:10001 (127.0.0.1) failed failed
MongoDB Enterprise >
複製代碼
查看是否真的中止了,發現已經沒有10001 節點進程了
root@souyunku-2:# ps -ef | grep mongo
root 5554 1 0 Jan29 ? 00:03:34 mongod --dbpath /data/db/node2 --port 10002 --replSet gabriel --nojournal --fork --logpath /data/db/node2.log
root 12284 1 0 02:43 ? 00:00:02 mongod --dbpath /data/db/node3 --port 10003 --replSet gabriel --nojournal --fork --logpath /data/db/node3.log
root 12436 5132 0 02:53 pts/1 00:00:00 grep --color=auto mongo
root@souyunku-2:# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:10002 0.0.0.0:* LISTEN 5554/mongod
tcp 0 0 127.0.0.1:10003 0.0.0.0:* LISTEN 12284/mongod
root@souyunku-2:/data/db#
複製代碼
查看是否故障專業
root@souyunku-2:# mongo localhost:10001
複製代碼
查看主從狀態
MongoDB Enterprise gabriel:SECONDARY> rs.status()
{
"set" : "gabriel",
"date" : ISODate("2018-01-30T02:56:48.074Z"),
"myState" : 2,
"term" : NumberLong(2),
"syncingTo" : "localhost:10003",
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1517280995, 1),
"t" : NumberLong(2)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1517280995, 1),
"t" : NumberLong(2)
},
"appliedOpTime" : {
"ts" : Timestamp(1517281005, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1517280995, 1),
"t" : NumberLong(2)
}
},
"members" : [
{
"_id" : 1,
"name" : "localhost:10001",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2018-01-30T02:56:47.605Z"),
"lastHeartbeatRecv" : ISODate("2018-01-30T02:51:34.519Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "Connection refused",
"configVersion" : -1
},
{
"_id" : 2,
"name" : "localhost:10002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 59660,
"optime" : {
"ts" : Timestamp(1517281005, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-01-30T02:56:45Z"),
"syncingTo" : "localhost:10003",
"configVersion" : 1,
"self" : true
},
{
"_id" : 3,
"name" : "localhost:10003",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 784,
"optime" : {
"ts" : Timestamp(1517281005, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1517281005, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-01-30T02:56:45Z"),
"optimeDurableDate" : ISODate("2018-01-30T02:56:45Z"),
"lastHeartbeat" : ISODate("2018-01-30T02:56:46.486Z"),
"lastHeartbeatRecv" : ISODate("2018-01-30T02:56:47.147Z"),
"pingMs" : NumberLong(0),
"electionTime" : Timestamp(1517280703, 1),
"electionDate" : ISODate("2018-01-30T02:51:43Z"),
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1517281005, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1517281005, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
MongoDB Enterprise gabriel:SECONDARY>
複製代碼
發現 "name" : "localhost:10001","stateStr" : "(not reachable/healthy)", 健康狀態已是「沒法訪問狀態了」
主節點已經切換成 10003 節點了
"_id" : 3,
"name" : "localhost:10003",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
複製代碼
重啓節點10001
mongod --dbpath /data/db/node1 --port 10001 --replSet gabriel --nojournal --fork --logpath /data/db/node1.log
複製代碼
參考:
Runoob 教程:http://www.runoob.com/mongodb/mongodb-tutorial.html
Tutorials 教程:Pointhttps://www.tutorialspoint.com/mongodb/mongodb_advantages.htm
MongoDB 官網地址:https://www.mongodb.com
MongoDB 官方英文文檔:https://docs.mongodb.com/manual
MongoDB 各平臺下載地址:https://www.mongodb.com/download-center#community
MongoDB 安裝 https://docs.mongodb.com/manual/tutorial/install-mongodb-enterprise-on-ubuntu