๋ฌธ์„œ ๋ฉ”๋‰ด

๋ฌธ์„œ ํ™ˆ โ†’ Cluster-to-Cluster Sync

start

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

  • ์„ค๋ช…
  • ์š”๊ตฌ ์‚ฌํ•ญ:
  • ์š”์ฒญ
  • ์‘๋‹ต
  • ์˜ˆ์ œ: ๋™๊ธฐํ™” ์ž‘์—… ์‹œ์ž‘
  • ์˜ˆ์‹œ: ์—ญ๋ฐฉํ–ฅ ๋™๊ธฐํ™” ์ž‘์—… ์‹œ์ž‘
  • ์˜ˆ์‹œ: ํ•„ํ„ฐ๋ง๋œ ๋™๊ธฐํ™” ์ž‘์—… ์‹œ์ž‘
  • ์˜ˆ์‹œ: ๋ณต์ œ๋ณธ ์„ธํŠธ์—์„œ ์ƒค๋“œ cluster๋กœ ๋™๊ธฐํ™” ์‹œ์ž‘
  • ํ–‰๋™

์†Œ์Šค cluster์™€ ๋Œ€์ƒ cluster ๊ฐ„์˜ ๋™๊ธฐํ™”๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

start ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด mongosync ์ด IDLE ์ƒํƒœ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

enableUserWriteBlocking ์„ ์„ค์ •ํ•˜๋ ค๋ฉด mongosync ์‚ฌ์šฉ์ž์—๊ฒŒ setUserWriteBlockMode ๋ฐ bypassWriteBlockingMode ์ž‘์—… ์œ ํ˜•์„ ํฌํ•จํ•˜๋Š” ์—ญํ• ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

enableUserWriteBlocking ์„(๋ฅผ) ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ bypassWriteBlockingMode ์ž‘์—… ์œ ํ˜•์ด ์—†๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด์„œ๋งŒ ์“ฐ๊ธฐ๊ฐ€ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—… ์œ ํ˜•์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” ์“ฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mongosync ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์—ญํ• ์„ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์‚ฌ์šฉ์ž ์ง€์ • ์—ญํ• ์„ ๋งŒ๋“ค๋ ค๋ฉด createRole ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    db.adminCommand( {
    createRole: "reverseSync",
    privileges: [ {
    resource: { db: "", collection: "" },
    actions: [ "setUserWriteBlockMode", "bypassWriteBlockingMode" ]
    } ],
    roles: []
    } )
  2. mongosync ์‚ฌ์šฉ์ž์—๊ฒŒ ์‚ฌ์šฉ์ž ์ง€์ • ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด grantRolesToUser ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    db.adminCommand( {
    grantRolesToUser: "mongosync-user",
    roles: [ { role: "reverseSync", db: "admin" } ]
    } )

mongosync ์„(๋ฅผ) ์‹œ์ž‘ํ•  ๋•Œ cluster0 ๋˜๋Š” cluster1 ์„ค์ •์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด์—์„œ ๊ตฌ์„ฑ๋œ ์ด mongosync ์‚ฌ์šฉ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

์ƒค๋“œ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„์— ๋™๊ธฐํ™”ํ•  mongosync ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ mongosync ์ธ์Šคํ„ด์Šค์— ๋™์ผํ•œ API ์—”๋“œํฌ์ธํŠธ ๋ช…๋ น์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์ค‘ Mongosync ์‹œ์ž‘์„ ์ฐธ์กฐํ•˜์„ธ์š”.

POST /api/v1/start
๋งค๊ฐœ๋ณ€์ˆ˜
์œ ํ˜•
ํ•„์š”์„ฑ
์„ค๋ช…
source
๋ฌธ์ž์—ด
ํ•„์ˆ˜ ์‚ฌํ•ญ
์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
destination
๋ฌธ์ž์—ด
ํ•„์ˆ˜ ์‚ฌํ•ญ
๋Œ€์ƒ cluster์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
buildIndexes
๋ฌธ์ž์—ด
์˜ต์…˜

๋™๊ธฐํ™” ์ค‘์— ์ธ๋ฑ์Šค ๋นŒ๋“œ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ง€์›๋˜๋Š” ์˜ต์…˜:

  • beforeDataCopy (๊ธฐ๋ณธ๊ฐ’)์€ mongosync ๊ฐ€ ๋Œ€์ƒ cluster์— ์ธ๋ฑ์Šค๋ฅผ ๋นŒ๋“œํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ธฐ์กด ์ธ๋ฑ์Šค์™€ ์†Œ์Šค cluster์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋™์•ˆ ์ƒ์„ฑ๋œ ๋ชจ๋“  ์ธ๋ฑ์Šค๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • never mongosync ๊ฐ€ ๋™๊ธฐํ™” ์ค‘์— ๋ถˆํ•„์š”ํ•œ ์ธ๋ฑ์Šค ๋นŒ๋“œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŠนํžˆ ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์€ ์›Œํฌ๋กœ๋“œ์˜ ๊ฒฝ์šฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ฒฝ๊ณ 

    mongosync ๊ฐ€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ์ธ๋ฑ์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋นŒ๋“œํ•˜์ง€ ๋งˆ์„ธ์š” . ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์™„์ „ํžˆ ์ปค๋ฐ‹๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

    ๋นŒ๋“œํ•˜๋Š” ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ•„์ˆ˜ ์ธ๋ฑ์Šค๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

/start buildIndexes ์ด(๊ฐ€) never ๋กœ ์„ค์ •๋˜๊ณ  reversible ์ด(๊ฐ€) true ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

buildIndexes ์˜ต์…˜์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  /start ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด mongosync ๊ฐ€ ๋Œ€์ƒ cluster์—์„œ ์ธ๋ฑ์Šค๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ 1.3.0์— ์ถ”๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

enableUserWriteBlocking
๋ถ€์šธ
์˜ต์…˜

true ๋กœ ์„ค์ •ํ•˜๋ฉด ๋™๊ธฐํ™”๊ฐ€ ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ๋Œ€์ƒ cluster์—์„œ ์“ฐ๊ธฐ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ ํด๋Ÿฌ์Šคํ„ฐ์— ๋™๊ธฐํ™”๊ฐ€ ์ปค๋ฐ‹๋˜๋ฉด ์›๋ž˜ ์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์“ฐ๊ธฐ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ๋Œ€์ƒ ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์“ฐ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์—ญ๋™๊ธฐํ™”ํ•˜๋ ค๋ฉด enableUserWriteBlocking ํ•„๋“œ๋ฅผ true ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์€ false ์ž…๋‹ˆ๋‹ค.

includeNamespaces
๋ฐฐ์—ด
์˜ต์…˜

๋™๊ธฐํ™”์— ํฌํ•จํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” collection์„ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๋Š” ์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ํ•„ํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ mongosync ๋Š” ํ•„ํ„ฐ ์ •์˜์— ์ง€์ •๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งŒ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. mongosync ์€(๋Š”) ๋‹ค๋ฅธ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•„ํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ถ”๊ฐ€ ํ•˜๋ ค๋ฉด ํ•„ํ„ฐ๋ง๋œ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ•„ํ„ฐ๋ง๋œ ๋™๊ธฐํ™”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ˜„์žฌ ์ œํ•œ ์‚ฌํ•ญ์€ ํ•„ํ„ฐ๋ง๋œ ๋™๊ธฐํ™”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฒ„์ „ 1.1์— ์ถ”๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

excludeNamespaces
๋ฐฐ์—ด
์˜ต์…˜

๋™๊ธฐํ™”์—์„œ ์ œ์™ธํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” collection์„ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๋Š” ์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ํ•„ํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ mongosync ๋Š” ํ•„ํ„ฐ ์ •์˜์— ์ง€์ •๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งŒ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. mongosync ์€(๋Š”) ๋‹ค๋ฅธ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•„ํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ถ”๊ฐ€ ํ•˜๋ ค๋ฉด ํ•„ํ„ฐ๋ง๋œ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ•„ํ„ฐ๋ง๋œ ๋™๊ธฐํ™”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ˜„์žฌ ์ œํ•œ ์‚ฌํ•ญ์€ ํ•„ํ„ฐ๋ง๋œ ๋™๊ธฐํ™”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฒ„์ „ 1.6์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

reversible
๋ถ€์šธ
์˜ต์…˜

true ๋กœ ์„ค์ •ํ•˜๋ฉด ๋™๊ธฐํ™” ์ž‘์—…์„ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ญ๋™๊ธฐํ™”ํ•˜๋ ค๋ฉด enableUserWriteBlocking ํ•„๋“œ๋ฅผ true ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ตฌ์„ฑ์—์„œ๋Š” ์ด ์˜ต์…˜์ด ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋ณต์ œ๋ณธ ์„ธํŠธ์—์„œ ์ƒค๋“œ cluster๋กœ ๋™๊ธฐํ™”

  • ์ƒค๋“œ ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์ƒค๋“œ ํด๋Ÿฌ์Šคํ„ฐ ๋™๊ธฐํ™”

  • buildIndexes ์ด(๊ฐ€) never(์œผ)๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ๋™๊ธฐํ™” ์ทจ์†Œ ๊ฐ€๋Šฅ

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ญ๋ฐฉํ–ฅ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ธฐ๋ณธ๊ฐ’์€ false ์ž…๋‹ˆ๋‹ค.

sharding
๋ฌธ์„œ
์˜ต์…˜

๋ณต์ œ๋ณธ ์„ธํŠธ์™€ ์ƒค๋“œ cluster ๊ฐ„์˜ ๋™๊ธฐํ™”๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ณต์ œ๋ณธ ์„ธํŠธ์—์„œ ์ƒค๋“œ cluster๋กœ ๋™๊ธฐํ™”ํ•˜๋ ค๋ฉด ์ด ์˜ต์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒค๋”ฉ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฒ„์ „ 1.1์— ์ถ”๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ 1.1์— ์ถ”๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณต์ œ๋ณธ ์„ธํŠธ์—์„œ shard cluster๋กœ ๋™๊ธฐํ™”ํ•˜๋ ค๋ฉด ๋Œ€์ƒ cluster์—์„œ collection์„ ์ƒค๋”ฉํ•˜๋Š” sharding ์˜ต์…˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

sharding ์˜ต์…˜์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜
์œ ํ˜•
์„ค๋ช…
createSupportingIndexes
๋ถ€์šธ
์„ ํƒ ์‚ฌํ•ญ. ์ƒค๋“œ ํ‚ค์— ๋Œ€ํ•œ ์ง€์› ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋™๊ธฐํ™” ์‹œ ํ•ด๋‹น ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false ์ž…๋‹ˆ๋‹ค.
shardingEntries
๋ฌธ์„œ ๋ฐฐ์—ด

ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๋™๊ธฐํ™” ์ค‘์— ์ƒค๋”ฉํ•  collection์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฐ ํ‚ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฐฐ์—ด์— ํฌํ•จ๋˜์ง€ ์•Š์€ collection์€ ๋Œ€์ƒ cluster์˜ ์ƒค๋”ฉ๋˜์ง€ ์•Š์€ collection๊ณผ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ๋นˆ ๋ฐฐ์—ด๋กœ ์„ค์ •ํ•˜๋ฉด collection์ด ์ƒค๋”ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

shardingEntries
.collection
๋ฌธ์ž์—ด
collection์„ ์ƒค๋”ฉ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
shardingEntries
.database
๋ฌธ์ž์—ด
์ƒค๋”ฉํ•  collection์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
shardingEntries
.shardCollection
๋ฌธ์„œ
๋Œ€์ƒ cluster์—์„œ ์ƒ์„ฑํ•  ์ƒค๋“œ ํ‚ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
shardingEntries
.shardCollection
.key
๋ฐฐ์—ด

์ƒค๋“œ ํ‚ค์— ์‚ฌ์šฉํ•  ํ•„๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒค๋“œ ํ‚ค๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

mongosync ๋ณต์ œ๋ณธ ์„ธํŠธ์—์„œ ์ƒค๋“œ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋™๊ธฐํ™”ํ•  ๋•Œ sharding ์˜ต์…˜์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜์ด ๋‹ค๋ฅธ ๊ตฌ์„ฑ๊ณผ ํ•จ๊ป˜ ์„ค์ •๋œ ๊ฒฝ์šฐmongosync ์—์„œ๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.sharding

ํ•„๋“œ
์œ ํ˜•
์„ค๋ช…
success
๋ถ€์šธ
์š”์ฒญ์ด ์„ฑ๊ณตํ•˜๋ฉด ์ด ๊ฐ’์€ true ์ž…๋‹ˆ๋‹ค.
error
๋ฌธ์ž์—ด
์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜์˜ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋Š” success ์ด true ์ธ ๊ฒฝ์šฐ ์‘๋‹ต์—์„œ ์ƒ๋žต๋ฉ๋‹ˆ๋‹ค.
errorDescription
๋ฌธ์ž์—ด
๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋Š” success ์ด true ์ธ ๊ฒฝ์šฐ ์‘๋‹ต์—์„œ ์ƒ๋žต๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ๋Š” cluster0 ์™€ cluster1 ๊ฐ„์— ๋™๊ธฐํ™” ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋Š” cluster0 ์ด๊ณ  ๋Œ€์ƒ ํด๋Ÿฌ์Šคํ„ฐ๋Š” cluster1 ์ž…๋‹ˆ๋‹ค.

curl localhost:27182/api/v1/start -XPOST \
--data '
{
"source": "cluster0",
"destination": "cluster1"
} '
{"success":true}

๋‹ค์Œ ์˜ˆ๋Š” cluster0 ์™€ cluster1 ๊ฐ„์— ๋™๊ธฐํ™” ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋Š” cluster0 ์ด๊ณ  ๋Œ€์ƒ ํด๋Ÿฌ์Šคํ„ฐ๋Š” cluster1 ์ž…๋‹ˆ๋‹ค.

reversible ๋ฐ enableUserWriteBlocking ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™๊ธฐํ™”๋ฅผ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐํ™” ๋ฐฉํ–ฅ์„ ๋ฐ˜์ „ํ•˜๋ ค๋ฉด ๋ฐ˜์ „์„ ์ฐธ์กฐํ•˜์„ธ์š” .

curl localhost:27182/api/v1/start -XPOST \
--data '
{
"source": "cluster0",
"destination": "cluster1",
"reversible": true,
"enableUserWriteBlocking": true
} '
{"success":true}

๋‹ค์Œ ์˜ˆ๋Š” cluster0 ์™€ cluster1 ๊ฐ„์— ๋™๊ธฐํ™” ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋Š” cluster0 ์ด๊ณ  ๋Œ€์ƒ ํด๋Ÿฌ์Šคํ„ฐ๋Š” cluster1 ์ž…๋‹ˆ๋‹ค.

cluster0 sales, marketing ๋ฐ engineering ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

sales ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” EMEA, APAC ๋ฐ AMER ์ปฌ๋ ‰์…˜์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ์˜ includeNamespaces ๋ฐฐ์—ด์€ sales ๋ฐ marketing ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ค‘ ๋‘ ๊ฐœ์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

sales ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” EMEA ๋ฐ APAC ์ปฌ๋ ‰์…˜๋„ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

"includeNamespaces" : [
{
"database" : "sales",
"collections": [ "EMEA", "APAC" ]
},
{
"database" : "marketing"
}
]

์ด ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•œ ์ƒํƒœ์—์„œ /start API๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ mongosync ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • marketing ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ชจ๋“  ์ปฌ๋ ‰์…˜์„ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • engineering ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•„ํ„ฐ๋ง

  • sales ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ EMEA ๋ฐ APAC ์ปฌ๋ ‰์…˜์„ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • AMER ์ปฌ๋ ‰์…˜์„ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

includeNamespaces ์˜ต์…˜์€ ํ•„ํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋ ค๋ฉด ํ•„ํ„ฐ๋ง๋œ ๋™๊ธฐํ™”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

curl -X POST "http://localhost:27182/api/v1/start" --data '
{
"source": "cluster0",
"destination": "cluster1",
"includeNamespaces": [
{
"database": "sales",
"collectionsRegex": {
"pattern": "^accounts_.+$",
"options": "i"
}
}, {
"database": "marketing"
}
]
} '
{"success":true}
curl localhost:27182/api/v1/start -XPOST \
--data '
{
"source": "cluster0",
"destination": "cluster1",
"sharding": {
"createSupportingIndexes": true,
"shardingEntries": [
{
"database": "accounts",
"collection": "us_east",
"shardCollection": {
"key": [
{ "location": 1 },
{ "region": 1 },
]
}
}
]
}
} '
{"success":true}

start ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜๋ฉด mongosync ์€(๋Š”) RUNNING ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ 1.1์— ์ถ”๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

mongosync ๊ฐ€ cluster์™€ ๋™๊ธฐํ™”๋˜๋ฉด ๋Œ€์ƒ cluster์—์„œ sharded collection์— ๋Œ€ํ•œ ์ฒญํฌ๋ฅผ ๋ฏธ๋ฆฌ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ ๊ตฌ์„ฑ์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค:

  • ๋ณต์ œ๋ณธ ์„ธํŠธ์—์„œ ์ƒค๋“œ cluster๋กœ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒค๋“œ ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์ƒค๋“œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ 1.1์— ์ถ”๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณต์ œ๋ณธ ์„ธํŠธ์—์„œ ์ƒค๋“œ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋™๊ธฐํ™”ํ•˜๋ ค๋ฉด sharding ์˜ต์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ mongosync ๊ฐ€ collection์„ ์ƒค๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

sharding.shardEntries ๋ฐฐ์—ด์€ ์ƒค๋”ฉํ•  collection์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฐ์—ด์— ๋‚˜์—ด๋˜์ง€ ์•Š์€ ์ปฌ๋ ‰์…˜์€ ๋น„์ƒค๋“œ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ณต์ œ๋ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ 1.1์— ์ถ”๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

mongosync ์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋Œ€์ƒ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณต์ œ๋ณธ ์„ธํŠธ์—์„œ ์ƒค๋“œ cluster๋กœ ๋™๊ธฐํ™”ํ•  ๋•Œ mongosync ์—๋Š” ์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์ƒค๋“œ ํ‚ค๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mongosync ๋™๊ธฐํ™” ์ค‘์— ์ƒค๋“œ collection์— ๋Œ€ํ•œ ์ง€์› ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ sharding.createSupportingIndexes ์˜ต์…˜์„ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

sharding.createSupportingIndexes ์ด false ์ธ ๊ฒฝ์šฐ(๊ธฐ๋ณธ๊ฐ’):

  • sharding.shardEntries ์˜ต์…˜์— ์ œ๊ณตํ•˜๋Š” ๊ฐ ์ƒค๋“œ ํ‚ค์—๋Š” ์†Œ์Šค cluster์— ๊ธฐ์กด ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • collection์—์„œ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ƒค๋“œ ํ‚ค์— ์‚ฌ์šฉ๋˜๋Š” ์ธ๋ฑ์Šค ์ค‘ ํ•˜๋‚˜์— ๋‹จ์ˆœ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒค๋“œ ํ‚ค์˜ ๊ณ ์œ  ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ณ ์œ ์„ฑ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ณ ์œ  ์ธ๋ฑ์Šค๊ฐ€ ๋Œ€์ƒ cluster์—์„œ ์š”์ฒญ๋œ ์ƒค๋“œ ํ‚ค์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ์š”์ฒญ๋œ ์ƒค๋“œ ํ‚ค๊ฐ€ ๋Œ€์ƒ์˜ ์ ‘๋‘์‚ฌ๋กœ ํฌํ•จ๋˜์ง€ ์•Š์€ ์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ณ ์œ  ์ธ๋ฑ์Šค๋กœ ์ธํ•ด mongosync ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sharding.createSupportingIndexes ์ด true ์ธ ๊ฒฝ์šฐ:

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

  • ์ง€์› ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ mongosync ๊ฐ€ ๋Œ€์ƒ cluster์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

sharding.createSupportingIndexes ์˜ต์…˜์€ ๋ชจ๋“  ์ƒค๋“œ collection์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

๋ฒ„์ „ 1.1์— ์ถ”๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณต์ œ๋ณธ ์„ธํŠธ์—์„œ cluster๋กœ ๋™๊ธฐํ™”ํ•  ๋•Œ sharding.shardEntries ๋ฐฐ์—ด์— ๋‚˜์—ด๋œ collection์€ ๋Œ€์ƒ cluster์—์„œ ์ƒค๋“œ collection์ด ๋ฉ๋‹ˆ๋‹ค.

start ๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ mongosync ๊ฐ€ ์ปฌ๋ ‰์…˜ ๋ณต์‚ฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์†Œ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ปฌ๋ ‰์…˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝ(์˜ˆ: renameCollection ๋ช…๋ น ์‚ฌ์šฉ)ํ•˜๋ฉด ๋Œ€์ƒ์—์„œ ์ปฌ๋ ‰์…˜ ์ƒค๋”ฉ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋ณต์ œ๋ณธ ์„ธํŠธ์—์„œ cluster๋กœ ๋™๊ธฐํ™”ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก collection ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

collection ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด progress ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  collectionCopy.estimatedCopiedBytes ๋ฐ˜ํ™˜ ๋ฌธ์„œ์—์„œ ํ•„๋“œ ๊ฐ’์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ’์ด 0์ด๋ฉด mongosync ์ด collection ๋ณต์‚ฌ๋ฅผ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

    ์ด ์ ์—์„œ collection ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์†Œ์Šค์— ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด ์ ์šฉ๋˜๊ธฐ ์ „์— ๋ณต์‚ฌ๋กœ์˜ ์ „ํ™˜์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋Œ€์ƒ cluster์— collection์ด ์ƒค๋”ฉ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‚จ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • 0๋ณด๋‹ค ํฐ ๊ฐ’์€ mongosync ์—์„œ ๋ณต์‚ฌ๋ฅผ ์‹œ์ž‘ํ–ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ์ ๋ถ€ํ„ฐ collection์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•ด๋„ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์—๋„ ๋Œ€์ƒ cluster์—์„œ ํ•ด๋‹น ์ƒค๋”ฉ์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

buildIndexes ์˜ต์…˜์„ never ๋กœ ์„ค์ •ํ•˜์—ฌ /start ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด mongosync ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ์ธ๋ฑ์Šค ์ž‘์„ฑ์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

ํ•ญ์ƒ ๋นŒ๋“œ๋˜๋Š” ์ธ๋ฑ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • mongosync ๋ณต์‚ฌํ•˜๋Š” ๋ชจ๋“  collection์˜ _id ํ•„๋“œ์— ์ธ๋ฑ์Šค๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

  • mongosync ์ปค๋ฐ‹ ํ›„ ์ œ๊ฑฐ๋˜๋Š” ๊ฐ ์ƒค๋“œ collection์˜ ์ƒค๋“œ ํ‚ค๋ฅผ ์ง€์›ํ•˜๋Š”๋”๋ฏธ ์ธ๋ฑ์Šค๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. buildIndexes ์„ never ๋กœ ์„ค์ •ํ•˜๋ฉด mongosync ๋Š” ์ปค๋ฐ‹ ํ›„์—๋„ ์ด ์ธ๋ฑ์Šค๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

mongosync start ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋ณดํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ API๋Š” ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์—๋งŒ ๋ฐ”์ธ๋”ฉ๋˜๋ฉฐ ๋‹ค๋ฅธ ์†Œ์Šค์˜ ํ˜ธ์ถœ์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ start ํ˜ธ์ถœ์€ ์—ฐ๊ฒฐ ์ž๊ฒฉ ์ฆ๋ช…์ด๋‚˜ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โ†ย mongosync API ์—”๋“œํฌ์ธํŠธ
progressย โ†’