Skip to main content

Command Palette

Search for a command to run...

InnoDB ๋ฒ„ํผ ํ’€๊ณผ Double Write Buffer

Real MySQL 8.0 ์Šคํ„ฐ๋””-4

Updated
โ€ข5 min read
InnoDB ๋ฒ„ํผ ํ’€๊ณผ Double Write Buffer
๐Ÿ’ก
์ด ๊ธ€์€ Real MySQL 8.0๊ณผ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

1. InnoDB ๋ฒ„ํผ ํ’€

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์œผ๋กœ, ๋””์Šคํฌ์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์ด๋‚˜ ์ธ๋ฑ์Šค ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œํ•ด ๋‘๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ์ž‘์—…์„ ์ง€์—ฐ์‹œ์ผœ ์ผ๊ด„ ์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฒ„ํผ ์—ญํ• ๋„ ๊ฐ™์ด ํ•ฉ๋‹ˆ๋‹ค.

1.1. ๋ฒ„ํผ ํ’€์˜ ํฌ๊ธฐ ์„ค์ •

MySQL 5.7 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” InnoDB ๋ฒ„ํผ ํ’€์˜ ํฌ๊ธฐ๋ฅผ ๋™์ ์œผ๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ฐœ์„ ๋์œผ๋ฏ€๋กœ, ํฌ๊ธฐ๋ฅผ ์ ์ ˆํžˆ ์ž‘์€ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ ๋‹ค์Œ ์กฐ๊ธˆ์”ฉ ์ƒํ™ฉ์„ ๋ด ๊ฐ€๋ฉด์„œ ์ฆ๊ฐ€๋ฅผ ์‹œํ‚ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฑ…์—์„œ ์ œ์‹œํ•˜๋Š” ๊ถŒ์žฅ์•ˆ์€ OS์˜ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด 8GB ๋ฏธ๋งŒ์ด๋ผ๋ฉด 50% ์ •๋„๋งŒ InnoDB ๋ฒ„ํผ ํ’€๋กœ ์„ค์ •ํ•˜๊ณ , ๊ทธ ์ด์ƒ์ด๋ผ๋ฉด 50%์—์„œ ์‹œ์ž‘ํ•ด ์กฐ๊ธˆ์”ฉ ์˜ฌ๋ ค๊ฐ€๋ฉด์„œ ์ตœ์ ์ ์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

InnoDB ๋ฒ„ํผ ํ’€์€ innodb_buffer_pool_size ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋กœ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-- // InnoDB ๋ฒ„ํผ ํ’€ ํฌ๊ธฐ ํ™•์ธ
mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ๋ฒ„ํผ ํ’€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์“ฐ์ด๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-- // InnoDB ๋ฒ„ํผ ํ’€ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ํ™•์ธ
mysql> SHOW STATUS LIKE 'Innodb_buffer_pool%';

์‹ค์ œ๋กœ ์šด์˜ ์‹œ ๋ฒ„ํผ ํ’€์˜ ํฌ๊ธฐ๋ฅผ ๋” ํฌ๊ฒŒ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์€ ์‹œ์Šคํ…œ ์˜ํ–ฅ๋„๊ฐ€ ํฌ์ง€ ์•Š์ง€๋งŒ, ๋ฒ„ํผ ํ’€์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์ž‘์—…์€ ์„œ๋น„์Šค ์˜ํ–ฅ๋„๊ฐ€ ๋งค์šฐ ํฝ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ์ค„์ด๋Š” ์ž‘์—…์€ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜ ๋ฒ„ํผ ํ’€์˜ ํฌ๊ธฐ๋ฅผ ์ง€๋‚˜์น˜๊ฒŒ ํฌ๊ฒŒ ์„ค์ •ํ•˜๋ฉด, ๋””์Šคํฌ๋ฅผ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์“ฐ๋Š” ์Šค์™€ํ•‘์ด ๋ฐœ์ƒํ•˜์—ฌ ์„œ๋น„์Šค๊ฐ€ ๋งค์šฐ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ๋‹นํ•œ ํฌ๊ธฐ๋Š” ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ 50%~80%์ž…๋‹ˆ๋‹ค.

1.2. ๋ฒ„ํผ ํ’€์˜ ๊ตฌ์กฐ

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ๋ฒ„ํผ ํ’€์ด๋ผ๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํŽ˜์ด์ง€ ํฌ๊ธฐ์˜ ์กฐ๊ฐ์œผ๋กœ ์ชผ๊ฐœ์–ด InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ๊ฐ ์กฐ๊ฐ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํผ ํ’€์˜ ํŽ˜์ด์ง€ ํฌ๊ธฐ ์กฐ๊ฐ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํฌ๊ฒŒ 3๊ฐ€์ง€ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • LRU(Least Recently Used) ๋ฆฌ์ŠคํŠธ: LRU์™€ MRU(Most Recently Used) ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ฒฐํ•ฉ ๊ฒฐํ•ฉ๋œ ํ˜•ํƒœ. ๋””์Šคํฌ๋กœ๋ถ€ํ„ฐ ํ•œ ๋ฒˆ ์ฝ์–ด์˜จ ํŽ˜์ด์ง€๋ฅผ ์ตœ๋Œ€ํ•œ ์˜ค๋žซ๋™์•ˆ InnoDB ๋ฒ„ํผ ํ’€์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•ด์„œ ๋””์Šคํฌ ์ฝ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•จ.

  • ํ”Œ๋Ÿฌ์‹œ(Flush) ๋ฆฌ์ŠคํŠธ: ๋””์Šคํฌ๋กœ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€(๋”ํ‹ฐ ํŽ˜์ด์ง€)์˜ ๋ณ€๊ฒฝ ์‹œ์  ๊ธฐ์ค€์˜ ํŽ˜์ด์ง€ ๋ชฉ๋ก์„ ๊ด€๋ฆฌํ•จ. ๋ฒ„ํผ ํ’€ ๋‚ด์˜ ๋”ํ‹ฐ ํŽ˜์ด์ง€๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์˜ ๋ฆฌ์ŠคํŠธ.

  • ํ”„๋ฆฌ(Free) ๋ฆฌ์ŠคํŠธ: ๋น„์–ด ์žˆ๋Š” ํŽ˜์ด์ง€๋“ค์˜ ๋ชฉ๋ก. ์ฟผ๋ฆฌ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ๋””์Šคํฌ์˜ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ๋จ.

1.3. ๋ฒ„ํผ ํ’€๊ณผ ๋ฆฌ๋‘ ๋กœ๊ทธ

InnoDB์˜ ๋ฒ„ํผ ํ’€์€ ๋””์Šคํฌ์—์„œ ์ฝ์€ ์ƒํƒœ๋กœ ์ „ํ˜€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ํด๋ฆฐ ํŽ˜์ด์ง€(Clean Page)์™€ ํ•จ๊ป˜ INSERT, UPDATE, DELETE ๋ช…๋ น์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋”ํ‹ฐ ํŽ˜์ด์ง€(Dirty Page)๋„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ํ‹ฐ ํŽ˜์ด์ง€๋Š” ๋””์Šคํฌ์™€ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ์ƒํƒœ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์  ๊ฐ€๋Š” ๋””์Šคํฌ๋กœ ๊ธฐ๋ก๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฆฌ๋‘ ๋กœ๊ทธ๋Š” 1๊ฐœ ์ด์ƒ์˜ ๊ณ ์ • ํฌ๊ธฐ ํŒŒ์ผ์„ ์—ฐ๊ฒฐํ•ด์„œ ์ˆœํ™˜ ๊ณ ๋ฆฌ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๊ณ„์† ๋ฐœ์ƒํ•˜๋ฉด ๋ฆฌ๋‘ ๋กœ๊ทธ ํŒŒ์ผ์— ๊ธฐ๋ก๋๋˜ ๋กœ๊ทธ ์—”ํŠธ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๋กœ๊ทธ ์—”ํŠธ๋ฆฌ๋กœ ๋ฎ์–ด ์“ฐ์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ฆฌ๋‘ ๋กœ๊ทธ ํŒŒ์ผ์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„๊ณผ ๋‹น์žฅ ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์„ ๊ตฌ๋ถ„ํ•ด์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์„ ํ™œ์„ฑ ๋ฆฌ๋‘ ๋กœ๊ทธ(Active Redo Log)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์—์„œ ํ™”์‚ดํ‘œ๋ฅผ ๊ฐ€์ง„ ์—”ํŠธ๋ฆฌ๋“ค์ด ํ™œ์„ฑ ๋ฆฌ๋‘ ๋กœ๊ทธ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

๋ฆฌ๋‘ ๋กœ๊ทธ ํŒŒ์ผ์˜ ๊ณต๊ฐ„์€ ๊ณ„์† ์ˆœํ™˜๋˜์–ด ์žฌ์‚ฌ์šฉ๋˜์ง€๋งŒ ๋งค๋ฒˆ ๊ธฐ๋ก๋  ๋•Œ๋งˆ๋‹ค ๋กœ๊ทธ ํฌ์ง€์…˜์€ ๊ณ„์† ์ฆ๊ฐ€๋œ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋ฅผ LSN(Log Sequence Number)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฒดํฌํฌ์ธํŠธ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ๋ฆฌ๋‘ ๋กœ๊ทธ์™€ ๋ฒ„ํผ ํ’€์˜ ๋”ํ‹ฐ ํŽ˜์ด์ง€๋ฅผ ๋””์Šคํฌ๋กœ ๋™๊ธฐํ™”ํ•˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๋ฐœ์ƒํ•œ ์ฒดํฌํฌ์ธํŠธ ์ค‘ ๊ฐ€์žฅ ์ตœ๊ทผ ์ฒดํฌํฌ์ธํŠธ ์ง€์ ์˜ LSN์ด ํ™œ์„ฑ ๋ฆฌ๋‘ ๋กœ๊ทธ ๊ณต๊ฐ„์˜ ์‹œ์ž‘์ ์ด ๋ฉ๋‹ˆ๋‹ค.

1.4. ๋ฒ„ํผ ํ’€ ํ”Œ๋Ÿฌ์‹œ(Buffer Pool Flush)

MySQL 5.7 ๋ฒ„์ „์„ ๊ฑฐ์ณ MySQL 8.0 ๋ฒ„์ „์ด ๋˜๋ฉด์„œ ๋Œ€๋ถ€๋ถ„์˜ ์„œ๋น„์Šค์—์„œ๋Š” ๋”ํ‹ฐ ํŽ˜์ด์ง€๋ฅผ ๋””์Šคํฌ์— ๋™๊ธฐํ™”ํ•˜๋Š” ๋ถ€๋ถ„(๋”ํ‹ฐ ํŽ˜์ด์ง€ ํ”Œ๋Ÿฌ์‹œ)์—์„œ ์˜ˆ์ „๊ณผ ๊ฐ™์€ ๋””์Šคํฌ ํญ์ฆ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํŠน๋ณ„ํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ๋ผ๋ฉด ์ด ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋“ค์„ ์กฐ์ •ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

  • ํ”Œ๋Ÿฌ์‹œ ๋ฆฌ์ŠคํŠธ ํ”Œ๋Ÿฌ์‹œ: ํ”Œ๋Ÿฌ์‹œ ๋ฆฌ์ŠคํŠธ์—์„œ ์˜ค๋ž˜์ „์— ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ์ˆœ์„œ๋Œ€๋กœ ๋””์Šคํฌ์— ๋™๊ธฐํ™”

  • LRU ๋ฆฌ์ŠคํŠธ ํ”Œ๋Ÿฌ์‹œ: LRU ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ ๋นˆ๋„๊ฐ€ ๋‚ฎ์€ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๋“ค์„ ์ œ๊ฑฐํ•ด์„œ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋“ค์„ ์ฝ์–ด์˜ฌ ๊ณต๊ฐ„์„ ์ƒ์„ฑ

1.5. ๋ฒ„ํผ ํ’€ ์ƒํƒœ ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ

MySQL 5.6 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ๋ฒ„ํผ ํ’€ ๋คํ”„ ๋ฐ ์ ์žฌ ๊ธฐ๋Šฅ์ด ๋„์ž…๋์Šต๋‹ˆ๋‹ค. MySQL ์„œ๋ฒ„๋ฅผ ์…ง๋‹ค์šดํ•˜๊ธฐ ์ „์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด ํ˜„์žฌ InnoDB ๋ฒ„ํผ ํ’€์˜ ์ƒํƒœ๋ฅผ ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-- // MySQL ์„œ๋ฒ„ ์…ง๋‹ค์šด ์ „์— ๋ฒ„ํผ ํ’€์˜ ์ƒํƒœ ๋ฐฑ์—…
mysql> SET GLOBAL innodb_buffer_pool_dump_now=ON;
-- // MySQL ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ํ›„, ๋ฐฑ์—…๋œ ๋ฒ„ํผ ํ’€์˜ ์ƒํƒœ ๋ณต๊ตฌ
mysql> SET GLOBAL innodb_buffer_pool_load_on=ON;
-- // ๋ฒ„ํผ ํ’€ ๋ณต๊ตฌ ์ง„ํ–‰๋„ ํ™•์ธ
mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status';
-- // ๋ฒ„ํผ ํ’€ ๋ณต๊ตฌ ์ค‘๋‹จ
mysql> SET GLOBAL innodb_buffer_pool_load_abort=ON;

๋ฒ„ํผ ํ’€์˜ ๋ฐฑ์—…๊ณผ ๋ณต๊ตฌ๋ฅผ ์ž๋™ํ™”ํ•˜๋ ค๋ฉด innodb_buffer_pool_dump_at_shutdown๊ณผ innodb_buffer_pool_load_at_startup ์„ค์ •์„ MySQL ์„œ๋ฒ„์˜ ์„ค์ • ํŒŒ์ผ์— ๋„ฃ์–ด๋‘๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1.6. ๋ฒ„ํผ ํ’€์˜ ์ ์žฌ ๋‚ด์šฉ ํ™•์ธ

MySQL 8.0 ๋ฒ„์ „์—์„œ๋Š” information_schema ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— innodb_cached_indexes ํ…Œ์ด๋ธ”์ด ์ƒˆ๋กœ ์ถ”๊ฐ€๋์Šต๋‹ˆ๋‹ค. ์ด ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•˜๋ฉด ์ธ๋ฑ์Šค๋ณ„๋กœ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๊ฐ€ ์–ผ๋งˆ๋‚˜ InnoDB ๋ฒ„ํผ ํ’€์— ์ ์žฌ๋ผ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Double Write Buffer

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์˜ ๋ฆฌ๋‘ ๋กœ๊ทธ๋Š” ๋ฆฌ๋‘ ๋กœ๊ทธ ๊ณต๊ฐ„์˜ ๋‚ญ๋น„๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ํŽ˜์ด์ง€์˜ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ๋งŒ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ์ธํ•ด ๋”ํ‹ฐ ํŽ˜์ด์ง€๋ฅผ ๋””์Šคํฌ ํŒŒ์ผ๋กœ ํ”Œ๋Ÿฌ์‹œํ•  ๋•Œ ์ผ๋ถ€๋งŒ ๊ธฐ๋ก๋˜๋Š” ๋ฌธ์ œ(Partial-page)๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์€ ๋ณต๊ตฌํ•  ์ˆ˜ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ๋Š” ์ด ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด Double-Write ๊ธฐ๋ฒ•์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. 'A'~'E'๊นŒ์ง€์˜ ๋”ํ‹ฐํŽ˜์ด์ง€๋ฅผ ๋””์Šคํฌ๋กœ ํ”Œ๋Ÿฌ์‹œ ํ•  ๋•Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

  1. ์‹ค์ œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์— ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•˜๊ธฐ ์ „์— 'A'~'E'๊นŒ์ง€์˜ ๋”ํ‹ฐ ํŽ˜์ด์ง€๋ฅผ ์šฐ์„  ๋ฌถ์–ด์„œ ํ•œ ๋ฒˆ์˜ ๋””์Šคํฌ ์“ฐ๊ธฐ๋กœ ์‹œ์Šคํ…œ ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค์˜ DoubleWrite ๋ฒ„ํผ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ฐ ๋”ํ‹ฐ ํŽ˜์ด์ง€๋ฅผ ํŒŒ์ผ์˜ ์ ๋‹นํ•œ ์œ„์น˜์— ํ•˜๋‚˜์”ฉ ๋žœ๋ค์œผ๋กœ ์“ฐ๊ธฐ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  3. 'A'์™€ 'B' ํŽ˜์ด์ง€๋Š” ์ •์ƒ์ ์œผ๋กœ ๊ธฐ๋ก๋์ง€๋งŒ 'C' ํŽ˜์ด์ง€๊ฐ€ ๊ธฐ๋ก๋˜๋Š” ๋„์ค‘ ์šด์˜์ฒด์ œ๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋์Šต๋‹ˆ๋‹ค.

  4. InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด ์žฌ์‹œ์ž‘๋  ๋•Œ DoubleWrite ๋ฒ„ํผ์˜ ๋‚ด์šฉ๊ณผ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์˜ ํŽ˜์ด์ง€๋“ค์„ ๋ชจ๋‘ ๋น„๊ตํ•ด์„œ ๋‹ค๋ฅธ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ์œผ๋ฉด DoubleWrite ๋ฒ„ํผ์˜ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์˜ ํŽ˜์ด์ง€๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

HDD์ฒ˜๋Ÿผ ํ”Œ๋ž˜ํ„ฐ(Platter)๊ฐ€ ํšŒ์ „ํ•˜๋Š” ์ €์žฅ ์‹œ์Šคํ…œ์—์„œ๋Š” ์–ด์ฐจํ”ผ ํ•œ ๋ฒˆ์˜ ์ˆœ์ฐจ ๋””์Šคํฌ ์“ฐ๊ธฐ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋กœ ๋ถ€๋‹ด์ด ๋˜์ง€ ์•Š์ง€๋งŒ SSD์ฒ˜๋Ÿผ ๋žœ๋ค IO๋‚˜ ์ˆœ์ฐจ IO์˜ ๋น„์šฉ์ด ๋น„์Šทํ•œ ์ €์žฅ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ƒ๋‹นํžˆ ๋ถ€๋‹ด์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์ด ๋งค์šฐ ์ค‘์š”ํ•œ ์„œ๋น„์Šค์—์„œ๋Š” DoubleWrite์˜ ํ™œ์„ฑํ™”๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


๐ŸŽฏ์ •๋ฆฌ

  • InnoDB์˜ ๋ฒ„ํผ ํ’€์€ ๋นˆ๋ฒˆํ•œ ๋””์Šคํฌ I/O ์ž‘์—…์˜ ํ•„์š”์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋””์Šคํฌ ๊ธฐ๋ฐ˜ ์Šคํ† ๋ฆฌ์ง€์—์„œ ๋ฐ์ดํ„ฐ ๋ฐ ์ธ๋ฑ์Šค๋ฅผ ์บ์‹œํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ž…๋‹ˆ๋‹ค.

  • ์Šคํ† ๋ฆฌ์ง€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ˆ˜์ •ํ•˜๋ฉด ๋จผ์ € ๋ฒ„ํผ ํ’€๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

  • ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค์‹œ ์š”์ฒญ๋˜๋ฉด InnoDB๋Š” ๋””์Šคํฌ์— ์•ก์„ธ์Šคํ•  ํ•„์š” ์—†์ด ๋ฒ„ํผ ํ’€(๋ฉ”๋ชจ๋ฆฌ)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ์ „์ฒด ์‹œ์Šคํ…œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ๋‚ด๊ตฌ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด InnoDB๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฒดํฌํฌ์ธํŠธ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ฒดํฌํฌ์ธํŠธ ์ด๋ฒคํŠธ ๋™์•ˆ InnoDB๋Š” ๋ฒ„ํผ ํ’€์—์„œ ์ˆ˜์ •๋œ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๋””์Šคํฌ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋Š” ์ปค๋ฐ‹๋œ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋””์Šคํฌ์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ๋˜๋„๋ก ํ•˜์—ฌ ์ถฉ๋Œ ์ค‘์— ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฒดํฌํฌ์ธํŠธ ์ค‘ ๊ฐ€์žฅ ์ตœ๊ทผ ์ฒดํฌํฌ์ธํŠธ ์ง€์ ์˜ LSN์ด ํ™œ์„ฑ ๋ฆฌ๋‘ ๋กœ๊ทธ ๊ณต๊ฐ„์˜ ์‹œ์ž‘์ ์ด ๋ฉ๋‹ˆ๋‹ค

  • innodb_buffer_pool_dump_at_shutdown๊ณผ innodb_buffer_pool_load_at_startup ์„ค์ •์œผ๋กœ ๋ฒ„ํผ ํ’€์˜ ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Double Write Buffer์€ ํ”„๋กœ์„ธ์Šค ์ค‘ ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ์ •์ „์ด๋‚˜ ๊ธฐํƒ€ ์‹œ์Šคํ…œ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๋˜๋Š” ์†์ƒ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์†์ƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.


๐Ÿ”–์ฐธ๊ณ