摘要:實例教程是一個數據庫搜云庫教程專注于開發技術的研究與知識分享方法中你也可以設置使用多個字段創建索引關系型數據庫中稱作復合索引。
上一篇文章練習了,MongoDB 的以下操作
安裝 MongoDB 服務
連接 MongoDB
MongoDB 創建數據庫
MongoDB 刪除數據庫
MongoDB 插入文檔
MongoDB 刪除文檔
MongoDB 查詢文檔
MongoDB AND 條件
MongoDB OR 條件
MongoDB AND 和 OR 聯合使用
MongoDB 條件操作符
MongoDB (>) 大于操作符 - $gt
MongoDB(>=)大于等于操作符 - $gte
MongoDB (<) 小于操作符 - $lt
MongoDB (<=) 小于操作符 - $lte
MongoDB 使用 (<) 和 (>) 查詢 - $lt 和 $gt
手把手教你 MongoDB 的安裝與詳細使用(一)
http://www.ymq.io/2018/01/29/MongoDB-2/
接下來繼續
MongoDB Limit與Skip方法
MongoDB 排序
MongoDB 索引
MongoDB 聚合
MongoDB 主從復制(副本集)
MongoDB 自動故障轉移
1. MongoDB Limit與Skip方法 Limit() 方法MongoDB Limit() 方法
如果你需要在MongoDB中讀取指定數量的數據記錄,可以使用MongoDB的Limit方法,limit()方法接受一個數字參數,該參數指定從MongoDB中讀取的記錄條數。
插入測試數據
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" }Skip() 方法
我們除了可以使用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
2. MongoDB 排序 MongoDB sort()方法在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()方法的排序方式,默認按照文檔的升序排列。
3. MongoDB 索引索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數據時必須掃描集合中的每個文件并選取那些符合查詢條件的記錄。
這種掃描全集合的查詢效率是非常低的,特別在處理大量的數據時,查詢可以要花費幾十秒甚至幾分鐘,這對網站的性能是非常致命的。
索引是特殊的數據結構,索引存儲在一個易于遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構
ensureIndex() 方法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 >4. MongoDB 聚合
MongoDB 聚合
MongoDB中聚合(aggregate)主要用于處理數據(諸如統計平均值,求和等),并返回計算后的數據結果。有點類似sql語句中的 count(*)。
aggregate() 方法刪除之前的測試數據
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:修改輸入文檔的結構??梢杂脕碇孛?、增加或刪除域,也可以用于創建計算結果以及嵌套文檔。
$match:用于過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操作。
$limit:用來限制MongoDB聚合管道返回的文檔數。
$skip:在聚合管道中跳過指定數量的文檔,并返回余下的文檔。
$unwind:將文檔中的某一個數組類型字段拆分成多條,每條包含數組中的一個值。
$group:將集合中的文檔分組,可用于統計結果。
$sort:將輸入文檔排序后輸出。
$geoNear:輸出接近某一地理位置的有序文檔。
管道操作符實例1、$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 } } } ] );
$match用于獲取 likes 大于70小于或等于90記錄,然后將符合條件的記錄送到下一階段$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}} ])
時間關鍵字如下:
$dayOfYear: 返回該日期是這一年的第幾天(全年 366 天)。
$dayOfMonth: 返回該日期是這一個月的第幾天(1到31)。
$dayOfWeek: 返回的是這個周的星期幾(1:星期日,7:星期六)。
$year: 返回該日期的年份部分。
$month: 返回該日期的月份部分( 1 到 12)。
$week: 返回該日期是所在年的第幾個星期( 0 到 53)。
$hour: 返回該日期的小時部分。
$minute: 返回該日期的分鐘部分。
$second: 返回該日期的秒部分(以0到59之間的數字形式返回日期的第二部分,但可以是60來計算閏秒)。
$millisecond:返回該日期的毫秒部分( 0 到 999)。
$dateToString: { $dateToString: { format: , date: } }。
5. MongoDB 主從復制(副本集)MongoDB復制是將數據同步在多個服務器的過程。
復制提供了數據的冗余備份,并在多個服務器上存儲數據副本,提高了數據的可用性, 并可以保證數據的安全性。
復制還允許您從硬件故障和服務中斷中恢復數據。
官方文檔 https://docs.mongodb.com/manual/replication/
5.1 什么是復制?保障數據的安全性
數據高可用性 (24*7)
災難恢復
無需停機維護(如備份,重建索引,壓縮)
分布式讀取數據
5.2 MongoDB復制原理mongodb的復制至少需要兩個節點。其中一個是主節點,負責處理客戶端請求,其余的都是從節點,負責復制主節點上的數據。
mongodb各個節點常見的搭配方式為:一主一從、一主多從。
主節點記錄在其上的所有操作oplog,從節點定期輪詢主節點獲取這些操作,然后對自己的數據副本執行這些操作,從而保證從節點的數據與主節點一致。
MongoDB復制結構圖如下所示:
以上結構圖中,客戶端從主節點讀取數據,在客戶端寫入數據到主節點時, 主節點與從節點進行數據交互保障數據的一致性。
5.3 副本集特征N 個節點的集群
任何節點可作為主節點
所有寫入操作都在主節點上
自動故障轉移
自動恢復
5.4 MongoDB副本集設置1、關閉正在運行的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")
關閉主服務器后,再重新啟動,會發現原來的從服務器變為了從服務器,新啟動的服務器(原來的從服務器)變為了從服務器
6. MongoDB 自動故障轉移首先通過 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...
Tutorials 教程:Pointhttps://www.tutorialspoint.co...
MongoDB 官網地址:https://www.mongodb.com
MongoDB 官方英文文檔:https://docs.mongodb.com/manual
MongoDB 各平臺下載地址:https://www.mongodb.com/downl...
MongoDB 安裝 https://docs.mongodb.com/manu...
作者:鵬磊
出處:http://www.ymq.io/2018/01/29/MongoDB-2
Email:admin@souyunku.com
版權歸作者所有,轉載請注明出處
Wechat:關注公眾號,搜云庫,專注于開發技術的研究與知識分享
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19198.html
摘要:連接數據庫引子博客肯定是以用戶為中心,包括用戶的注冊,用戶的登錄,用戶發表留言,對留言進行評價等等功能,所以,自然離不開數據庫。概念解析在中基本的概念是文檔集合數據庫。這兩種方式連接都需要,或者主機名字,數據庫名字,端口號,配置項等。 連接數據庫 引子 博客肯定是以用戶為中心,包括用戶的注冊,用戶的登錄,用戶發表留言,對留言進行評價等等功能,所以,自然離不開數據庫。 MongoDB M...
摘要:如刪除集合下全部文檔刪除等于搜云庫的全部文檔搜云庫關注公眾號,搜云庫,專注于開發技術的研究與知識分享刪除等于的一個文檔查詢文檔查詢文檔使用方法。 一、什么是MongoDB ? MongoDB 是由C++語言編寫的,是一個基于分布式文件存儲的開源數據庫系統。 在高負載的情況下,添加更多的節點,可以保證服務器性能。 MongoDB 旨在為WEB應用提供可擴展的高性能數據存儲解決方案。 Mo...
摘要:上一篇文章手把手教你如何用構建技術文章聚合平臺一介紹了如何使用搭建的運行環境,并且將與集成,對掘金進行技術文章的抓取,最后可以查看抓取結果。本篇文章將繼續講解如何利用編寫一個精簡的聚合平臺,將抓取好的文章內容展示出來。 上一篇文章《手把手教你如何用Crawlab構建技術文章聚合平臺(一)》介紹了如何使用搭建Crawlab的運行環境,并且將Puppeteer與Crawlab集成,對掘金、...
摘要:聲明構造函數,作用是把從數據庫取出的數據實例化為對象。該構造函數傳入的值為從中取出的數據省略接口提供增刪改查接口實現提供增刪改查接口實現提供了一個類似于的設計的類。 本文快速入門,MongoDB 結合SpringBoot starter-data-mongodb 進行增刪改查 1、什么是MongoDB ? MongoDB 是由C++語言編寫的,是一個基于分布式文件存儲的開源數據庫系統。...
摘要:在下安裝用安裝最簡單,推薦使用此方法安裝安裝完成后,運行會發現報錯,別慌報錯原因是因為你沒有這個文件夾所以執行以下代碼完成后,再執行大功告成接下來安裝官網接下來安裝就好了記住開軟件連接數據庫時,命令行一定要啟動 1.在Mac下安裝MongoDB 用homebrew安裝最簡單,推薦使用此方法安裝 sudo brew install mongodb 安裝完成后,運行mongod會發現報錯,...
閱讀 1926·2021-11-24 09:39
閱讀 3515·2021-09-28 09:36
閱讀 3282·2021-09-06 15:10
閱讀 3433·2019-08-30 15:44
閱讀 1154·2019-08-30 15:43
閱讀 1797·2019-08-30 14:20
閱讀 2712·2019-08-30 12:51
閱讀 2031·2019-08-30 11:04