【MongoDB】— MongoDB的OPlog企業(yè)應(yīng)用和高級(jí)應(yīng)用——應(yīng)用篇

1 oplog詳解

1.1 oplog介紹

Oplog是local庫(kù)下的一個(gè)固定集合,Secondary就是通過(guò)查看Primary 的oplog這個(gè)集合來(lái)進(jìn)行復(fù)制的。每個(gè)節(jié)點(diǎn)都有oplog,記錄這從主節(jié)點(diǎn)復(fù)制過(guò)來(lái)的信息,這樣每個(gè)成員都可以作為同步源給其他節(jié)點(diǎn)。
Oplog 的存在極大地方便了 MongoDB 副本集的各節(jié)點(diǎn)的數(shù)據(jù)同步,MongoDB 的主節(jié)點(diǎn)接收請(qǐng)求操作,然后在 Oplog 中記錄操作,次節(jié)點(diǎn)異步地復(fù)制并應(yīng)用這些操作。
Oplog 可以說(shuō)是Mongodb Replication的紐帶。用于存儲(chǔ) MongoDB 數(shù)據(jù)庫(kù)所有數(shù)據(jù)的操作記錄的(實(shí)際只記錄增刪改和一些系統(tǒng)命令操作,查是不會(huì)記錄的),有點(diǎn)類似于 mysql 的 binlog 日志。

1.2 Oplog 的默認(rèn)儲(chǔ)存大小

對(duì)于 unix 系統(tǒng)和 windows 系統(tǒng)

Storage Engine Default Oplog Size Lower Bound Upper Bound
In-Memory Storage Engine 5% of physical memory 50 MB 50 GB
WiredTiger Storage Engine 5% of free disk space 990 MB 50 GB
MMAPv1 Storage Engine 5% of free disk space 990 MB 50 GB

Oplog 存儲(chǔ)在 local 庫(kù)的 oplog.rs 集合里面。對(duì)于一般的線上環(huán)境來(lái)說(shuō),默認(rèn)的 Oplog 值就已經(jīng)足夠了。當(dāng)達(dá)到儲(chǔ)存大小的日志時(shí),新的記錄會(huì)將老的記錄覆蓋。

但是我們系統(tǒng)中如果存在以下操作的話,那么我們就可能需要設(shè)置更大的 Oplog 值來(lái)避免數(shù)據(jù)的丟失(在副本集中數(shù)據(jù)同步過(guò)程):

  • 一次更新多個(gè)文件
  • 刪除與插入同樣數(shù)量的數(shù)據(jù)
  • 大量地更新現(xiàn)有的數(shù)據(jù)

從MongoDB 4.0開(kāi)始, Oplog 可以超過(guò)其配置的大小限制,以避免刪除,
一旦mongod第一次創(chuàng)建了 Oplog ,通過(guò)更改--oplogSize選項(xiàng)將不會(huì)影響 Oplog 的大小。replSetResizeOplog使您可以動(dòng)態(tài)調(diào)整 Oplog 的大小,而無(wú)需重新啟動(dòng)該mongod過(guò)程。

oplog 中每個(gè)操作都是 冪等性 的,也就是說(shuō),無(wú)論是對(duì)目標(biāo)數(shù)據(jù)庫(kù)應(yīng)用一次還是多次,oplog操作都會(huì)產(chǎn)生相同的結(jié)果。這樣就保證了數(shù)據(jù)的一致性。

1.3 副本集數(shù)據(jù)同步的過(guò)程

副本集中數(shù)據(jù)同步的詳細(xì)過(guò)程:

Primary節(jié)點(diǎn)寫(xiě)入數(shù)據(jù),Secondary通過(guò)讀取Primary的oplog得到復(fù)制信息,開(kāi)始復(fù)制數(shù)據(jù)并且將復(fù)制信息寫(xiě)入到自己的oplog。如果某個(gè)操作失?。ㄖ挥挟?dāng)同步源的數(shù)據(jù)損壞或者數(shù)據(jù)與主節(jié)點(diǎn)不一致時(shí)才可能發(fā)生),則備份節(jié)點(diǎn)停止從當(dāng)前數(shù)據(jù)源復(fù)制數(shù)據(jù)。如果某個(gè)備份節(jié)點(diǎn)由于某些原因掛掉了,當(dāng)重新啟動(dòng)后,就會(huì)自動(dòng)從oplog的最后一個(gè)操作開(kāi)始同步,同步完成后,將信息寫(xiě)入自己的oplog,由于復(fù)制操作是先復(fù)制數(shù)據(jù),復(fù)制完成后再寫(xiě)入oplog,有可能相同的操作會(huì)同步兩份,不過(guò)MongoDB在設(shè)計(jì)之初就考慮到這個(gè)問(wèn)題,將oplog的同一個(gè)操作執(zhí)行多次,與執(zhí)行一次的效果是一樣的。

作用:

1、當(dāng)Primary進(jìn)行寫(xiě)操作的時(shí)候,會(huì)將這些寫(xiě)操作記錄寫(xiě)入Primary的Oplog 中,而后Secondary會(huì)將Oplog 復(fù)制到本機(jī)并應(yīng)用這些操作,從而實(shí)現(xiàn)Replication的功能。
2、同時(shí)由于其記錄了Primary上的寫(xiě)操作,故還能將其用作數(shù)據(jù)恢復(fù)??梢院?jiǎn)單的將其視作Mysql中的binlog。

1.4 oplog的常用命令

注意事項(xiàng):
1、在replica set中oplog是一個(gè)定容集合(capped collection),它的默認(rèn)大小是磁盤(pán)空間的5%(可以通過(guò)--oplogSizeMB參數(shù)修改)。
2、oplog位于local庫(kù)的db.oplog.rs。其中記錄的是整個(gè)mongod數(shù)據(jù)實(shí)例一段時(shí)間內(nèi)數(shù)據(jù)庫(kù)的所有變更(插入/更新/刪除)操作。
3、當(dāng)oplog的空間用完時(shí)新記錄自動(dòng)覆蓋最老的記錄。其覆蓋范圍被稱作oplog時(shí)間窗口。需要注意的是,因?yàn)閛plog是一個(gè)定容集合,
所以時(shí)間窗口能覆蓋的范圍會(huì)因?yàn)槟銌挝粫r(shí)間內(nèi)的更新次數(shù)不同而變化。

常用命令:
登錄副本集主節(jié)點(diǎn)
[mongod@mysql-master mult-mongodb]$ mongo 172.21.209.123:38019/admin

1、查看 Oplog 的狀態(tài):可以查看到評(píng)估的oplog的所用時(shí)間。
my_ReplSet1:PRIMARY> rs.printReplicationInfo()
configured oplog size:   2048MB
log length start to end: 92054secs (25.57hrs)
oplog first event time:  Sat Sep 25 2021 08:45:10 GMT-0400 (EDT)
oplog last event time:   Sun Sep 26 2021 10:19:24 GMT-0400 (EDT)
now:                     Sun Sep 26 2021 10:19:28 GMT-0400 (EDT)
my_ReplSet1:PRIMARY> 

2、查看當(dāng)前的 Oplog 存儲(chǔ)設(shè)置的大小
my_ReplSet1:PRIMARY> use local
switched to db local
my_ReplSet1:PRIMARY> db.oplog.rs.stats().maxSize
NumberLong("2147483648")

3、查看 Oplog 最大大小和現(xiàn)在占用的大小,以及記錄時(shí)長(zhǎng)和時(shí)間
my_ReplSet1:PRIMARY> db.getReplicationInfo()
{
    "logSizeMB" : 2048,
    "usedMB" : 22.49,
    "timeDiff" : 92184,
    "timeDiffHours" : 25.61,
    "tFirst" : "Sat Sep 25 2021 08:45:10 GMT-0400 (EDT)",
    "tLast" : "Sun Sep 26 2021 10:21:34 GMT-0400 (EDT)",
    "now" : "Sun Sep 26 2021 10:21:39 GMT-0400 (EDT)"
}

4、更改副本集成員的 Oplog 大小,更改的值要大于等于990MB,這里設(shè)置為1500MB。
my_ReplSet1:PRIMARY> db.adminCommand({replSetResizeOplog: 1, size: 15000})
{
    "ok" : 1,
    "$gleStats" : {
        "lastOpTime" : Timestamp(0, 0),
        "electionId" : ObjectId("7fffffff0000000000000001")
    },
    "lastCommittedOpTime" : Timestamp(1632666134, 1),
    "$configServerState" : {
        "opTime" : {
            "ts" : Timestamp(1632666137, 1),
            "t" : NumberLong(1)
        }
    },
    "$clusterTime" : {
        "clusterTime" : Timestamp(1632666137, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    },
    "operationTime" : Timestamp(1632666134, 1)
}
my_ReplSet1:PRIMARY> 

注意:
# 如果我們通過(guò)上面命令更改了 Oplog 的大小,系統(tǒng)是不會(huì)自動(dòng)回收原始分配給 Oplog 的磁盤(pán)空間,我們需要使用 compact 來(lái)回收,在操作 compact 命令時(shí),副本集成員是無(wú)法進(jìn)行同步數(shù)據(jù)的。建議在進(jìn)行回收的時(shí)候,不要對(duì)數(shù)據(jù)庫(kù)進(jìn)行寫(xiě)入,我們可以通過(guò) rs.stepDown() 來(lái)關(guān)閉所有打開(kāi)的連接。
use local
db.runCommand({ "compact" : "oplog.rs" })
# 執(zhí)行報(bào)錯(cuò)的話 :"will not run compact on an active replica set primary as this is a slow blocking operation. use force:true to force"
db.runCommand({ "compact" : "oplog.rs" ,"force":true})

1.5 oplog的日志數(shù)據(jù)結(jié)構(gòu)即日志解析

oplog數(shù)據(jù)結(jié)構(gòu),oplog中字段的含義,通過(guò)下面的命令取出一條oplog:
my_ReplSet1:PRIMARY> db.oplog.rs.find().skip(1).limit(1).toArray()
[
    {
        "ts" : Timestamp(1632573921, 2),
        "t" : NumberLong(1),
        "h" : NumberLong(0),
        "v" : 2,
        "op" : "c",
        "ns" : "config.$cmd",
        "ui" : UUID("c781f024-4527-46fd-a448-8cbd8e46737b"),
        "wall" : ISODate("2021-09-25T12:45:21.774Z"),
        "o" : {
            "create" : "transactions",
            "idIndex" : {
                "v" : 2,
                "key" : {
                    "_id" : 1
                },
                "name" : "_id_",
                "ns" : "config.transactions"
            }
        }
    }
]
字段含義解析:
ts: 8字節(jié)的時(shí)間戳,由4字節(jié)unix timestamp + 4字節(jié)自增計(jì)數(shù)表示。這個(gè)值很重要,在選舉(如master宕機(jī)時(shí))新primary時(shí),會(huì)選擇ts最大的那個(gè)secondary作為新primary
op:1字節(jié)的操作類型
        "i": insert
        "u": update
        "d": delete
        "c": db cmd
        "db":聲明當(dāng)前數(shù)據(jù)庫(kù) (其中ns 被設(shè)置成為=>數(shù)據(jù)庫(kù)名稱+ '.')
        "n": no op,即空操作,其會(huì)定期執(zhí)行以確保時(shí)效性
ns:操作所在的namespace
o:操作所對(duì)應(yīng)的document,即當(dāng)前操作的內(nèi)容(比如更新操作時(shí)要更新的的字段和值)
o2: 在執(zhí)行更新操作時(shí)的where條件,僅限于update時(shí)才有該屬性。

2、oplog企業(yè)級(jí)應(yīng)用

oplog企業(yè)集應(yīng)用主要用于數(shù)據(jù)的備份和恢復(fù)。通過(guò)全量備份+增量備份+OPlog數(shù)據(jù)完成數(shù)據(jù)庫(kù)的有效恢復(fù),不會(huì)丟失數(shù)據(jù)。因此備份數(shù)據(jù)時(shí),也必須對(duì)oplog進(jìn)行備份,實(shí)現(xiàn)熱備。備份時(shí)使用--oplog選項(xiàng)即可。

應(yīng)用方法:
1、準(zhǔn)備測(cè)試數(shù)據(jù)
my_ReplSet1:PRIMARY> 
my_ReplSet1:PRIMARY> show dbs
admin       0.000GB
config      0.001GB
local       0.003GB
ronnystack  0.002GB
my_ReplSet1:PRIMARY> use student
switched to db student
my_ReplSet1:PRIMARY> for(var i = 1 ;i < 100; i++) { db.grades.insert({id:i,coures:"Python",grade:100});}
WriteResult({ "nInserted" : 1 })
my_ReplSet1:PRIMARY> show tables
grades
my_ReplSet1:PRIMARY> 

2、查看記錄的日志
my_ReplSet1:PRIMARY> use local
switched to db local

my_ReplSet1:PRIMARY> db.oplog.rs.find().skip(1).limit(1).toArray()
[
    {
        "ts" : Timestamp(1632573921, 2),
        "t" : NumberLong(1),
        "h" : NumberLong(0),
        "v" : 2,
        "op" : "c",
        "ns" : "config.$cmd",
        "ui" : UUID("c781f024-4527-46fd-a448-8cbd8e46737b"),
        "wall" : ISODate("2021-09-25T12:45:21.774Z"),
        "o" : {
            "create" : "transactions",
            "idIndex" : {
                "v" : 2,
                "key" : {
                    "_id" : 1
                },
                "name" : "_id_",
                "ns" : "config.transactions"
            }
        }
    }
]
my_ReplSet1:PRIMARY> 

3、oplog 配合mongodump實(shí)現(xiàn)熱備
[mongod@mysql-master bak-mongodb]$ mongodump --port 38019 --oplog -o /data/mongodb/bak-mongodb

4、查看已備份的文件和數(shù)據(jù)庫(kù)
[mongod@mysql-master bak-mongodb]$ ll
total 8
drwxrwxr-x 2 mongod mongod   69 Sep 26 10:47 admin
drwxrwxr-x 2 mongod mongod 4096 Sep 26 10:47 config
-rw-rw-r-- 1 mongod mongod  110 Sep 26 10:47 oplog.bson #備份的oplog二進(jìn)制文件
drwxrwxr-x 2 mongod mongod   55 Sep 26 10:47 ronnystack
drwxrwxr-x 2 mongod mongod   53 Sep 26 10:47 student
作用介紹:--oplog 會(huì)記錄備份過(guò)程中的數(shù)據(jù)變化。會(huì)以oplog.bson保存下來(lái)

5、故障恢復(fù)。
[mongod@mysql-master bak-mongodb]$ mongorestore  --port 38019 --oplogReplay /data/mongodb/bak-mongodb
注:--oplogReplay用戶恢復(fù)oplog日志,通過(guò)全備+增倍+Oplog日志實(shí)現(xiàn)企業(yè)級(jí)數(shù)恢復(fù)。

3、oplog高級(jí)應(yīng)用

oplog高級(jí)應(yīng)用是通過(guò)全備+增倍+Oplog日志實(shí)現(xiàn)企業(yè)級(jí)數(shù)恢復(fù)。

生產(chǎn)企業(yè)案例:

場(chǎng)景:某企業(yè)數(shù)據(jù)庫(kù)每天0點(diǎn)對(duì)數(shù)據(jù)庫(kù)做全量,oplog恢復(fù)窗口為48小時(shí)
某天上午10點(diǎn)student.users表的數(shù)據(jù)被開(kāi)發(fā)人員誤刪除。

恢復(fù)思路:
    1、停應(yīng)用,掛維護(hù)頁(yè)面
    2、找測(cè)試庫(kù),并搭建測(cè)試環(huán)境
    3、恢復(fù)昨天晚上0點(diǎn)的全備數(shù)據(jù)
    4、截取全備之后到student.users誤刪除時(shí)間點(diǎn)的oplog,并恢復(fù)到測(cè)試庫(kù)
    5、將誤刪除表導(dǎo)出,恢復(fù)到生產(chǎn)庫(kù)

故障恢復(fù)步驟
1、登錄到數(shù)據(jù)庫(kù)并創(chuàng)建備份目錄
[mongod@mysql-master mongodb]$ mongo --port 38019  admin
[mongod@mysql-master bak-mongodb]$ [mongod@mysql-master bak-mongodb]$ mkdir -vp /data/mongodb/bak-mongodb

2、準(zhǔn)備數(shù)據(jù)student庫(kù)和grades文檔。
[mongod@mysql-master bak-mongodb]$ for(var i = 1 ;i < 100; i++) { db.grades.insert({id:i,coures:"Python",grade:100});}

3、模擬全庫(kù)做備份
[mongod@mysql-master bak-mongodb]$ rm -rf /data/mongodb/bak-mongodb/
[mongod@mysql-master bak-mongodb]$ mongodump --port 38019 --oplog -o /data/mongodb/bak-mongodb  #備份全庫(kù)

備份的文件目錄
[mongod@mysql-master bak-mongodb]$ ll
total 8
drwxrwxr-x 2 mongod mongod   69 Sep 26 19:52 admin
drwxrwxr-x 2 mongod mongod 4096 Sep 26 19:52 config
-rw-rw-r-- 1 mongod mongod  110 Sep 26 19:52 oplog.bson
drwxrwxr-x 2 mongod mongod   55 Sep 26 19:52 ronnystack
drwxrwxr-x 2 mongod mongod   53 Sep 26 19:52 student
注:--oplog功能:在備份同時(shí),將備份過(guò)程中產(chǎn)生的日志進(jìn)行備份
文件必須存放在/data/mongodb/bak-mongodb下,自動(dòng)命名為oplog.bson

4、模擬數(shù)據(jù)的增長(zhǎng)
my_ReplSet1:PRIMARY> for(i=1;i<=1000;i++){ db.users.insert({"id":i,"name":"Ronny","addr":"sichuan","date":new Date()}); }
WriteResult({ "nInserted" : 1 })
my_ReplSet1:PRIMARY> for(i=1;i<=100;i++){ db.courses.insert({"id":i,"name":"Python","keshi":240,"date":new Date()}); }
WriteResult({ "nInserted" : 1 })

5、模擬誤刪除數(shù)據(jù)庫(kù)
場(chǎng)景:上午10點(diǎn),某開(kāi)發(fā)人員誤刪除student庫(kù)下的user表
元數(shù)據(jù):
my_ReplSet1:PRIMARY> show dbs
admin       0.000GB
config      0.000GB
local       0.003GB
ronnystack  0.002GB
student     0.000GB
my_ReplSet1:PRIMARY> use student
switched to db student
my_ReplSet1:PRIMARY> show tables
courses
grades
users
my_ReplSet1:PRIMARY> 

誤刪除模擬:
my_ReplSet1:PRIMARY> db.users.drop()
true
my_ReplSet1:PRIMARY> 
my_ReplSet1:PRIMARY> show tables
courses
grades
my_ReplSet1:PRIMARY> 

6、模擬。發(fā)現(xiàn)故障立即啟動(dòng)故障恢復(fù)方案。立即停庫(kù),停業(yè)務(wù)。

備份現(xiàn)有的數(shù)據(jù)和local庫(kù)下的oplog.rs文檔
[mongod@mysql-master student]$ mongodump --port 38019 -d local -c oplog.rs  -o /data/mongodb/bak-mongodb
2021-09-26T20:04:34.740-0400    writing local.oplog.rs to /data/mongodb/bak-mongodb/local/oplog.rs.bson
2021-09-26T20:04:34.958-0400    done dumping local.oplog.rs (127999 documents)

7、截圖oplog的數(shù)據(jù),并恢復(fù)到刪除之前的位置。
7.1  登陸到原數(shù)據(jù)庫(kù)
[mongod@mysql-master bak-mongodb]$ mongo --port 38019  admin

7.2 查看獲取數(shù)據(jù)庫(kù)的oplog,此處獲取一個(gè)文檔。
my_ReplSet1:PRIMARY> use local
switched to db local
my_ReplSet1:PRIMARY> db.oplog.rs.find({op:"c"}).pretty();
{
    "ts" : Timestamp(1632700901, 1),
    "t" : NumberLong(1),
    "h" : NumberLong(0),
    "v" : 2,
    "op" : "c",
    "ns" : "student.$cmd",
    "ui" : UUID("5ae40786-5938-43a8-9b8e-a4bd80f67298"),
    "o2" : {
        "numRecords" : 1000
    },
    "wall" : ISODate("2021-09-27T00:01:41.904Z"),
    "o" : {
        "drop" : "users"
    }
}

my_ReplSet1:PRIMARY> 

7.3  獲取到oplog誤刪除時(shí)間點(diǎn)位置:
"ts" : Timestamp(1632700901, 1)


8、數(shù)據(jù)庫(kù)恢復(fù)
方案:恢復(fù)全備備份+應(yīng)用oplog

8.1、進(jìn)入到備份目錄下
[mongod@mysql-master bak-mongodb]$ ll
total 8
drwxrwxr-x 2 mongod mongod   69 Sep 26 19:52 admin
drwxrwxr-x 2 mongod mongod 4096 Sep 26 19:52 config
drwxrwxr-x 2 mongod mongod   57 Sep 26 20:04 local
-rw-rw-r-- 1 mongod mongod  110 Sep 26 19:52 oplog.bson
drwxrwxr-x 2 mongod mongod   55 Sep 26 19:52 ronnystack
drwxrwxr-x 2 mongod mongod   53 Sep 26 19:52 student
[mongod@mysql-master bak-mongodb]$ cd local/
[mongod@mysql-master local]$ ll
total 23644
-rw-rw-r-- 1 mongod mongod 24203894 Sep 26 20:04 oplog.rs.bson
-rw-rw-r-- 1 mongod mongod      142 Sep 26 20:04 oplog.rs.metadata.json

8.2 復(fù)制local庫(kù)下的oplog.rs.bson到上一級(jí)目錄下,會(huì)覆蓋之前備份的oplog.bson。如需要,請(qǐng)備份。
[mongod@mysql-master local]$ cp oplog.rs.bson  ../oplog.bson 

8.3、刪除備份的local庫(kù)和表
[mongod@mysql-master local]$ rm -rf /data/mongodb/bak-mongodb/local/

8.4、恢復(fù)數(shù)據(jù)庫(kù),及恢復(fù)過(guò)程
#數(shù)據(jù)庫(kù)的恢復(fù),如果是生產(chǎn)環(huán)境,做好備份,請(qǐng)恢復(fù)到測(cè)試庫(kù)中。本次是在原庫(kù)恢復(fù),因有冪等性,恢復(fù)比較慢。
[mongod@mysql-master bak-mongodb]$ mongorestore --port 38019  --oplogReplay --oplogLimit "1632700901:1"  --drop   /data/mongodb/bak-mongodb
2021-09-26T20:17:44.451-0400    preparing collections to restore from
2021-09-26T20:17:44.451-0400    don't know what to do with file "/data/mongodb/bak-mongodb/.oplog.bson.swp", skipping...
2021-09-26T20:17:44.461-0400    reading metadata for config.cache.chunks.config.system.sessions from /data/mongodb/bak-mongodb/config/cache.chunks.config.system.sessions.metadata.json
2021-09-26T20:17:44.513-0400    restoring config.cache.chunks.config.system.sessions from /data/mongodb/bak-mongodb/config/cache.chunks.config.system.sessions.bson
2021-09-26T20:17:44.526-0400    reading metadata for student.grades from /data/mongodb/bak-mongodb/student/grades.metadata.json
2021-09-26T20:17:44.526-0400    reading metadata for ronnystack.courses from /data/mongodb/bak-mongodb/ronnystack/courses.metadata.json
2021-09-26T20:17:44.551-0400    restoring student.grades from /data/mongodb/bak-mongodb/student/grades.bson
2021-09-26T20:17:44.561-0400    restoring ronnystack.courses from /data/mongodb/bak-mongodb/ronnystack/courses.bson
2021-09-26T20:17:44.562-0400    restoring indexes for collection ronnystack.courses from metadata
2021-09-26T20:17:44.841-0400    finished restoring ronnystack.courses (0 documents, 0 failures)
2021-09-26T20:17:44.861-0400    no indexes to restore
2021-09-26T20:17:44.861-0400    finished restoring student.grades (99 documents, 0 failures)
2021-09-26T20:17:44.862-0400    reading metadata for config.cache.chunks.ronnystack.courses from /data/mongodb/bak-mongodb/config/cache.chunks.ronnystack.courses.metadata.json
2021-09-26T20:17:44.907-0400    restoring config.cache.chunks.ronnystack.courses from /data/mongodb/bak-mongodb/config/cache.chunks.ronnystack.courses.bson
2021-09-26T20:17:44.913-0400    reading metadata for config.cache.collections from /data/mongodb/bak-mongodb/config/cache.collections.metadata.json
2021-09-26T20:17:44.917-0400    reading metadata for config.cache.databases from /data/mongodb/bak-mongodb/config/cache.databases.metadata.json
2021-09-26T20:17:44.950-0400    restoring config.cache.collections from /data/mongodb/bak-mongodb/config/cache.collections.bson
2021-09-26T20:17:44.965-0400    restoring indexes for collection config.cache.chunks.config.system.sessions from metadata
2021-09-26T20:17:44.967-0400    restoring indexes for collection config.cache.chunks.ronnystack.courses from metadata
2021-09-26T20:17:44.973-0400    restoring config.cache.databases from /data/mongodb/bak-mongodb/config/cache.databases.bson
2021-09-26T20:17:45.024-0400    no indexes to restore
2021-09-26T20:17:45.024-0400    finished restoring config.cache.collections (2 documents, 0 failures)
2021-09-26T20:17:45.026-0400    no indexes to restore
2021-09-26T20:17:45.026-0400    finished restoring config.cache.databases (2 documents, 0 failures)
2021-09-26T20:17:45.038-0400    finished restoring config.cache.chunks.ronnystack.courses (4 documents, 0 failures)
2021-09-26T20:17:45.040-0400    finished restoring config.cache.chunks.config.system.sessions (1024 documents, 0 failures)
2021-09-26T20:17:45.040-0400    replaying oplog
2021-09-26T20:17:47.451-0400    oplog  970KB
2021-09-26T20:17:50.451-0400    oplog  2.44MB
2021-09-26T20:17:53.451-0400    oplog  3.59MB
2021-09-26T20:17:56.451-0400    oplog  4.75MB
2021-09-26T20:17:59.451-0400    oplog  5.87MB
2021-09-26T20:18:02.451-0400    oplog  6.98MB
2021-09-26T20:18:05.451-0400    oplog  8.08MB
2021-09-26T20:18:08.451-0400    oplog  9.18MB
2021-09-26T20:18:11.451-0400    oplog  10.3MB
2021-09-26T20:18:14.451-0400    oplog  11.4MB
2021-09-26T20:18:17.451-0400    oplog  12.6MB
2021-09-26T20:18:20.451-0400    oplog  13.6MB
2021-09-26T20:18:23.451-0400    oplog  14.5MB
2021-09-26T20:18:26.451-0400    oplog  15.4MB
2021-09-26T20:18:29.451-0400    oplog  16.1MB
2021-09-26T20:18:32.451-0400    oplog  17.0MB
2021-09-26T20:18:35.451-0400    oplog  17.9MB
2021-09-26T20:18:38.451-0400    oplog  18.8MB
2021-09-26T20:18:41.451-0400    oplog  19.7MB
2021-09-26T20:18:44.451-0400    oplog  20.5MB
2021-09-26T20:18:47.451-0400    oplog  21.3MB
2021-09-26T20:18:50.451-0400    oplog  23.1MB
2021-09-26T20:18:50.523-0400    applied 114582 oplog entries
2021-09-26T20:18:50.523-0400    oplog  23.1MB
2021-09-26T20:18:50.523-0400    1131 document(s) restored successfully. 0 document(s) failed to restore.
[mongod@mysql-master bak-mongodb]$ 
注意:--oplogLimit "1632700901:1" 的格式和位置。

8.5、登錄到數(shù)據(jù)庫(kù)并驗(yàn)證數(shù)據(jù)
my_ReplSet1:PRIMARY> use student
switched to db student
my_ReplSet1:PRIMARY> show tables
courses
grades
users
my_ReplSet1:PRIMARY> db.users.count()
1000
my_ReplSet1:PRIMARY> 

4 分片集群備份

思考:分片集群是分布式,如何進(jìn)行備份有效恢復(fù),制定備份方案。

4.1、分片集群要備份什么?
根據(jù)分片集群的結(jié)構(gòu)組成,分為三部分:mongos、config server和shard 。
mongos是作為路由,不存儲(chǔ)數(shù)據(jù)。因此,需要備份config server和shard 節(jié)點(diǎn),

4.2 、單獨(dú)進(jìn)行備份
 備份有什么困難和問(wèn)題
(1)chunk遷移的問(wèn)題
    人為控制在備份的時(shí)候,避開(kāi)遷移的時(shí)間窗口
(2)shard節(jié)點(diǎn)之間的數(shù)據(jù)不在同一時(shí)間點(diǎn)。
    選業(yè)務(wù)量較少的時(shí)候       
        
4.3 、了解Ops Manager ,用于分片備份,監(jiān)控,優(yōu)化等。

至此:MongoDB的OPlog和備份恢復(fù)案例演示完畢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容