$changeStreamSplitLargeEvent (์ง๊ณ)
์ ์
MongoDB 7.0(๋ฐ 6.0.9)์ ์๋ก์ด ๊ธฐ๋ฅ
๋ณ๊ฒฝ ์คํธ๋ฆผ ์ 16 MB๋ฅผ ์ด๊ณผํ๋ ๋๊ท๋ชจ ์ด๋ฒคํธ๊ฐ ์๋ ๊ฒฝ์ฐ BSONObjectTooLarge
์์ธ๊ฐ ๋ฐํ๋ฉ๋๋ค. MongoDB 7.0 (๋ฐ 6.0.9)๋ถํฐ๋ $changeStreamSplitLargeEvent
๋จ๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ๋ฅผ ๋ ์์ ์กฐ๊ฐ์ผ๋ก ๋ถํ ํ ์ ์์ต๋๋ค.
๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ง $changeStreamSplitLargeEvent
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฒด ๋ฌธ์ ์ฌ์ ๋๋ ์ฌํ ์ด๋ฏธ์ง๊ฐ ํ์ํ๊ณ 16MB๋ฅผ ์ด๊ณผํ๋ ํฐ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ, $changeStreamSplitLargeEvent
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
$changeStreamSplitLargeEvent
์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ธฐ ์ ์ ๋จผ์ ๋ณ๊ฒฝ ์ด๋ฒคํธ ํฌ๊ธฐ๋ฅผ ์ค์ฌ์ผ ํฉ๋๋ค. ์๋ฅผ ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ ๋๋ ์ฌํ ์ด๋ฏธ์ง๊ฐ ํ์ํ์ง ์๋ ํ ๋ฌธ์ ์ฌ์ ๋๋ ์ฌํ ์ด๋ฏธ์ง๋ฅผ ์์ฒญํ์ง ๋ง์ธ์. ์ด๋ ๊ฒ ํ๋ฉด
fullDocument
๋ฐfullDocumentBeforeChange
ํ๋๊ฐ ๋ ๋ง์ด ์์ฑ๋๋ฉฐ, ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ณ๊ฒฝ ์ด๋ฒคํธ์์ ๊ฐ์ฅ ํฐ ๊ฐ์ฒด์ ๋๋ค.์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ํ๋๋ง ํฌํจํ๋ ค๋ฉด
$project
๋จ๊ณ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ณ๊ฒฝ ์ด๋ฒคํธ ํฌ๊ธฐ๊ฐ ์ค์ด๋ค๊ณ ํฐ ์ด๋ฒคํธ๋ฅผ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋ถํ ํ๋ ๋ฐ ์ถ๊ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ๋ฐฐ์น์์ ๋ ๋ง์ ๋ณ๊ฒฝ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
ํ์ดํ๋ผ์ธ์๋ $changeStreamSplitLargeEvent
๋จ๊ณ๋ฅผ ํ๋๋ง ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์ด ๋จ๊ณ๋ ๋ฐ๋์ ๋ง์ง๋ง ๋จ๊ณ์ฌ์ผ ํฉ๋๋ค. $changeStream
ํ์ดํ๋ผ์ธ์์๋ $changeStreamSplitLargeEvent
๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
$changeStreamSplitLargeEvent
๊ตฌ๋ฌธ:
{ $changeStreamSplitLargeEvent: {} }
ํ๋
$changeStreamSplitLargeEvent
16 MB๋ฅผ ์ด๊ณผํ๋ ์ด๋ฒคํธ๋ฅผ ํ๋๊ทธ๋จผํธ๋ก ๋ถํ ํ๊ณ ๋ณ๊ฒฝ ์คํธ๋ฆผ ์ปค์ ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋๊ทธ๋จผํธ๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ฐํํฉ๋๋ค.
ํ๋๊ทธ๋จผํธ๋ ์ฒซ ๋ฒ์งธ ํ๋๊ทธ๋จผํธ์์ ์ต๋ ๊ฐ์์ ํ๋๊ฐ ๋ฐํ๋๋๋ก ๋ถํ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฒคํธ ์ปจํ ์คํธ๊ฐ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ๋ฐํ๋ฉ๋๋ค.
๋ณ๊ฒฝ ์ด๋ฒคํธ๊ฐ ๋ถํ ๋๋ฉด ์ต์์ ํ๋ ํฌ๊ธฐ๋ง ์ฌ์ฉ๋ฉ๋๋ค. $changeStreamSplitLargeEvent
๋ ํ์ ๋ฌธ์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ถํ ํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด $project
๋จ๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๊ธฐ๊ฐ 20 MB์ธ ๋จ์ผ ํ๋๊ฐ ์๋ ๋ณ๊ฒฝ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ์ด๋ฒคํธ๊ฐ ๋ถํ ๋์ง ์๊ณ ๋จ๊ณ์์ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
๊ฐ ์กฐ๊ฐ์๋ ์ฌ๊ฐ ํ ํฐ์ด ์์ต๋๋ค. ์กฐ๊ฐ์ ํ ํฐ์ ์ฌ์ฉํ์ฌ ์คํธ๋ฆผ์ด ์ฌ๊ฐ๋๋ฉด ๋ค์ ์ค ํ๋๋ฅผ ์ํํฉ๋๋ค.
ํ์ ํ๋๊ทธ๋จผํธ์์ ์ ์คํธ๋ฆผ ์ ์์ํฉ๋๋ค.
์ํ์ค์ ๋ง์ง๋ง ์กฐ๊ฐ์์ ์ฌ๊ฐํ๋ ๊ฒฝ์ฐ ๋ค์ ์ด๋ฒคํธ๋ถํฐ ์์ํฉ๋๋ค.
์ด๋ฒคํธ ์ ๊ฐ ํ๋๊ทธ๋จผํธ์๋ splitEvent
๋ฌธ์ ๊ฐ ํฌํจ๋ฉ๋๋ค.
splitEvent: { fragment: <int>, of: <int> }
๋ค์ ํ์์๋ ํ๋์ ๋ํด ์ค๋ช ํฉ๋๋ค.
ํ๋ | ์ค๋ช
|
---|---|
| 1 ์์ ์์ํ๋ ํ๋๊ทธ๋จผํธ ์ธ๋ฑ์ค ์ ๋๋ค. |
| ์ด๋ฒคํธ์ ๋ํ ์ด ์กฐ๊ฐ ์์ ๋๋ค. |
์์
์ด ์น์
์ ์์ ์๋๋ฆฌ์ค์์๋ myCollection
์ด๋ผ๋ ์ ์ปฌ๋ ์
๊ณผ ํจ๊ป $changeStreamSplitLargeEvent
์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ์ค๋๋ค.
myCollection
์ ๋ง๋ค๊ณ ๋ฐ์ดํฐ๊ฐ 16 MB ๋ฏธ๋ง์ธ ๋ฌธ์ ํ๋๋ฅผ ์ฝ์
ํฉ๋๋ค.
db.myCollection.insertOne( { _id: 0, largeField: "a".repeat( 16 * 1024 * 1024 - 1024 ) } )
largeField
๋ฐ๋ณต๋๋ ๋ฌธ์ a
์ ํฌํจํฉ๋๋ค.
myCollection
์ changeStreamPreAndPostImages๋ฅผ ํ์ฑํํ๋ฉด ๋ณ๊ฒฝ ์คํธ๋ฆผ์ด ์
๋ฐ์ดํธ ์ (์ฌ์ ์ด๋ฏธ์ง)๊ณผ ์
๋ฐ์ดํธ ํ(์ฌํ ์ด๋ฏธ์ง)์ ๋ฌธ์๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
db.runCommand( { collMod: "myCollection", changeStreamPreAndPostImages: { enabled: true } } )
๋ณ๊ฒฝ ์คํธ๋ฆผ ์ปค์ ๋ฅผ ์์ฑํ์ฌ db.collection.watch()
์ ์ฌ์ฉํ์ฌ myCollection
์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ชจ๋ํฐ ํฉ๋๋ค.
myChangeStreamCursor = db.myCollection.watch( [ { $changeStreamSplitLargeEvent: {} } ], { fullDocument: "required", fullDocumentBeforeChange: "required" } )
๋ณ๊ฒฝ ์คํธ๋ฆผ ์ด๋ฒคํธ์ ๊ฒฝ์ฐ:
fullDocument: "required"
๋ฌธ์ ํฌ์คํธ ์ด๋ฏธ์ง๊ฐ ํฌํจ๋ฉ๋๋ค.fullDocumentBeforeChange: "required"
๋ ๋ฌธ์ ์ฌ์ ์ด๋ฏธ์ง๋ฅผ ํฌํจํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ $changeStream
๋ฅผ ์ฐธ์กฐํ์ธ์.
myCollection
์์ ๋ฌธ์ ๋ฅผ ์
๋ฐ์ดํธํ๋ฉด ๋ฌธ์ ์ฌ์ ๋ฐ ์ฌํ ์ด๋ฏธ์ง๋ก ๋ณ๊ฒฝ ์คํธ๋ฆผ ์ด๋ฒคํธ ๋ ์์ฑ๋ฉ๋๋ค.
db.myCollection.updateOne( { _id: 0 }, { $set: { largeField: "b".repeat( 16 * 1024 * 1024 - 1024 ) } } )
largeField
์ด์ ๋ฐ๋ณต๋๋ ๋ฌธ์ b
์ ํฌํจํฉ๋๋ค.
next()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ myChangeStreamCursor
์์ ์กฐ๊ฐ์ ๊ฒ์ํ๊ณ firstFragment
, secondFragment
๋ฐ thirdFragment
๋ผ๋ ๊ฐ์ฒด์ ์กฐ๊ฐ์ ์ ์ฅํฉ๋๋ค.
const firstFragment = myChangeStreamCursor.next() const secondFragment = myChangeStreamCursor.next() const thirdFragment = myChangeStreamCursor.next()
firstFragment.splitEvent
ํ์:
firstFragment.splitEvent
ํ๋๊ทธ๋จผํธ ์ธ๋ถ ์ ๋ณด๊ฐ ํฌํจ๋ ์ถ๋ ฅ:
splitEvent: { fragment: 1, of: 3 }
๋ง์ฐฌ๊ฐ์ง๋ก secondFragment.splitEvent
๋ฐ thirdFragment.splitEvent
๋ ๋ค์์ ๋ฐํํฉ๋๋ค.
splitEvent: { fragment: 2, of: 3 } splitEvent: { fragment: 3, of: 3 }
firstFragment
์ ๋ํ ๊ฐ์ฒด ํค๋ฅผ ๊ฒ์ฌํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
Object.keys( firstFragment )
์ถ๋ ฅ:
[ '_id', 'splitEvent', 'wallTime', 'clusterTime', 'operationType', 'documentKey', 'ns', 'fullDocument' ]
firstFragment.fullDocument
์ ํฌ๊ธฐ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ๊ฒ์ฌํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
bsonsize( firstFragment.fullDocument )
์ถ๋ ฅ:
16776223
secondFragment
์๋ ํฌ๊ธฐ๊ฐ ์ฝ 16MB์ธ fullDocumentBeforeChange
์ฌ์ ์ด๋ฏธ์ง๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋ค์ ์๋ secondFragment
์ ๋ํ ๊ฐ์ฒด ํค๋ฅผ ๋ณด์ฌ์ค๋๋ค.
Object.keys( secondFragment )
์ถ๋ ฅ:
[ '_id', 'splitEvent', 'fullDocumentBeforeChange' ]
thirdFragment
์ฝ 16MB ํฌ๊ธฐ์ updateDescription
ํ๋๋ฅผ ํฌํจํฉ๋๋ค. ๋ค์ ์๋ thirdFragment
์ ๋ํ ๊ฐ์ฒด ํค๋ฅผ ๋ณด์ฌ์ค๋๋ค.
Object.keys( thirdFragment )
์ถ๋ ฅ:
[ '_id', 'splitEvent', 'updateDescription' ]
change stream ๋ฐ ์ด๋ฒคํธ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ณ๊ฒฝ ์ด๋ฒคํธ๋ฅผ ์ฐธ์กฐํ์ธ์.