๋ณต์ ์ธํธ ํ์ผ์ค๋ฒ ์ค ๋กค๋ฐฑ
์ด ํ์ด์ง์ ๋ด์ฉ
๋กค๋ฐฑ์ ์ฅ์ ์กฐ์น ํ ๊ตฌ์ฑ์์ด ๋ณต์ ๋ณธ ์ธํธ์ ๋ค์ ์ฐธ์ฌํ ๋ ์ด์ ๊ธฐ๋ณธ ๊ตฌ์ฑ์์ ๋ํ ์ฐ๊ธฐ ์์ ์ ๋๋๋ฆฝ๋๋ค. ๋กค๋ฐฑ์ ํ๋ผ์ด๋จธ๋ฆฌ๊ฐ ๋ฌผ๋ฌ๋๊ธฐ ์ ์ ์ธ์ปจ๋๋ฆฌ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ณต์ ํ์ง ๋ชปํ ์ฐ๊ธฐ ์์ ์ ํ๋ผ์ด๋จธ๋ฆฌ๊ฐ ์๋ฝํ ๊ฒฝ์ฐ์๋ง ํ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ด ๋ณด์กฐ๋ก ์ธํธ์ ๋ค์ ํฉ๋ฅํ๋ฉด ์ฐ๊ธฐ ์์ ์ ๋๋๋ฆฌ๊ฑฐ๋ "๋กค๋ฐฑ"ํ์ฌ ๋ค๋ฅธ ๊ตฌ์ฑ์๊ณผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ผ๊ด์ฑ์ ์ ์งํฉ๋๋ค.
MongoDB๋ ๋กค๋ฐฑ์ ํผํ๋ ค๊ณ ์๋ํ๋๋ฐ, ์ด๋ ๋๋ฌธ ๊ฒฝ์ฐ์ ๋๋ค. ๋กค๋ฐฑ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋คํธ์ํฌ ํํฐ์ ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด์ ๊ธฐ๋ณธ์ ์์ ์ฒ๋ฆฌ๋์ ๋ฐ๋ผ์ก์ ์ ์๋ ๋ณด์กฐ๋ ๋กค๋ฐฑ์ ํฌ๊ธฐ์ ์ํฅ์ ์ฆ๊ฐ์ํต๋๋ค.
์ฐ๊ธฐ ์์ ์ด ๊ธฐ๋ณธ ๊ตฌ์ฑ์์ด ๋ด๋ ค๊ฐ๊ธฐ ์ ์ ๋ณต์ ๋ณธ ์ธํธ์ ๋ค๋ฅธ ๊ตฌ์ฑ์์ผ๋ก ๋ณต์ ๋๊ณ ํด๋น ๊ตฌ์ฑ์์ด ๋ณต์ ๋ณธ ์ธํธ์ ๋๋ถ๋ถ์์ ๊ณ์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ์ก์ธ์คํ ์ ์๋ ๊ฒฝ์ฐ ๋กค๋ฐฑ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
๋กค๋ฐฑ ๋ฐ์ดํฐ ์์ง
๋กค๋ฐฑ ๋ฐ์ดํฐ ๊ตฌ์ฑ
createRollbackDataFiles
๋งค๊ฐ ๋ณ์๋ ๋กค๋ฐฑ ์ค์ ๋กค๋ฐฑ ํ์ผ์ ์์ฑํ ์ง ์ฌ๋ถ๋ฅผ ์ ์ดํฉ๋๋ค.
Rollback Data
๊ธฐ๋ณธ์ ์ผ๋ก ๋กค๋ฐฑ์ด ๋ฐ์ํ๋ฉด MongoDB๋ ๋กค๋ฐฑ ๋ฐ์ดํฐ๋ฅผ BSON ํ์ผ์ ์๋๋ค.
๋ฐ์ดํฐ๊ฐ ๋กค๋ฐฑ๋๋ ๊ฐ ์ปฌ๋ ์
์ ๋ํด ๋กค๋ฐฑ ํ์ผ์ <dbpath>/rollback/<collectionUUID>
๋๋ ํ ๋ฆฌ์ ์์ผ๋ฉฐ ํ์ผ ์ด๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
removed.<timestamp>.bson
์๋ฅผ ๋ค์ด reporting
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปฌ๋ ์
comments
์ ๋ํ ๋ฐ์ดํฐ๊ฐ ๋กค๋ฐฑ๋ ๊ฒฝ์ฐ:
<dbpath>/rollback/20f74796-d5ea-42f5-8c95-f79b39bad190/removed.2020-02-19T04-57-11.0.bson
์ฌ๊ธฐ์ <dbpath>
์ mongod
์ dbPath
์
๋๋ค.
ํ
์ปฌ๋ ์ ์ด๋ฆ
์ปฌ๋ ์
์ด๋ฆ์ ์ป์ผ๋ ค๋ฉด MongoDB ๋ก๊ทธ์์ rollback file
์ ๊ฒ์ํ๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ก๊ทธ ํ์ผ์ด /var/log/mongodb/mongod.log
์ธ ๊ฒฝ์ฐ grep
๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์์ "rollback file"
์ ์ธ์คํด์ค๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
grep "rollback file" /var/log/mongodb/mongod.log
๋๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐ๋ณตํ์ฌ ์ผ์นํ๋ ํญ๋ชฉ์ด ๋์ฌ ๋๊น์ง ํน์ UUID์ ๋ํด db.getCollectionInfos()
๋ฅผ ์คํํ ์ ์์ต๋๋ค. ์์:
var mydatabases=db.adminCommand("listDatabases").databases; var foundcollection=false; for (var i = 0; i < mydatabases.length; i++) { let mdb = db.getSiblingDB(mydatabases[i].name); collections = mdb.getCollectionInfos( { "info.uuid": UUID("20f74796-d5ea-42f5-8c95-f79b39bad190") } ); for (var j = 0; j < collections.length; j++) { // Array of 1 element foundcollection=true; print(mydatabases[i].name + '.' + collections[j].name); break; } if (foundcollection) { break; } }
๋ฐ์ดํฐ ๋กค๋ฐฑ ์ ์ธ
๋กค๋ฐฑ ์์ ์ด ์ปฌ๋ ์ ์ ๊ฑฐ ๋๋ ๋ฌธ์ ์ญ์ ์ธ ๊ฒฝ์ฐ ์ปฌ๋ ์ ์ ๊ฑฐ ๋๋ ๋ฌธ์ ์ญ์ ์ ๋กค๋ฐฑ์ ๋กค๋ฐฑ ๋ฐ์ดํฐ ๋๋ ํฐ๋ฆฌ์ ๊ธฐ๋ก๋์ง ์์ต๋๋ค.
๊ฒฝ๊ณ
์ฐ๊ธฐ ์์
์ด { w: 1 }
์ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฐ๊ธฐ ์์
์ด ์๋ฃ๋๊ธฐ ์ ์ ํ๋ผ์ด๋จธ๋ฆฌ๊ฐ ๋ค์ ์์๋๋ฉด ๋กค๋ฐฑ ๋๋ ํ ๋ฆฌ๋ oplog hole ์ดํ์ ์ ์ถ๋ ์ฐ๊ธฐ๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
๋กค๋ฐฑ ๋ฐ์ดํฐ ์ฝ๊ธฐ
๋กค๋ฐฑ ํ์ผ์ ๋ด์ฉ์ ์ฝ์ผ๋ ค๋ฉด bsondump
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ด๋ฆฌ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ด์ฉ๊ณผ ์ง์์ ๋ฐํ์ผ๋ก ์ทจํ ๋ค์ ์กฐ์น๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
๋ณต์ ์ธํธ ๋กค๋ฐฑ ๋ฐฉ์ง
๋ณต์ ๋ณธ ์ธํธ์ ๊ฒฝ์ฐ ์ฐ๊ธฐ ๊ณ ๋ ค { w: 1 }
์ ํ๋ผ์ด๋จธ๋ฆฌ์์์ ์ฐ๊ธฐ ์์
์น์ธ๋ง ์ ๊ณตํฉ๋๋ค. ์ฐ๊ธฐ ์์
์ด ์ธ์ปจ๋๋ฆฌ์ ๋ณต์ ๋๊ธฐ ์ ์ ํ๋ผ์ด๋จธ๋ฆฌ๊ฐ ๊ฐ๋ฑ๋์์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ๋กค๋ฐฑ๋ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ { w: 1 }
์ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ฌ์ฉํ์ฌ ์ปค๋ฐํ๋ ๋ค์ค ๋ฌธ์ ํธ๋์ญ์
์ ์ฐ์ฌ์ง ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค.
์ ๋๋ง ๋ฐ ์ฐ๊ธฐ ๊ณ ๋ ค majority
ํด๋ผ์ด์ธํธ์ ์น์ธ๋ ๋ฐ์ดํฐ์ ๋กค๋ฐฑ์ ๋ฐฉ์งํ๋ ค๋ฉด ์ ๋๋ง์ ํ์ฑํํ ์ํ์์ ๋ชจ๋ ํฌํ ๋ ธ๋๋ฅผ ์คํํ๊ณ { w: "majority" } ์ฐ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ธฐ ์์ ์ด ์คํํ๋ ํด๋ผ์ด์ธํธ์ ์น์ธ๊ณผ ํจ๊ป ๋ฐํ๋๊ธฐ ์ ์ ๋ณต์ ๋ณธ ์ธํธ ๋ ธ๋์ ๊ณผ๋ฐ์๋ก ์ ํ๋๋๋ก ํฉ๋๋ค.
MongoDB 5.0๋ถํฐ { w: "majority" }
๋ ๋๋ถ๋ถ์ MongoDB ๋ฐฐํฌ์ ๋ํ ๊ธฐ๋ณธ ์ฐ๊ธฐ ๋ฌธ์ ์
๋๋ค. Implicit Default Write Concern์ ์ฐธ์กฐํ์ญ์์ค.
writeConcernMajorityJournalDefault
๋ฅผ false
๋ก ์ค์ ํ๋ฉด MongoDB๋ w: "majority"
์ฐ๊ธฐ๊ฐ ๋์คํฌ ์ ๋์ ์์ฑ๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฐ๊ธฐ๋ฅผ ํ์ธํฉ๋๋ค. ๋ฐ๋ผ์ ์ฃผ์ด์ง ๋ณต์ ๋ณธ ์ธํธ์ ๋
ธ๋ ๊ณผ๋ฐ์ ์ด์์ด ์ผ์์ ์ผ๋ก ์์ค๋ ๊ฒฝ์ฐ(์ถฉ๋, ์ฌ์์ ๋ฑ), "majority"
์ฐ๊ธฐ ์์
์ด ๋กค๋ฐฑ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๋กค๋ฐฑ ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ ๋ํ ๊ฐ์์ฑ ํ๋ณด
์ฐ๊ธฐ์ ์ฐ๊ธฐ ๊ณ ๋ ค์ ๊ด๊ณ์์ด
"local"
๋๋"available"
์ฝ๊ธฐ ๊ณ ๋ ค๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๋ ์ฐ๊ธฐ ์์ ์ด ์คํ ํด๋ผ์ด์ธํธ์ ์น์ธ๋๊ธฐ ์ ์ ์ฐ๊ธฐ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค."local"
"available"
2} ๋๋ ์ฝ๊ธฐ ์ฐ๋ ค๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ ๋ณต์ ๋ณธ ์ธํธ ์ฅ์ ์กฐ์น ์ค์ ๋์ค์ ๋กค๋ฐฑ๋ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
๋ค์ค ๋ฌธ์ ํธ๋์ญ์ ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๋ฉด ํธ๋์ญ์ ์์ ์ด๋ฃจ์ด์ง ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฅ๋๊ณ ํธ๋์ญ์ ์ธ๋ถ์์ ๋ณผ ์ ์์ต๋๋ค. ์ฆ, ํธ๋์ญ์ ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๋กค๋ฐฑํ๋ ๋์ ์ผ๋ถ ๋ณ๊ฒฝ ์ฌํญ์ ์ปค๋ฐํ์ง ์์ต๋๋ค.
ํธ๋์ญ์ ์ด ์ปค๋ฐ๋ ๋๊น์ง ํธ๋์ญ์ ์์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ ํธ๋์ญ์ ์ธ๋ถ์ ํ์๋์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํธ๋์ญ์
์ด ์ฌ๋ฌ ์ค๋์ ์ฐ๊ธฐ๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ, ๋ชจ๋ ์ธ๋ถ ์ฝ๊ธฐ ์์
์ด ์ปค๋ฐ๋ ํธ๋์ญ์
์ ๊ฒฐ๊ณผ๊ฐ ์ค๋ ์ ์ฒด์ ํ์๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ํ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํธ๋์ญ์
์ด ์ปค๋ฐ๋๊ณ ์ฐ๊ธฐ 1์ด ์ค๋ A์ ํ์๋์ง๋ง ์ฐ๊ธฐ 2๊ฐ ์ค๋ B์ ์์ง ํ์๋์ง ์๋ ๊ฒฝ์ฐ, ์ฝ๊ธฐ ๊ณ ๋ ค "local"
์ ์ธ๋ถ ์ฝ๊ธฐ๋ ์ฐ๊ธฐ 2๋ฅผ ๋ณด์ง ์๊ณ ์ฐ๊ธฐ 1์ ๊ฒฐ๊ณผ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
๋กค๋ฐฑ ๊ณ ๋ ค ์ฌํญ
์ฌ์ฉ์ ์์
๋ฒ์ 4.2๋ถํฐ MongoDB๋ ๋ฉค๋ฒ๊ฐ ROLLBACK
์ํ์ ๋ค์ด๊ฐ๋ฉด ์งํ ์ค์ธ ๋ชจ๋ ์ฌ์ฉ์ ์์
์ ์ข
๋ฃํฉ๋๋ค.
์ธ๋ฑ์ค ๋น๋
๊ธฐ๋ฅ ํธํ์ฑ ๋ฒ์ (fcv)
"4.2"
์ ๊ฒฝ์ฐ, MongoDB๋ ๋กค๋ฐฑ์ ์์ํ๊ธฐ ์ ์ ์งํ ์ค์ธ ์ธ๋ฑ์ค ๋น๋๊ฐ ๋ชจ๋ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
์ธ๋ฑ์ค ๋น๋ ํ๋ก์ธ์ค์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฑ์์ง ์ปฌ๋ ์ ์ ์ธ๋ฑ์ค ๋น๋๋ฅผ์ฐธ์กฐํ์ธ์.
"majority"
์ฝ๊ธฐ ๊ณ ๋ ค๊ฐ ๋นํ์ฑํ๋์์ ๋ ์ธ๋ฑ์ค ์์
"majority"
์ฝ๊ธฐ ๋ฌธ์ ๋ฅผ ๋นํ์ฑํํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์์ ํ๋ collMod
๋ช
๋ น์ด ๋กค๋ฐฑ๋์ง ์์ต๋๋ค. ์ด๋ฌํ ์์
์ ๋กค๋ฐฑํด์ผ ํ๋ ๊ฒฝ์ฐ ์ํฅ์ ๋ฐ๋ ๋
ธ๋๋ฅผ ํ๋ผ์ด๋จธ๋ฆฌ ๋
ธ๋์ ๋ค์ ๋๊ธฐํํด์ผ ํฉ๋๋ค.
ํฌ๊ธฐ ์ ํ
MongoDB๋ ํฌ๊ธฐ ์ ํ์ด ๋ค๋ฅธ ๋ค์ ๋กค๋ฐฑ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ํฉ๋๋ค.
ํ์์คํฌํ๋ก ๋ณต๊ตฌํ๋ฉด ์ด์ ํ๋ผ์ด๋จธ๋ฆฌ๊ฐ ์ผ๊ด๋ ์์ ์ผ๋ก ๋๋์๊ฐ ๋๊ธฐํ ์์ค์ ๊ธฐ๋ก๋ ๋ถ๊ธฐ๋ฅผ ๋ฐ๋ผ์ก์ ๋๊น์ง ์์ ์ ์ ์ฉํฉ๋๋ค. ์ด๊ฒ์ด ๊ธฐ๋ณธ ๋กค๋ฐฑ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ๋ MongoDB๋ ๋กค๋ฐฑํ ์ ์๋ ๋ฐ์ดํฐ์ ์์ ์ ํํ์ง ์์ต๋๋ค.
๋ค์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ํตํ ๋กค๋ฐฑ์ ์ด์ ํ๋ผ์ด๋จธ๋ฆฌ๊ฐ ์์ ์ oplog์ ๋๊ธฐํ ์์ค์ oplog ์ฌ์ด์ ๊ณตํต์ ์ ์ฐพ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ ธ๋๋ ์ด ๊ณตํต์ ์ ๋๋ฌํ ๋๊น์ง ํด๋น oplog์ ๋ชจ๋ ์์ ์ ๊ฒ์ฌํ๊ณ ๋๋๋ฆฝ๋๋ค. ๋ค์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ํตํ ๋กค๋ฐฑ์ ๊ตฌ์ฑ ํ์ผ์
enableMajorityReadConcern
์ค์ ์ดfalse
๋ก ์ค์ ๋ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํฉ๋๋ค.์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ๋ MongoDB๋ ์ต๋ 300MB์ ๋ฐ์ดํฐ๋ง ๋กค๋ฐฑํ ์ ์์ต๋๋ค.
์ฐธ๊ณ
MongoDB 5.0๋ถํฐ
enableMajorityReadConcern
์true
๋ก ์ค์ ๋๋ฉฐ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋กค๋ฐฑ ๊ฒฝ๊ณผ ์๊ฐ ์ ํ
๋กค๋ฐฑ ์๊ฐ ์ ํ์ ๊ธฐ๋ณธ๊ฐ์ด 24์๊ฐ์ด๋ฉฐ rollbackTimeLimitSecs
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
MongoDB๋ ๊ฒฝ๊ณผ ์๊ฐ์ oplogs์ ์ฒซ ๋ฒ์งธ ๊ณตํต ์กฐ์๊ณผ ๋กค๋ฐฑ ์ค์ธ ๋ฉค๋ฒ์ oplog์ ๋ง์ง๋ง ํญ๋ชฉ ์ฌ์ด์ ์๊ฐ์ผ๋ก ์ธก์ ํฉ๋๋ค.