MongoDB ๋ณต์ ๊ตฌ์ฑ์์ Primary๋ก๋ถํฐ ๋ฐ์ํ ๋ณ๊ฒฝ์ฌํญ์ ๋ค๋ฅธ Secondary ๋ฉค๋ฒ์ ๋ณต์ ํ๊ธฐ ์ํด Oplog๋ผ๋ Capped Collection์ ์ฌ์ฉํ๋ค. Capped Collection์ ํฌ๊ธฐ๊ฐ ์ ํ ๋ Collection์ด๋ค. ์๋ฅผ ๋ค์ด 10GB์ Capped Collection์ ์์ฑํ๋ฉด 10GB๋ฅผ ๋์ด์๋ ์๊ฐ ๊ฐ์ฅ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ FIFO ๊ตฌ์กฐ์ Collection์ด๋ค.
MongoDB์ ์ํ๊ฐ ์ ์์ผ ๋๋ oplog๋ฅผ ํตํด ๊ธ๋ฐฉ ๋ณต์ ๋ฅผ ๋ฐ๋ผ๊ฐ๋ค. ๊ทธ๋์ Oplog์ Capped ํฌ๊ธฐ๊ฐ ์๊ด์์ ๊ฒ ๊ฐ์ง๋ง, ์ด์ ํ๊ฒฝ์์ ์์ธ๋ก ์ฌ๋ฌ๊ฐ์ง ์ด์ ์ ์ํด ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด์ค์ผํ๋ค. ๋ช ๊ฐ์ง ์๋ฅผ ๋ค์ด๋ณด๋ฉด
- ์๋ฒ ์ ๊ฒ์ด ์ค๋ ๊ฑธ๋ ค์ ๋ค์ ์ ์์ผ๋ก ๋์์์ ๋, initial sync๊ฐ ์๋ ์ผ๋ฐ ๋ณต์ ๋ก ๋ฐ๋ผ๊ฐ๊ธฐ ์ํด oplog ํฌ๊ธฐ๋ฅผ ๋๋ ค์ค๋ค.
- ํ์ผ ๋ณต์ฌ ํํ์ ๋ฐฑ์ ์ ์ฑ ์ ๊ฐ๊ณ ์์ด์ ๋ฐฑ์ ํ๋ ๋์ Fsync Lock์ ๊ฑธ์ด์ฃผ๋๋ฐ, ๋ฐฑ์ ์๊ฐ์ด ์ค๋๊ฑธ๋ ค์ ๋ง์ฐฌ๊ฐ์ง๋ก oplog ํฌ๊ธฐ๋ฅผ ๋๋ ค์ค๋ค.
- ๋งค์ผ ์ ๊ธฐ์ ์ผ๋ก ๋ฐฐ์น ํํ์ ํธ๋ํฝ์ด ๋ฐ์ํด์ Oplog Window Hour๊ฐ 0์ ์๋ ดํ๋ ๊ฒฝ์ฐ
- ์ผ๋ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ณต๊ฐ์ด ํ์ํด์ Oplog ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๊ฒฝ์ฐ
rs_1 [direct: secondary] test> rs.printReplicationInfo()
actual oplog size
'10000 MB'
---
configured oplog size
'10000 MB'
---
log length start to end
'6943753 secs (1928.82 hrs)'
---
oplog first event time
'Fri Feb 17 2023 11:23:12 GMT+0900 (__REGIEON__ Standard Time)'
---
oplog last event time
'Mon May 08 2023 20:12:25 GMT+0900 (__REGIEON__ Standard Time)'
---
now
'Mon May 08 2023 20:12:33 GMT+0900 (__REGIEON__ Standard Time)'
๋ฑ ์ฌ๋ฌ ๊ฐ์ง ์ด์์์๋ค์ด ์๋ค. Oplog Window Hour๋ oplog์ ๊ฐ์ฅ ์ฒ์๊ณผ ๋ง์ง๋ง ๋ณ๊ฒฝ์ฌํญ์ ๋ํ ์๊ฐ ์ฐจ์ด๋ฅผ ์๋ฏธํ๋ค. ๋๋ต์ ์ผ๋ก ์ผ๋ง๋ ๋ณต์ ๊ฐ ์ง์ฐ๋์ด๋ oplog๋ฅผ ํตํด ๋ฐ๋ผ๊ฐ ์ ์๋์ง ํ์ธํ ์ ์๋ ์์น์ด๋ค.
๊ทธ๋์ ๋ฐ์ํ๋ DML ํธ๋ํฝ์ ๋ฐ๋ผ ์์ ๊ฐ์ด ์ค๋ฅด๊ณ ๋ด๋ฆฌ๊ณ ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๋๋ฆผ๋ชฉ์ด ์๋ ๋ถ๋ถ์ ํธ๋ํฝ์ด ํ์๋ณด๋ค ๋ง์ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๋ค. ์ฌํํผ, ์ด์ํ๋ ๊ด์ ์์ Oplog ๋ณ๊ฒฝ์ ๋ํ ์ฃผ์์ฌํญ๋ ์๊ณ ์์ด์ผํ๋ค.
Oplog ์์
Distribution : 3 Member Replica set
Version : MongoDB 5.0.13
Oplog ์ค์ ์ mongod ํ๋ก์ธ์ค๋ฅผ ์ต์ด์ ์ฌ๋ฆด ๋, ์ต์ ํน์ config file๋ก ์ค์ ํ ์ ์๋ค. ๋ง์ฝ ๊ธฐ์กด์ oplog size ์ค์ ์ด ์๋์ด ์์๋ค๋ฉด MongoDB์์ ์๋์ผ๋ก ๋ช ๊ฐ์ง ๊ณ์ฐ์ ํตํด ์ค์ ํ๋ค. Oplog๋ Online ์ํ์์ ๋ช ๋ น์ผ๋ก ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. ํผ๋์ด ์ฌ ์ ์๋ ๋ถ๋ถ์ oplog๊ฐ ํ๋ฒ ์ค์ ๋๊ณ ๋์ config file์ด๋ ์ต์ ์ ์์ ํ๊ณ ์ฌ๊ธฐ๋ํด๋ ๋ณ๊ฒฝ๋์ง ์๋๋ค. ์ด๊ฒ ํท๊ฐ๋ ค์ oplog ์์ ํ๋ฉด ๊ธฐ๋ ์ต์ ์ด๋ config file๋ ํจ๊ป ์์ ํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
Oplog ๋๋ฆฌ๊ธฐ
์ค์ด๋๋ฐ๋ Primary์ Secondary ์์๊ฐ ์ค์ํ๋ค. ๋๋ฆฌ๋๊ฒฝ์ฐ, ์์๋ ๋ณ๋ ฌ ์์ ๋ฑ ์๊ด์๋ค.
rs_1 [direct: secondary] test> use local
switched to db local
rs_1 [direct: secondary] local> db.oplog.rs.stats().maxSize
2097152000
๋จผ์ ์ค์ ๋ Oplog Size๋ฅผ ํ์ธํ๋ค. 2GB๋ก ์ค์ ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
[root@__HOST__:/root/mongodb/data]$ du -sh *
340K admin
348K config
200M diagnostic.data
300M journal
188M local
...
...
local database์ ๋ฌผ๋ฆฌ์ ์ ํฌ๊ธฐ๋ ํ์ธํด์ ์ผ์ ์์น ์ดํ๋ก ์ฆ๊ฐํ์ง ์๊ณ ์ญ์ ํ๋ ๊ฒ์ ํ์ธํด๋ณด์.
function makeTxt(length) {
let result = '';
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const charactersLength = characters.length;
let counter = 0;
while (counter < length) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
counter += 1;
}
return result;
}
for(var i=0; i<10; i++){
var arr = [];
for(var j=0; j<10000; j++){
arr.push({a: j, txt: makeTxt(100)})
};
db.test.insertMany(arr);
};
์์ ๊ฐ์ด ๋ณ๊ฒฝ์ฌํญ์ด ์ฌ๋ฟ ๋ฐ์ํ๋๋ก ์คํํด๋ณด์. ์ต๋ ํฌ๊ธฐ๊น์ง ๋๋ฌํ๋๋ก ์์ ํ ์์ ์ด๋ค. MongoDB๋ ๋ฐ์ดํฐ๋ฅผ ์์ถํ๊ธฐ ๋๋ฌธ์ ๋ฌผ๋ฆฌ์ ์ธ ํฌ๊ธฐ๊ฐ Oplog์ ์ต๋์น๊น์ง ์ฌ๋ผ๊ฐ์ง ์๋๋ค. ์ฆ, Oplog์ ์ค์ ํฌ๊ธฐ๋ ์์ถํ๊ธฐ ์ด์ ์ธ ๋ฐ์ดํฐ์ ๋ํ ํฌ๊ธฐ์ด๋ค. oplog๋ฅผ ๋ค ์ฌ์ฉํ๋์ง๋ collection์ ์ธ๋ถ ์ ๋ณด์ ๋ณต์ ์ ๋ณด๋ฅผ ํตํด ํ์ธํ ์ ์๋ค.
rs_1 [direct: primary] local> rs.printReplicationInfo()
actual oplog size
'2000 MB'
---
configured oplog size
'2000 MB'
---
log length start to end
'463.9999930858612 secs (0.13 hrs)'
---
oplog first event time
'Mon May 08 2023 20:52:21 GMT+0900 (__REGIEON__ Standard Time)'
---
oplog last event time
'Mon May 08 2023 21:00:05 GMT+0900 (__REGIEON__ Standard Time)'
---
now
'Mon May 08 2023 21:00:05 GMT+0900 (__REGIEON__ Standard Time)'
rs_1 [direct: primary] local> db.oplog.rs.stats().maxSize
2097152000
rs_1 [direct: primary] local> db.oplog.rs.stats().size
2091786256
๋ฌผ๋ฆฌ์ ์ธ ํฌ๊ธฐ๋ ํ์ธํ๋ฉด ์ด๋์๊ฐ๋ถํฐ ๋์ด๋์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. oplog collection์ ๋ํ Stat์ ํ์ธํด๋ณด๋ฉด ์ต๋ํฌ๊ธฐ๊น์ง ์ฌ์ฉํ ๊ฒ์ ๋ณผ ์ ์๊ณ Oplog Window Hour๋ ํฌ๊ฒ ์ค์ด๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋ ๋ด์ ์ ์๋๋ก ์์น๋ฅผ ๋๋ ค๋ณด๊ฒ ๋ค.
rs_1 [direct: primary] test> db.adminCommand({replSetResizeOplog: 1, size: Double(3000)})
{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1683547464, i: 2 }),
signature: {
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
keyId: Long("0")
}
},
operationTime: Timestamp({ t: 1683547464, i: 2 })
}
rs_1 [direct: primary] local> db.oplog.rs.stats().maxSize
Long("3145728000")
rs_1 [direct: primary] local> db.oplog.rs.stats().size
2091791838
MB ๋จ์๋ก ๊ฐ์ ๋ฃ์ด์ ์คํํ ์ ์๊ณ ๋ณ๊ฒฝ ์ดํ์๋ maxSize๊ฐ ๋์ด๋ ๊ฒ์ ํ์ธํ๋ค.
Oplog ์ค์ด๊ธฐ
Oplog๋ฅผ ์ค์ผ ๋๋ ์์๊ฐ ์ค์ํ๋ค. Secondary ๋จผ์ ์ค์ฌ์ฃผ๊ณ ์ดํ Primary๋ฅผ ์ค์ฌ์ค์ผํ๋ค. ํฌ๊ธฐ๋ง ๋ณ๊ฒฝํ๋ฉด ์์๋ ์๊ด์์ง๋ง, ์ค์ธ ํ ์๋ฌด๋ฐ ๋ณ๊ฒฝ์ด ์์ผ๋ฉด ๋ฐ์ดํฐ ํ์ผ์ ํฌ๊ธฐ๊ฐ ๊ทธ๋๋ก ๋จ์ ํด๋น ๊ณต๊ฐ์ ์ฌ์ฉํ์ง ๋ชปํ๋ค. ๊ทธ๋์ compaction๊น์ง ์ํํด์ฃผ๊ธฐ ์ํด secondary์์ ๋จผ์ ์คํํ๊ณ stepdown ํ, ๋๋จธ์ง ๋ฉค๋ฒ๋ ๋ณ๊ฒฝํด์ค๋ค.
- Secondary ๋จผ์ oplog ์ค์ธ๋ค.
- Secondary์์ compaction ๋ช ๋ น ์ํํ๋ค.
- Primary Stepdown
- Stepdownํ Primary๋ oplog๋ฅผ ์ค์ธ๋ค.
- ๋ค์ compaction
[root@__HOST__:/root/mongodb/data]$ du -sh local
449M local
ํ์ฌ ๋ฌผ๋ฆฌ์ ์ธ ํฌ๊ธฐ๋ฅผ ํ์ธํ๊ณ Secondary๋ถํฐ Oplog ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํด์ค๋ค.
# Secondary ์ํ
rs_1 [direct: secondary] test> db.adminCommand({replSetResizeOplog: 1, size: Double(990)})
rs_1 [direct: secondary] test> use local
rs_1 [direct: secondary] local> db.runCommand({ "compact" : "oplog.rs" } )
# Primary ์ํ
rs_1 [direct: primary] test> rs.stepDown()
rs_1 [direct: secondary] test> db.adminCommand({replSetResizeOplog: 1, size: Double(990)})
์์ ์ ๊ฐ๋จํ๋ค. Primary์์๋ Compaction ๋ช ๋ น์ ์ํํ๊ธฐ ์ ์ ๋ฌผ๋ฆฌ์ ์ธ ํฌ๊ธฐ๋ฅผ ํ์ธํ์. ์์ ๋์ผํ๊ฒ ๋ฌผ๋ฆฌ์ ์ธ ํฌ๊ธฐ๋ ์ค์ด๋ค์ง ์์ ๊ฒ์ ํ์ธํ ์ ์๋ค.
rs_1 [direct: secondary] test> use local
rs_1 [direct: secondary] local> db.runCommand({ "compact" : "oplog.rs" } )
### ๋ฌผ๋ฆฌ์ ํฌ๊ธฐ ํ์ธ
[root@__HOST__:/root/mongodb/data]$ du -sh local
268M local
compact ๋ช ๋ น์ ์ํํ๊ณ ๋์์ผ ๋ฌผ๋ฆฌ์ ๋ฐ์ดํฐ ํ์ผ ํฌ๊ธฐ๊ฐ ์ค์ด๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. compaction์ ์ ํ์ ์ด์ง๋ง, ๋ฐ์ดํฐ๋ฅผ ๋ ์ ์ฅํ ์ ์๋๋ก ์ฉ๋ํ๋ณด๋ฅผ ๋ฏธ๋ฆฌ ํด๋๋ ๊ฒ์ด ์ข๋ค. ๊ผญ ํจ๊ป ์ํํด์ฃผ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
๋๊ธ