Docs Menu
Docs Home
/
MongoDB ๋งค๋‰ด์–ผ
/ / /

์ž์ฒด ๊ด€๋ฆฌํ˜• ์ƒค๋“œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ณต์ œ๋ณธ ์„ธํŠธ๋กœ ๋ณ€ํ™˜

์ด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ

  • ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—
  • ๋‹จ์ผ ์ƒค๋“œ๊ฐ€ ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ณต์ œ๋ณธ ์„ธํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ
  • ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ณต์ œ๋ณธ ์„ธํŠธ๋กœ ๋ณ€ํ™˜
  • ๋‹ค์Œ ๋‹จ๊ณ„
  • ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ ๋น„์ƒค๋“œ ๋ณต์ œ๋ณธ ์„ธํŠธ ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ณต์ œ๋ณธ ์„ธํŠธ ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ์ž์ฒด ๊ด€๋ฆฌ ๋ณต์ œ๋ณธ ์„ธํŠธ๋ฅผ ์ƒค๋“œ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ณ€ํ™˜์„ ์ฐธ์กฐํ•˜์„ธ์š”. ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒค๋”ฉ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

MongoDB 8.0 ๋ถ€ํ„ฐ directShardOperations ์—ญํ• ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒค๋“œ์— ๋Œ€ํ•ด ์ง์ ‘ ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์œ ์ง€ ๊ด€๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ 

directShardOperations ์—ญํ•  ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. directShardOperations ์—ญํ•  ์€ ์œ ์ง€ ๊ด€๋ฆฌ ๋ชฉ์ ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ MongoDB ์ง€์› ์˜ ์ง€์นจ ์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์œ ์ง€ ๊ด€๋ฆฌ ์ž‘์—… ์ˆ˜ํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด directShardOperations ์—ญํ•  ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŠœํ† ๋ฆฌ์–ผ์˜ ๋‹จ๊ณ„์—๋Š” MongoDB 6.0 ์ด์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

fsync ๋ฐ fsyncUnlock ๋ช…๋ น์—๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ fsync ์กฐ์น˜ ํ•„์š”ํ•˜๋ฉฐ, ์ด๋Š” ์—ญํ•  ๋˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์—ญํ•  ํ†ตํ•ด ํ• ๋‹น๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.hostManager

์ฒญํฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ๋ฆฌ์ƒค๋”ฉ ๋ฐ ์Šคํ‚ค๋งˆ ๋ณ€ํ™˜์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐธ๋Ÿฐ์„œ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ๋ฝ .

  1. mongosh mongos ๋ฅผ ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ ์˜ ์ธ์Šคํ„ด์Šค ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  2. ๋ฐธ๋Ÿฐ์„œ ์ค‘์ง€ํ•˜๋ ค๋ฉด ์‹คํ–‰.

    sh.stopBalancer()
  3. ๋ฐธ๋Ÿฐ์„œ ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ ํ•˜๊ณ  ์ถœ๋ ฅ์ด false์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    sh.getBalancerState()
  4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์“ฐ๊ธฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ ๋ฝ ์‹คํ–‰.

    db.getSiblingDB( "admin" ).fsyncLock()
  5. ๋ฝ ํ™•์ธํ•˜๋ ค๋ฉด ์‹คํ–‰.

    db.getSiblingDB( "admin" ).aggregate( [
    { $currentOp: { } },
    { $facet: {
    "locked": [
    { $match: { $and: [
    { fsyncLock: { $exists: true } }
    ] } }
    ],
    "unlocked": [
    { $match: { fsyncLock: { $exists: false } } }
    ]
    } },
    { $project: {
    "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] },
    "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] }
    } }
    ] )
  6. ์ถœ๋ ฅ์— fsyncLocked ์ด(๊ฐ€) true(์ด๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ€ ์ž ๊ฒจ ์žˆ์Œ์„ ์˜๋ฏธํ•จ)๋กœ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    [ { fsyncLocked: true }, { fsyncUnlocked: false } ]

์ƒค๋“œ๊ฐ€ ํ•˜๋‚˜๋ฟ์ธ ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์ƒค๋“œ์— ์ „์ฒด ๋ฐ์ดํ„ฐ ์„ธํŠธ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ ˆ์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒค๋”ฉ๋˜์ง€ ์•Š์€ ๋ณต์ œ๋ณธ ์„ธํŠธ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  1. ์‹œ์Šคํ…œ์ด ์ƒˆ ๋ณต์ œ๋ณธ ์„ธํŠธ๊ฐ€ ๋  ๋‹จ์ผ ์ƒค๋“œ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๋ณต์ œ๋ณธ ์„ธํŠธ์˜ ํ”„๋ผ์ด๋จธ๋ฆฌ ๋ฉค๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋„๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. mongod ์—์„œ --shardsvr ์˜ต์…˜์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค

    ํŒ

    --shardsvr ์˜ต์…˜์„ ๋ณ€๊ฒฝํ•˜๋ฉด mongod์˜ ์ˆ˜์‹  ์—ฐ๊ฒฐ ํฌํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

๋‹จ์ผ ์ƒค๋“œ ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์ด์ œ ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ž‘์—…์„ ํ—ˆ์šฉํ•˜๋Š” ๋น„์ƒค๋“œํ˜• ๋ณต์ œ๋ณธ ์„ธํŠธ ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์ ˆ์ฐจ์— ๋”ฐ๋ผ ์ƒค๋“œ๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์ธ ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋ณต์ œ๋ณธ ์„ธํŠธ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ ์ž ๊ทธ๊ณ  ๋ฐธ๋Ÿฐ์„œ ๋น„ํ™œ์„ฑํ™”ํ•œ ์ƒํƒœ์—์„œ ์ƒค๋”ฉ๋œํด๋Ÿฌ์Šคํ„ฐ ์— ์ƒˆ ๋ณต์ œ๋ณธ ์„ธํŠธ ๋ฐฐํฌ . ๋ณต์ œ๋ณธ ์„ธํŠธ ํ˜„์žฌ ์ƒค๋“œ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ๊ฒฐํ•ฉํ•œ ์ƒํƒœ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์šฉ๋Ÿ‰ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ „์†ก ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ƒˆ ๋ณต์ œ๋ณธ ์„ธํŠธ ์— ์—ฐ๊ฒฐํ•˜๋„๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑํ•˜์ง€ ๋งˆ์„ธ์š”.

  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์žฌ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ mongos ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ ์ค‘์ง€ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค mongos ์—์„œ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ ์ค‘์ง€ํ•˜๋Š” mongos mongos ๊ฒฝ์šฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ˆ์ฐจ๋ฅผ ์œ„ํ•ด ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†๋Š” ์ž„์‹œ ์ธ์Šคํ„ด์Šค ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  3. mongodump ๋ฐ mongorestore๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ mongos ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ ๋ณต์ œ๋ณธ ์„ธํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

    config ๋ฅผ ์‹คํ–‰ mongorestore ๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ ์™€ ๊ฐ™์ด ์˜ต์…˜์„ --nsExclude ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    mongorestore --nsExclude="config.*" <connection-string> /data/backup

    ์ฐธ๊ณ 

    ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ชจ๋“  ์ปฌ๋ ‰์…˜์ด ๋ฐ˜๋“œ์‹œ ์ƒค๋“œ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ƒค๋“œ ๋œ ์ปฌ๋ ‰์…˜๋งŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ปฌ๋ ‰์…˜ ๋ชจ๋‘๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  4. mongos ์ธ์Šคํ„ด์Šค ๋Œ€์‹  ์ƒค๋”ฉ๋˜์ง€ ์•Š์€ ๋ณต์ œ๋ณธ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    ์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ณต์ œ๋ณธ ์„ธํŠธ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด ๋ณต์ œ๋ณธ ์„ธํŠธ์˜ ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ƒค๋”ฉ๋˜์ง€ ์•Š์€ ๋ณต์ œ๋ณธ ์„ธํŠธ๋ฅผ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‚˜๋จธ์ง€ ์ƒค๋“œ ํด๋Ÿฌ์Šคํ„ฐ ์ธํ”„๋ผ๋ฅผ ํ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ ๋ณต์ œ๋ณธ ์„ธํŠธ ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ์ž ๊ธˆ์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

  1. ํด๋Ÿฌ์Šคํ„ฐ ์ž ๊ธˆ์„ ํ•ด์ œํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์“ฐ๊ธฐ๋ฅผ ์žฌ๊ฐœํ•˜๋ ค๋ฉด ๋‹ค์Œ ์‹คํ–‰.

    db.getSiblingDB( "admin" ).fsyncLock()
  2. ์ž ๊ธˆ ํ•ด์ œ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ์‹คํ–‰.

    db.getSiblingDB("admin").aggregate( [
    { $currentOp: { } },
    { $facet: {
    "locked": [
    { $match: { $and: [
    { fsyncLock: { $exists: true } }
    ] } } ],
    "unlocked": [
    { $match: { fsyncLock: { $exists: false } } }
    ]
    } },
    { $project: {
    "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] },
    "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] }
    } }
    ] )
  3. ์ถœ๋ ฅ์— fsyncLocked ์ด(๊ฐ€) false(์ด๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์˜ ์ž ๊ธˆ์ด ํ•ด์ œ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•จ)๋กœ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    [ { fsyncLocked: false }, { fsyncUnlocked: true } ]

์ƒค๋”ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ ๋ฐธ๋Ÿฐ์„œ ๊ด€๋ฆฌ

๋Œ์•„๊ฐ€๊ธฐ

ํด๋Ÿฌ์Šคํ„ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐฑ์—