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

1 oplog詳解

1.1 oplog介紹

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

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

對于 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 存儲在 local 庫的 oplog.rs 集合里面。對于一般的線上環(huán)境來說,默認(rèn)的 Oplog 值就已經(jīng)足夠了。當(dāng)達(dá)到儲存大小的日志時(shí),新的記錄會將老的記錄覆蓋。

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

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

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

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

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

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

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

作用:

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

1.4 oplog的常用命令

注意事項(xiàng):
1、在replica set中oplog是一個定容集合(capped collection),它的默認(rèn)大小是磁盤空間的5%(可以通過--oplogSizeMB參數(shù)修改)。
2、oplog位于local庫的db.oplog.rs。其中記錄的是整個mongod數(shù)據(jù)實(shí)例一段時(shí)間內(nèi)數(shù)據(jù)庫的所有變更(插入/更新/刪除)操作。
3、當(dāng)oplog的空間用完時(shí)新記錄自動覆蓋最老的記錄。其覆蓋范圍被稱作oplog時(shí)間窗口。需要注意的是,因?yàn)閛plog是一個定容集合,
所以時(shí)間窗口能覆蓋的范圍會因?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):可以查看到評估的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 存儲設(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í)長和時(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> 

注意:
# 如果我們通過上面命令更改了 Oplog 的大小,系統(tǒng)是不會自動回收原始分配給 Oplog 的磁盤空間,我們需要使用 compact 來回收,在操作 compact 命令時(shí),副本集成員是無法進(jìn)行同步數(shù)據(jù)的。建議在進(jìn)行回收的時(shí)候,不要對數(shù)據(jù)庫進(jìn)行寫入,我們可以通過 rs.stepDown() 來關(guān)閉所有打開的連接。
use local
db.runCommand({ "compact" : "oplog.rs" })
# 執(zhí)行報(bào)錯的話 :"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中字段的含義,通過下面的命令取出一條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ù)表示。這個值很重要,在選舉(如master宕機(jī)時(shí))新primary時(shí),會選擇ts最大的那個secondary作為新primary
op:1字節(jié)的操作類型
        "i": insert
        "u": update
        "d": delete
        "c": db cmd
        "db":聲明當(dāng)前數(shù)據(jù)庫 (其中ns 被設(shè)置成為=>數(shù)據(jù)庫名稱+ '.')
        "n": no op,即空操作,其會定期執(zhí)行以確保時(shí)效性
ns:操作所在的namespace
o:操作所對應(yīng)的document,即當(dāng)前操作的內(nèi)容(比如更新操作時(shí)要更新的的字段和值)
o2: 在執(zhí)行更新操作時(shí)的where條件,僅限于update時(shí)才有該屬性。

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

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

應(yīng)用方法:
1、準(zhǔn)備測試數(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ù)庫
[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 會記錄備份過程中的數(shù)據(jù)變化。會以oplog.bson保存下來

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

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

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

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

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

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

故障恢復(fù)步驟
1、登錄到數(shù)據(jù)庫并創(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庫和grades文檔。
[mongod@mysql-master bak-mongodb]$ for(var i = 1 ;i < 100; i++) { db.grades.insert({id:i,coures:"Python",grade:100});}

3、模擬全庫做備份
[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  #備份全庫

備份的文件目錄
[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í),將備份過程中產(chǎn)生的日志進(jìn)行備份
文件必須存放在/data/mongodb/bak-mongodb下,自動命名為oplog.bson

4、模擬數(shù)據(jù)的增長
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ù)庫
場景:上午10點(diǎn),某開發(fā)人員誤刪除student庫下的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)故障立即啟動故障恢復(fù)方案。立即停庫,停業(yè)務(wù)。

備份現(xiàn)有的數(shù)據(jù)和local庫下的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ù)庫
[mongod@mysql-master bak-mongodb]$ mongo --port 38019  admin

7.2 查看獲取數(shù)據(jù)庫的oplog,此處獲取一個文檔。
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ù)庫恢復(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庫下的oplog.rs.bson到上一級目錄下,會覆蓋之前備份的oplog.bson。如需要,請備份。
[mongod@mysql-master local]$ cp oplog.rs.bson  ../oplog.bson 

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

8.4、恢復(fù)數(shù)據(jù)庫,及恢復(fù)過程
#數(shù)據(jù)庫的恢復(fù),如果是生產(chǎn)環(huán)境,做好備份,請恢復(fù)到測試庫中。本次是在原庫恢復(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ù)庫并驗(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是作為路由,不存儲數(shù)據(jù)。因此,需要備份config server和shard 節(jié)點(diǎn),

4.2 、單獨(dú)進(jìn)行備份
 備份有什么困難和問題
(1)chunk遷移的問題
    人為控制在備份的時(shí)候,避開遷移的時(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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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