成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

手把手教你 MongoDB 的安裝與詳細(xì)使用(二)

jayzou / 1154人閱讀

摘要:實(shí)例教程是一個(gè)數(shù)據(jù)庫搜云庫教程專注于開發(fā)技術(shù)的研究與知識分享方法中你也可以設(shè)置使用多個(gè)字段創(chuàng)建索引關(guān)系型數(shù)據(jù)庫中稱作復(fù)合索引。

上一篇文章練習(xí)了,MongoDB 的以下操作

安裝 MongoDB 服務(wù)

連接 MongoDB

MongoDB 創(chuàng)建數(shù)據(jù)庫

MongoDB 刪除數(shù)據(jù)庫

MongoDB 插入文檔

MongoDB 刪除文檔

MongoDB 查詢文檔

MongoDB AND 條件

MongoDB OR 條件

MongoDB AND 和 OR 聯(lián)合使用

MongoDB 條件操作符

MongoDB (>) 大于操作符 - $gt

MongoDB(>=)大于等于操作符 - $gte

MongoDB (<) 小于操作符 - $lt

MongoDB (<=) 小于操作符 - $lte

MongoDB 使用 (<) 和 (>) 查詢 - $lt 和 $gt

手把手教你 MongoDB 的安裝與詳細(xì)使用(一)

http://www.ymq.io/2018/01/29/MongoDB-2/

接下來繼續(xù)

MongoDB Limit與Skip方法

MongoDB 排序

MongoDB 索引

MongoDB 聚合

MongoDB 主從復(fù)制(副本集)

MongoDB 自動故障轉(zhuǎn)移

1. MongoDB Limit與Skip方法 Limit() 方法

MongoDB Limit() 方法

如果你需要在MongoDB中讀取指定數(shù)量的數(shù)據(jù)記錄,可以使用MongoDB的Limit方法,limit()方法接受一個(gè)數(shù)字參數(shù),該參數(shù)指定從MongoDB中讀取的記錄條數(shù)。

插入測試數(shù)據(jù)

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)

以上實(shí)例為顯示查詢文檔中的兩條記錄:

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()方法中的參數(shù)則顯示集合中的所有數(shù)據(jù)。

MongoDB Enterprise > db.col.find({},{"title":1,_id:0}).limit()
{ "title" : "MongoDB-1" }
{ "title" : "MongoDB-2" }
{ "title" : "MongoDB-3" }
{ "title" : "MongoDB-4" }
Skip() 方法

我們除了可以使用limit()方法來讀取指定數(shù)量的數(shù)據(jù)外,還可以使用skip()方法來跳過指定數(shù)量的數(shù)據(jù),skip方法同樣接受一個(gè)數(shù)字參數(shù)作為跳過的記錄條數(shù)。
語法

skip() 方法腳本語法格式如下:

> db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

實(shí)例

以上實(shí)例只會顯示第二條文檔數(shù)據(jù)

MongoDB Enterprise > db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
{ "title" : "MongoDB-2" }
MongoDB Enterprise >

注:skip()方法默認(rèn)參數(shù)為 0

2. MongoDB 排序 MongoDB sort()方法

在MongoDB中使用使用sort()方法對數(shù)據(jù)進(jìn)行排序,sort()方法可以通過參數(shù)指定排序的字段

使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而-1是用于降序排列。

語法

sort()方法基本語法如下所示:

> db.COLLECTION_NAME.find().sort({KEY:1})

col 集合中的數(shù)據(jù)如下:

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是用于降序排列

以下實(shí)例演示了 col 集合中的數(shù)據(jù)按字段 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()方法的排序方式,默認(rèn)按照文檔的升序排列。

3. MongoDB 索引

索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符合查詢條件的記錄。

這種掃描全集合的查詢效率是非常低的,特別在處理大量的數(shù)據(jù)時(shí),查詢可以要花費(fèi)幾十秒甚至幾分鐘,這對網(wǎng)站的性能是非常致命的。

索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲在一個(gè)易于遍歷讀取的數(shù)據(jù)集合中,索引是對數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)

ensureIndex() 方法

MongoDB使用 ensureIndex() 方法來創(chuàng)建索引。

語法

ensureIndex()方法基本語法格式如下所示:

> db.COLLECTION_NAME.ensureIndex({KEY:1})

語法中 Key 值為你要創(chuàng)建的索引字段,1為指定按升序創(chuàng)建索引,如果你想按降序來創(chuàng)建索引指定為-1即可。

實(shí)例

> db.COLLECTION_NAME.ensureIndex({KEY:1})

語法中 Key 值為你要創(chuàng)建的索引字段,1為指定按升序創(chuàng)建索引,如果你想按降序來創(chuàng)建索引指定為-1即可。

實(shí)例

MongoDB Enterprise > db.col.ensureIndex({"title":1})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
MongoDB Enterprise > 
db.col.insert({title: "MongoDB 教程", 
    description: "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫",
    by: "搜云庫教程-專注于開發(fā)技術(shù)的研究與知識分享",
    url: "http://www.souyunku.com",
    tags: ["mongodb", "database", "NoSQL"],
    likes: 100
})

ensureIndex() 方法中你也可以設(shè)置使用多個(gè)字段創(chuàng)建索引(關(guān)系型數(shù)據(jù)庫中稱作復(fù)合索引)。

MongoDB Enterprise > db.col.ensureIndex({"title":1,"description":1})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 3,
    "numIndexesAfter" : 4,
    "ok" : 1
}

ensureIndex() 接收可選參數(shù),可選參數(shù)列表如下:

實(shí)例

在后臺創(chuàng)建索引:

建索引過程會阻塞其它數(shù)據(jù)庫操作,background可指定以后臺方式創(chuàng)建索引,即增加 "background" 可選參數(shù)。 "background" 默認(rèn)值為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)主要用于處理數(shù)據(jù)(諸如統(tǒng)計(jì)平均值,求和等),并返回計(jì)算后的數(shù)據(jù)結(jié)果。有點(diǎn)類似sql語句中的 count(*)。

aggregate() 方法

刪除之前的測試數(shù)據(jù)

MongoDB Enterprise > db.col.remove({})
WriteResult({ "nRemoved" : 5 })
MongoDB Enterprise >

插入新的測試數(shù)據(jù)

db.col.insert({
    title: "MongoDB 教程",
    description: "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫",
    by_user: "penglei",
    url: "http://www.souyunku.com",
    tags: ["mongodb", "database", "NoSQL"],
    likes: 100
})
db.col.insert({
    title: "MongoDB 教程",
    description: "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫",
    by_user: "penglei",
    url: "http://www.souyunku.com",
    tags: ["mongodb", "database", "NoSQL"],
    likes: 200
})
db.col.insert({
    title: "MongoDB 教程",
    description: "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫",
    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 是一個(gè) Nosql 數(shù)據(jù)庫", "by_user" : "penglei", "url" : "http://www.souyunku.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5a6ebfab5326a260464a4073"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by_user" : "penglei", "url" : "http://www.souyunku.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 200 }
{ "_id" : ObjectId("5a6ebfab5326a260464a4074"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "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 > 

以上實(shí)例類似sql語句:select by_user, count(*) from col group by by_user

在上面的例子中,我們通過字段by_user字段對數(shù)據(jù)進(jìn)行分組,并計(jì)算by_user字段相同值的總和。

下表展示了一些聚合的表達(dá)式:

管道的概念

管道在Unix和Linux中一般用于將當(dāng)前命令的輸出結(jié)果作為下一個(gè)命令的參數(shù)。

MongoDB的聚合管道將MongoDB文檔在一個(gè)管道處理完畢后將結(jié)果傳遞給下一個(gè)管道處理。管道操作是可以重復(fù)的。

表達(dá)式:處理輸入文檔并輸出。表達(dá)式是無狀態(tài)的,只能用于計(jì)算當(dāng)前聚合管道的文檔,不能處理其它的文檔。

這里我們介紹一下聚合框架中常用的幾個(gè)操作:

$project:修改輸入文檔的結(jié)構(gòu)??梢杂脕碇孛⒃黾踊騽h除域,也可以用于創(chuàng)建計(jì)算結(jié)果以及嵌套文檔。

$match:用于過濾數(shù)據(jù),只輸出符合條件的文檔。$match使用MongoDB的標(biāo)準(zhǔn)查詢操作。

$limit:用來限制MongoDB聚合管道返回的文檔數(shù)。

$skip:在聚合管道中跳過指定數(shù)量的文檔,并返回余下的文檔。

$unwind:將文檔中的某一個(gè)數(shù)組類型字段拆分成多條,每條包含數(shù)組中的一個(gè)值。

$group:將集合中的文檔分組,可用于統(tǒng)計(jì)結(jié)果。

$sort:將輸入文檔排序后輸出。

$geoNear:輸出接近某一地理位置的有序文檔。

管道操作符實(shí)例

1、$project實(shí)例

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 > 

這樣的話結(jié)果中就只還有_id,tilte和by_user三個(gè)字段了,默認(rèn)情況下_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實(shí)例

db.col.aggregate( [
                { $match : { likes : { $gt : 90, $lte : 200 } } },
                { $group: { _id: null, count: { $sum: 1 } } }
               ] );

$match用于獲取 likes 大于70小于或等于90記錄,然后將符合條件的記錄送到下一階段$group管道操作符進(jìn)行處理。

MongoDB Enterprise > db.col.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{ "_id" : "penglei", "num_tutorial" : 3 }
MongoDB Enterprise >

以上實(shí)例類似sql語句:

select by_user as _id, count(*) as num_tutorial from mycol group by by_user

按日、按月、按年、按周、按小時(shí)、按分鐘聚合操作如下:

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}}
])

時(shí)間關(guān)鍵字如下:

$dayOfYear: 返回該日期是這一年的第幾天(全年 366 天)。

$dayOfMonth: 返回該日期是這一個(gè)月的第幾天(1到31)。

$dayOfWeek: 返回的是這個(gè)周的星期幾(1:星期日,7:星期六)。

$year: 返回該日期的年份部分。

$month: 返回該日期的月份部分( 1 到 12)。

$week: 返回該日期是所在年的第幾個(gè)星期( 0 到 53)。

$hour: 返回該日期的小時(shí)部分。

$minute: 返回該日期的分鐘部分。

$second: 返回該日期的秒部分(以0到59之間的數(shù)字形式返回日期的第二部分,但可以是60來計(jì)算閏秒)。

$millisecond:返回該日期的毫秒部分( 0 到 999)。

$dateToString: { $dateToString: { format: , date: } }。

5. MongoDB 主從復(fù)制(副本集)

MongoDB復(fù)制是將數(shù)據(jù)同步在多個(gè)服務(wù)器的過程。

復(fù)制提供了數(shù)據(jù)的冗余備份,并在多個(gè)服務(wù)器上存儲數(shù)據(jù)副本,提高了數(shù)據(jù)的可用性, 并可以保證數(shù)據(jù)的安全性。

復(fù)制還允許您從硬件故障和服務(wù)中斷中恢復(fù)數(shù)據(jù)。

官方文檔 https://docs.mongodb.com/manual/replication/

5.1 什么是復(fù)制?

保障數(shù)據(jù)的安全性

數(shù)據(jù)高可用性 (24*7)

災(zāi)難恢復(fù)

無需停機(jī)維護(hù)(如備份,重建索引,壓縮)

分布式讀取數(shù)據(jù)

5.2 MongoDB復(fù)制原理

mongodb的復(fù)制至少需要兩個(gè)節(jié)點(diǎn)。其中一個(gè)是主節(jié)點(diǎn),負(fù)責(zé)處理客戶端請求,其余的都是從節(jié)點(diǎn),負(fù)責(zé)復(fù)制主節(jié)點(diǎn)上的數(shù)據(jù)。

mongodb各個(gè)節(jié)點(diǎn)常見的搭配方式為:一主一從、一主多從。

主節(jié)點(diǎn)記錄在其上的所有操作oplog,從節(jié)點(diǎn)定期輪詢主節(jié)點(diǎn)獲取這些操作,然后對自己的數(shù)據(jù)副本執(zhí)行這些操作,從而保證從節(jié)點(diǎn)的數(shù)據(jù)與主節(jié)點(diǎn)一致。

MongoDB復(fù)制結(jié)構(gòu)圖如下所示:

以上結(jié)構(gòu)圖中,客戶端從主節(jié)點(diǎn)讀取數(shù)據(jù),在客戶端寫入數(shù)據(jù)到主節(jié)點(diǎn)時(shí), 主節(jié)點(diǎn)與從節(jié)點(diǎn)進(jìn)行數(shù)據(jù)交互保障數(shù)據(jù)的一致性。

5.3 副本集特征

N 個(gè)節(jié)點(diǎn)的集群

任何節(jié)點(diǎn)可作為主節(jié)點(diǎn)

所有寫入操作都在主節(jié)點(diǎn)上

自動故障轉(zhuǎn)移

自動恢復(fù)

5.4 MongoDB副本集設(shè)置

1、關(guān)閉正在運(yùn)行的MongoDB服務(wù)器。

service mongod stop

2.節(jié)點(diǎn)建點(diǎn)

首先需要去你選擇的mongodb數(shù)據(jù)文件存放的文件夾新建三個(gè)數(shù)據(jù)庫,用來模擬三臺不通的機(jī)器,博主的路徑如下

mkdir -p /data/db/node1
mkdir -p /data/db/node2
mkdir -p /data/db/node3

3.啟動三個(gè)數(shù)據(jù)庫(dbpath),并且端口(--port 1000x),集群名稱(--replSet gabriel),關(guān)閉日志選項(xiàng)(--nojournal),守護(hù)進(jìn)程方式啟動,會自動拉起(--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.順便連接一個(gè)服務(wù)器,做初始化操作,這里博主連入10001端口

終端下進(jìn)入

mongo localhost:10001

進(jìn)入后輸入初始化方法

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>

此時(shí)會發(fā)現(xiàn)終端上的輸出已經(jīng)有了變化。

//從單個(gè)一個(gè)
>
//變成了
gabriel:OTHER>

5.查詢狀態(tài)

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)
        }
    }
}

在返回中,參數(shù)set后面為集群名稱,每個(gè)members下面可以看到他們各自的情況,其中stateStr是角色,主節(jié)點(diǎn)為(PRIMARY)。

6.進(jìn)入主節(jié)點(diǎn)插入數(shù)據(jù),進(jìn)入從節(jié)點(diǎn)查看數(shù)據(jù)

博主主節(jié)點(diǎn)在10001接口

mongo localhost:10001

插入數(shù)據(jù)

MongoDB Enterprise gabriel:PRIMARY> use test
switched to db test
db.col.insert({title: "MongoDB 教程", 
    description: "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫",
    by: "搜云庫教程-專注于開發(fā)技術(shù)的研究與知識分享",
    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 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "搜云庫教程-專注于開發(fā)技術(shù)的研究與知識分享", "url" : "http://www.souyunku.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
MongoDB Enterprise gabriel:PRIMARY> 

博主切換從節(jié)點(diǎn)10002

mongo localhost:10002

切換到從節(jié)點(diǎn),你會發(fā)現(xiàn)使用show dbs 會報(bào)錯(cuò),是因?yàn)檫€沒有開啟權(quán)限,輸入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 庫,查看數(shù)據(jù)已經(jīng)同步過來了

MongoDB Enterprise gabriel:SECONDARY> use test
switched to db test
MongoDB Enterprise gabriel:SECONDARY> db.col.find()
{ "_id" : ObjectId("5a6ef998525d903d07a00cdf"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "搜云庫教程-專注于開發(fā)技術(shù)的研究與知識分享", "url" : "http://www.souyunku.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
MongoDB Enterprise gabriel:SECONDARY> 

以上就是簡單的主從復(fù)制建立過程,現(xiàn)在已經(jīng)可以在從服務(wù)器看到主服務(wù)器插入的數(shù)據(jù)了。

切換從節(jié)點(diǎn)10003 一樣的問題

刪除從節(jié)點(diǎn)

rs.remove("ip:port")

關(guān)閉主服務(wù)器后,再重新啟動,會發(fā)現(xiàn)原來的從服務(wù)器變?yōu)榱藦姆?wù)器,新啟動的服務(wù)器(原來的從服務(wù)器)變?yōu)榱藦姆?wù)器

6. MongoDB 自動故障轉(zhuǎn)移

首先通過 rs.status() 查看,可以看到主節(jié)點(diǎn)是10001,主節(jié)點(diǎn)"name" : "localhost:10001", "stateStr" : "PRIMARY" 接下來停止 10001 主節(jié)點(diǎn),測試故障切換

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>

連接到主節(jié)點(diǎn)

mongo localhost:10001

關(guān)閉主節(jié)點(diǎn)

mongo localhost:10001

顯示所有數(shù)據(jù)庫

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

停止數(shù)據(jù)庫,必須進(jìn)入 admin 庫

MongoDB Enterprise gabriel:PRIMARY> db.shutdownServer()

響應(yīng)

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 >

查看是否真的停止了,發(fā)現(xiàn)已經(jīng)沒有10001 節(jié)點(diǎn)進(jìn)程了

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#

查看是否故障專業(yè)

root@souyunku-2:# mongo localhost:10001

查看主從狀態(tài)

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> 

發(fā)現(xiàn) "name" : "localhost:10001","stateStr" : "(not reachable/healthy)", 健康狀態(tài)已經(jīng)是“無法訪問狀態(tài)了”

主節(jié)點(diǎn)已經(jīng)切換成 10003 節(jié)點(diǎn)了

"_id" : 3,
"name" : "localhost:10003",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",

重啟節(jié)點(diǎn)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 官網(wǎng)地址:https://www.mongodb.com
MongoDB 官方英文文檔:https://docs.mongodb.com/manual
MongoDB 各平臺下載地址:https://www.mongodb.com/downl...
MongoDB 安裝 https://docs.mongodb.com/manu...

Contact

作者:鵬磊

出處:http://www.ymq.io/2018/01/29/MongoDB-2

Email:[email protected]

版權(quán)歸作者所有,轉(zhuǎn)載請注明出處

Wechat:關(guān)注公眾號,搜云庫,專注于開發(fā)技術(shù)的研究與知識分享

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/19198.html

相關(guān)文章

  • 把手教你開發(fā)nodejs微博網(wǎng)站-連接數(shù)據(jù)庫

    摘要:連接數(shù)據(jù)庫引子博客肯定是以用戶為中心,包括用戶的注冊,用戶的登錄,用戶發(fā)表留言,對留言進(jìn)行評價(jià)等等功能,所以,自然離不開數(shù)據(jù)庫。概念解析在中基本的概念是文檔集合數(shù)據(jù)庫。這兩種方式連接都需要,或者主機(jī)名字,數(shù)據(jù)庫名字,端口號,配置項(xiàng)等。 連接數(shù)據(jù)庫 引子 博客肯定是以用戶為中心,包括用戶的注冊,用戶的登錄,用戶發(fā)表留言,對留言進(jìn)行評價(jià)等等功能,所以,自然離不開數(shù)據(jù)庫。 MongoDB M...

    waterc 評論0 收藏0
  • 把手教你 MongoDB 安裝詳細(xì)使用(一)

    摘要:如刪除集合下全部文檔刪除等于搜云庫的全部文檔搜云庫關(guān)注公眾號,搜云庫,專注于開發(fā)技術(shù)的研究與知識分享刪除等于的一個(gè)文檔查詢文檔查詢文檔使用方法。 一、什么是MongoDB ? MongoDB 是由C++語言編寫的,是一個(gè)基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng)。 在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。 MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案。 Mo...

    KnewOne 評論0 收藏0
  • 把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺()

    摘要:上一篇文章手把手教你如何用構(gòu)建技術(shù)文章聚合平臺一介紹了如何使用搭建的運(yùn)行環(huán)境,并且將與集成,對掘金進(jìn)行技術(shù)文章的抓取,最后可以查看抓取結(jié)果。本篇文章將繼續(xù)講解如何利用編寫一個(gè)精簡的聚合平臺,將抓取好的文章內(nèi)容展示出來。 上一篇文章《手把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺(一)》介紹了如何使用搭建Crawlab的運(yùn)行環(huán)境,并且將Puppeteer與Crawlab集成,對掘金、...

    zhunjiee 評論0 收藏0
  • Spring Boot 中使用 MongoDB 增刪改查

    摘要:聲明構(gòu)造函數(shù),作用是把從數(shù)據(jù)庫取出的數(shù)據(jù)實(shí)例化為對象。該構(gòu)造函數(shù)傳入的值為從中取出的數(shù)據(jù)省略接口提供增刪改查接口實(shí)現(xiàn)提供增刪改查接口實(shí)現(xiàn)提供了一個(gè)類似于的設(shè)計(jì)的類。 本文快速入門,MongoDB 結(jié)合SpringBoot starter-data-mongodb 進(jìn)行增刪改查 1、什么是MongoDB ? MongoDB 是由C++語言編寫的,是一個(gè)基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng)。...

    ranwu 評論0 收藏0
  • Mac環(huán)境下把手教你如何使用mongoDB+Robo 3T

    摘要:在下安裝用安裝最簡單,推薦使用此方法安裝安裝完成后,運(yùn)行會發(fā)現(xiàn)報(bào)錯(cuò),別慌報(bào)錯(cuò)原因是因?yàn)槟銢]有這個(gè)文件夾所以執(zhí)行以下代碼完成后,再執(zhí)行大功告成接下來安裝官網(wǎng)接下來安裝就好了記住開軟件連接數(shù)據(jù)庫時(shí),命令行一定要啟動 1.在Mac下安裝MongoDB 用homebrew安裝最簡單,推薦使用此方法安裝 sudo brew install mongodb 安裝完成后,運(yùn)行mongod會發(fā)現(xiàn)報(bào)錯(cuò),...

    cpupro 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<