์ ๋ฆฌ์ค -2
by JiwonDevMySQL ์ MySQL ์์ง๊ณผ ์คํ ๋ฆฌ์ง ์์ง์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค๊ณ ํ๋ค.
2021.10.13 - [๐ฑBackend/DB(MySQL)] - ์ ๋ฆฌ์ค #1 ์์ง ์ํคํ ์ฒ
๐ MySQL์ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ
MySQL ์์ง์ ํด๋ผ์ด์ธํธ๋ก ์ค๋ ์์ฒญ ์ฒ๋ฆฌ, SQL๋ฌธ์ฅ์ ๋ถ์ํ๊ณ ์ต์ ํํ๋ ์ญํ ์ ๋ด๋นํ๋ค.
์คํ ๋ฆฌ์ง ์์ง์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ์ ์ฅ, ์กฐํํ๋ ์ญํ ์ ๋ด๋นํ๋ค.
MySQL ์๋ฒ์ [MySQL ์์ง]์ ํ๋๋ง ์ฌ์ฉ ํ ์ ์์ง๋ง, ์คํ ๋ฆฌ์ง๋ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- MySQL ์์ง
โ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , SQL๋ฌธ์ [์คํ ๋ฆฌ์ง ์์ง์ Handler Api ์์ฒญ]์ผ๋ก ๋ณํํ๋ ์ญํ
โ Connetion Handler : ์ปค๋ฅ์ ๋ฐ ์ฟผ๋ฆฌ ์์ฒญ์ ๋ด๋น
โ SQL Interface : DML, DDL, Procedure, View ๋ฑ SQL ๋ฌธ๋ฒ ์ธํฐํ์ด์ค ์ ๊ณต
โ SQL Parser : SQL ๋ฌธ๋ฒ ์ค๋ฅ ํ์ง, ํ ํฐ ๋จ์๋ก ๋๋ ํธ๋ฆฌ ํํ๋ก ๋ณํ.
โ SQL Optimize : ์ฟผ๋ฆฌ์ ์ต์ ํ๋ ์คํ ๋ด๋น. ์คํ ๊ณํ์ ๋ง๋ฆ
โ Cache & Buffer
โ Query execution engine (api calls) : ๋ง๋ค์ด์ง ์คํ ๊ณํ์ Storage ์์ง์ ์์ฒญ, ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ํด๋ผ์ด์ธํธ ๋ฐํ.
์๋ฅผ ๋ค์ด GROUP BY ๋ผ๋ ์คํ๊ณํ์ ์๋์ ๊ฐ์ ์์ ์ด ์งํ๋๋ค.
1. ์คํ ์์ง์ด Handler API๋ก ์์ ํ ์ด๋ธ์ ๋ง๋ค๋ผ๊ณ ์์ฒญ
2. ์คํ ์์ง์ WHERE ์ ์ ์ผ์นํ๋ ๋ ์ฝ๋๋ฅผ ์ฝ์ด์ค๋ผ๊ณ Handler API ์์ฒญ
3. ์ฝ์ด์จ ๋ ์ฝ๋๋ค์ ์์ํ ์ด๋ธ์ ์ ์ฅํ๋ผ๊ณ Handler API ์์ฒญ
4. ๋ฐ์ดํฐ๊ฐ ์ค๋น๋ ์์ ํ ์ด๋ธ์์ ํ์ํ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ผ๊ณ Handler API ์์ฒญ
5. ์ต์ข ์ ์ผ๋ก ์คํ ์์ง์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉ์๋ ๋ค๋ฅธ ๋ชจ๋๋ก ๋๊น
- Storage ์์ง
โ ์ค์ง์ ์ผ๋ก ๋์คํฌ๋ฅผ ์ฝ๊ณ , ์ฐ๋ ์ญํ
โ Handler Api ๋ฅผ ์ ๊ณตํด์ฃผ๋ฉฐ, ์ด๋ฅผ ํตํด MySQL ์์ง์ด ๋์คํฌ ์ฝ๊ธฐ, ์ฐ๊ธฐ๋ฅผ ์์ฒญํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ ๋ฐ์.
โ ํ๋ฌ๊ทธ์ธ ํํ๋ก MySQL ์์ง๊ณผ ์์กด์ฑ์ด ์์ผ๋ฉฐ ์ฟผ๋ฆฌ๋ณ๋ก ๋ค๋ฅธ Storage Engine์ ์ฌ์ฉํ ์ ์์.
๐MySQL ์ฟผ๋ฆฌ๋ ์ด๋ป๊ฒ ์คํ๋๋๊ฐ
- MySQL ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ(SQL๋ฌธ)์ ๋ฐ์.
- ํ์(Parser) ๊ฐ SQL๋ฌธ์ด ์ ํจํ์ง ํ ํฐ ๋จ์๋ก ๊ตฌ๋ถํด์ ํ์ ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
- ์ ์ฒ๋ฆฌ๊ธฐ(Pre-Processor)๊ฐ ํ์ ํธ๋ฆฌ์ ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ ๋ฅผ ํ์
ํจ. ์กด์ฌํ์ง ์๋ ํ
์ด๋ธ, ๊ถํ๋ฑ์ ์ฌ๊ธฐ์ ๊ตฌ๋ณ
๊ทธ๋ฆฌ๊ณ ์์ฑ๋ [์ ํจํ SQL ์ฟผ๋ฆฌ๋ฌธ์ ํธ๋ฆฌ]๋ฅผ ๋ฐ๋ก ์คํํ๋๊ฒ ์๋๋ผ, Optimizer๋ก ๋๊น. - ์ตํฐ๋ง์ด์ (Optimizer)๋ ์์ฒญ๋ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํ์์ผ ์ค์ ์คํ๊ณํ์ ๋ง๋ ๋ค.
๊ฐ๋ฐ์๋ EXPLAIN ๋ฌธ์ผ๋ก MySQL Optimizer๊ฐ ์์ฑํด๋ธ ์คํ๊ณํ์ ํ์ธํ ์ ์๋ค.
๋ง๋ค์ด์ง ์คํ ๊ณํ์ ๋ถ์ํ์ฌ MySQL Optimizer๊ฐ ์ต์ ํํ ์ ์๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ผ ํ๋ค. - ์คํ ์์ง(Execution Engine)์ ๋ง๋ค์ด์ง ์คํ ๊ณํ๋๋ก Handler API๋ฅผ ํตํด ์คํ ๋ฆฌ์ง ์์ง์ ์กฐ์ํ๋ค.
Storage Engine์ ์คํ ์์ง์์ ์ฌ์ฉํ ์ ์๋๋ก Handler API๋ฅผ ์ ๊ณตํด์ค๋ค. ๊ทธ ์ธ์ ์์กด์ฑ์ ์๋ค.
์ฟผ๋ฆฌ๋ฅผ ๊ผญ ๊ฐ๋ฐ์๊ฐ ์ต์ ํ ํด์ผํ๋์? ๊ฐ๋จํ๊ฑด ๊ทธ๋ฅ ์ฌ์ฉํ๋ฉด ์๋์?
์ด๋ค ํ์ฌ๋ฅผ ๊ฐ๋, ์ด๋ค ์๋น์ค๋ฅผ ์ด์ํ๋ ์ฟผ๋ฆฌ์๋ ์ ๋ต์ด ์๋ค. ๋ํ Optimizer๋ ๋ง๋ฅ ๋๊ตฌ๊ฐ ์๋๋ค.
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ๊ฐ๋จํ ์ฟผ๋ฆฌ๋ฅผ ์๊ฐํด๋ณด์.
/*
[์ง์์ ๋ณด ํ
์ด๋ธ A, ๋ถ์์ ๋ณด ํ
์ด๋ธ B]
๊ฐ ๋ถ์๋ณ๋ก 2000๋
์ดํ ์
์ฌํ ์ฌ์์๋ฅผ ์กฐํํด์
GROUP BY๋ก ์
์ฌํ ์ฐ๋๋ณ ์ฌ์์๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ
*/
SELECT
B.๋ถ์๋ช
, COUNT(*) AS ์ฌ์์
, SUBSTR(TO_CHAR(A.์
์ฌ์ผ,'yyyymmdd'),1,4) AS ์
์ฌ๋
๋
FROM
์ง์์ ๋ณด A
, ๋ถ์์ ๋ณด B ON B.๋ถ์ID = A.๋ถ์ID
WHERE
TO_CHAR(A.์
์ฌ์ผ,'yyyy') >= '2000'
GROUP BY
B.๋ถ์๋ช
, SUBSTR(TO_CHAR(A.์
์ฌ์ผ, 'yyyymmdd'),1,4)
ํด๋น SQL๋ฌธ์ ์๋์ ๊ฐ์ ์กฐ์น๋ฅผ ์ทจํ๋ฉด Optimizer๊ฐ ์ต์ ํ ํ ์ฌ์ง๋ฅผ ์ค๋ค.
- ์นผ๋ผ์ ๊ฐ๊ณตํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ํ๋ค.
[ TO_CHAR(์ ์ฌ์ผ) >= '2000' ] โก [ ์ ์ฌ์ผ >= TO_DATA(yyyymmdd) ]๋ก ์นผ๋ผ์ ๊ฐ๊ณตํ์ง ์๊ฒ ๋ง๋ ๋ค.
์ธ๋ฑ์ค ์์ฑ์ Column ์ด๋ฆ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, Column์ ์์ ๋๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์กฐํํ๋ค. - ๋จผ์ ๋ฒ์๋ฅผ ์ค์ด๊ณ ์กฐ๊ฑด์ ๊ฑธ๋ฉด ์ฒ๋ฆฌํ ๋ฐ์ดํฐ๋์ด ์ ์ด์ง๋ค.
[ ๋ถ์ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๋จผ์ GROUP BY ] ์ดํ [ WHERE ์กฐ๊ฑด ] ์ ๋ฃ์ผ๋ฉด ์ง์๊ณผ ๋ถ์ ํ ์ด๋ธ์ด 1:1 ๊ด๊ณ๊ฐ ๋๋ค. - ๋ถํ์ํ ํจ์ ์ฌ์ฉ์ ์ค์ด์
SUBSTR(TO_CHAR(...)) ๋ TO_DATE(...) ํ๋๋ก ๋์ฒด ๊ฐ๋ฅํ๋ค.
SELECT
B.๋ถ์๋ช
, A.์ฌ์์
, A.์
์ฌ๋
๋
FROM
(SELECT -- ๋ฒ์๋ฅผ ์ค์๋ค. ์ง์์ ๋ณด A ํ
์ด๋ธ์ GROUP BY๋ก ๋จผ์ ๋ฝ์๋
๋ถ์ID
, TO_CHAR(a.์
์ฌ์ผ, 'yyyy') AS ์
์ฌ๋
๋
, COUNT(*) AS ์ฌ์์
FROM
์ง์์ ๋ณด
WHERE
์
์ฌ์ผ >= TO_DATE('20000101','yyyymmdd')
GROUP BY
๋ถ์ID
, TO_CHAR(a.์
์ฌ์ผ, 'yyyy')
) A
, ๋ถ์์ ๋ณด B ON B.๋ถ์ID = a.๋ถ์id
๐ MySQL ์ค๋ ๋ ๊ตฌ์กฐ
๊ธฐ์กด์ MyISBM ์คํ ๋ฆฌ์ง ์์ง์ forground thread์์ ๋์คํฌ๋ฅผ ์ฝ๊ณ , ์ฐ๋ ๊ฑธ ๋ค ๋ด๋นํ์๋ค.
ํ์ง๋ง InnoDB ์์ง์ ์ญํ ์ด ํ์คํ๊ฒ ๋ถ๋ฆฌ๋์ด, ๋๋ถ๋ถ์ ์ฒ๋ฆฌ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๊ฐ ๋ด๋นํ๋ค.
(๋ง์ฝ ์บ์&๋ฒํผ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์๋ง ๋์คํฌ์์ ์ฝ์ด๋ค์ด๋ฉฐ, ์ฐ๊ธฐ๋ ์์ธ ์์ด ๋ฌด์กฐ๊ฑด ๋ฐฑ๊ทธ๋ผ์ด๋๊ฐ ๋ด๋นํจ.)
- foreground thread
โ ํด๋ผ์ด์ธํธ๋น ํ๋์ ์ค๋ ๋๊ฐ ์์ฑ๋จ.
โ ๊ณ ๊ฐ ์ฐฝ๊ตฌ ์ญํ , ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ์ฟผ๋ฆฌ ๋ฌธ์ฅ์ ์ฒ๋ฆฌํ๋ ์ค๋ ๋
โ ๋ฐ์ดํฐ ์กฐํ ์ค๋ ๋ (๋ฒํผ๋ ์บ์์์ ๊ฐ์ ธ์ค๊ณ , ์๋ค๋ฉด ์ธ๋ฑ์ค๋ ๋์คํฌ์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด)
โ ๋ค๋ง ์ค๋ ๋๋ฅผ ๋ฌดํ์ ์์ฑํ๋๊ฑด ์๋๊ณ , ์ค์ ๊ฐ(thread_cache_size)์ ์ด๊ณผํ๋ค๋ฉด ๋ค๋ฅธ ์ค๋ ๋ ๋ฐ๋ฉ์ ๊ธฐ๋ค๋ฆผ.
์ฐ๋ ๋๋ ์์ฑ๋๋ ์์ ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ค. ์ปค๋ฅ์ ๊ฐ์๋ฅผ ๋ณด๊ณ ํผํฌ ์น๋ณด๋ค ์ฝ๊ฐ ๋ฎ์ size๋ก ํ ๋นํ์.
- ํ์ ์ด์์ ๋ง์ ์ค๋ ๋๊ฐ ์์ฑ๋๊ณ ์ฌ๋ผ์ง๋ฉด ์๋ฒ ์ฑ๋ฅ์ ๋ง์ ์ํฅ์ ๋ผ์น๋ค.
- ๋ฐ๋๋ก ์ค๋ ๋๊ฐ ๋๋ฌด ๋ถ์กฑํ๋ค๋ฉด ๋ค๋ฅธ ์ค๋ ๋ ๋ฐ๋ฉ์ ๊ธฐ๋ค๋ฆฌ๋ฉด์ ์์ฒญ์ด ๋๋ ์ด ๋๋ค. - background thread
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋์์ ํ์ํ ์ค๋ ๋๋ค. ์ค๋ ๋ ๋ณ๋ก ์ญํ ์ด ๋๋์ด์ ธ์์.
โ Insert buffer๋ฅผ ๋ณํฉํ๋ ์ค๋ ๋
โ ๋ก๊ทธ ๊ธฐ๋ก์ ๋ด๋นํ๋ ์ค๋ ๋
โ InnoDB ๋ฒํผ ํ์ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ๋ก ๊ธฐ๋ก(Write)ํ๋ ์ค๋ ๋
โ ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ๋ก ๊ฐ์ ธ์ค๋(Read) ์ค๋ ๋
โ ์ ๊ธ, ๋ฐ๋๋ฝ์ ๋ชจ๋ํฐ๋ง ํ๋ ์ค๋ ๋
โ ๋ชจ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฉ์ธ ์ค๋ ๋
๐ MySQL ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
MySQL์ Static๊ณผ Local์ฒ๋ผ, ๊ธ๋ก๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋๋์ด์ง.
- Global Memory
โ MySQL ์๋ฒ๋ฅผ ์คํํ ๋ ์ด์์ฒด์ ๋ก ๋ถํฐ ํ ๋น๋ฐ์. ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํด์ ์ฌ์ฉํจ
* ๋ค๋ง ์๋ฐ static ์์ญ์ฒ๋ผ ๋ฌด์กฐ๊ฑด ์ฒ์๋ถํฐ 100% ํ ๋น๋๋๊ฑด ์๋๊ณ , ์ด์์ฒด์ ์ ํ ๋น ๋ฐฉ์์ ๋ฐ๋ผ ์์ฝํด๋๊ณ ํ์ํ ๋ ์กฐ๊ธ์ฉ ํ ๋นํด์ฃผ๋ ๊ฒฝ์ฐ๋ ์๋ค. - Session Memory (Local Memory, Connection Memory ๋ผ๊ณ ๋ ๋ถ๋ฆผ)
โ ํด๋ผ์ด์ธํธ ์ค๋ ๋(foreground thread)๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ.
โ ๋น์ฐํ ์ค๋ ๋ ๋ณ๋ก ๋ ๋ฆฝ์ ์ด๋ฉฐ ๊ณต์ ๋์ง ์์.
โ ๊ธ๋ก๋ฒ๊ณผ ๋ค๋ฅด๊ฒ ํ์์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ผ๋ฉฐ, ํ์์๋ค๋ฉด ์์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ์์ ์๋ ๊ฒฝ์ฐ๋ ์์.
์ธ์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ช ์ฃผ๊ธฐ๋ ๋ฒํผ์ ์ข ๋ฅ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. Connection, Result ๋ฒํผ๋ ํด๋ผ์ด์ธํธ ์ปค๋ฅ์ ์ด ์ด์์๋ ๋์ ๊ณ์ ์ฌ์ฉํ๊ณ , Sort Join ๋ฒํผ๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋์๋ง ์ ๊น ํ ๋น ๋ฐ์๋ค๊ฐ ์๋ฃ ํ ๋ค์ ๋ฐํํจ.
๐ ๋ณต์ (Replication)
2๋ ์ด์์ MySQL ์๋ฒ๊ฐ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ด๋๋ก ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์๊ฐ ๋๊ธฐํ ๊ธฐ์ ์ด๋ค.
๋ณดํต ์ฝ๊ธฐ, ์ฐ๊ธฐ๊ฐ ๋ชจ๋ ๊ฐ๋ฅํ ๋ง์คํฐ(Primary)์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ ์ฌ๋ฌ ๋์ ์ฌ๋ ์ด๋ธ(Replica)๋ก ๊ตฌ์ฑํ๋๊ฒ ์ผ๋ฐ์ ์ด๋ค.
๊ธฐ์กด์ ๋ง์คํฐ-์ฌ๋ ์ด๋ธ๋ผ๋ ์ด๋ฆ์ ํ์ธ๋นํ..๋ผ๋ ์ด์ ๋ก Primary์ Replica ๋๋ Secondary ๋ฑ์ผ๋ก ๋ถ๋ฅธ๋ค.
- ๋จ์ํ ์๋ฒ ๋ฐฑ์ ์ฉ๋๋ฅผ ๋์ด์, ์ฐ๊ธฐ ์์ ์ ๊ณผ๋ถํ๊ฐ ์ฝ๊ธฐ ์์ ์ ์ํฅ๋ผ์น์ง ์๋๋ก ๋๋ ์์๋ค.
- ํนํ ์๋น์ค๋ฅผ ์ด์ํ๋ค๋ณด๋ฉด, ๋น์ฆ๋์ค ๊ณ ๊ฐ ๋ฐ์ดํฐ ๋ถ์, ํต๊ณ์ฉ์ผ๋ก ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ์ผ์ด ๋ง๋ค.
์ด ๊ฒฝ์ฐ ๋ณ๋์ Replica DB ์๋ฒ๋ฅผ ๊ตฌ์ถํด์ ๋ด๋นํ๊ฒ ๋ง๋ค์ด์ผ ์ค์ ์๋น์ค์ ์ํฅ์ด ์๋ค. - ๊ธ๋ก๋ฒ ์๋น์ค์ ๊ฒฝ์ฐ ์ง์ญ Replica DB๋ฅผ ๊ตฌ์ถํ์ฌ ์บ์์ฒ๋ผ ์ฌ์ฉํ๋ฉด ์๋ต ์๋๋ฅผ ํฌ๊ฒ ๊ฐ์ ์ํฌ ์ ์๋ค.
- ๋จ, ์ค์๊ฐ์ฑ์ด ์ค์ํ ๋ฐ์ดํฐ๋ ์ฝ์ ๋ ๋ง์คํฐ(Primary)์์ ๊ฐ์ ธ์์ผ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ณด์ฅํ ์ ์๋ค.
๋ณ๊ฒฝ ํ ๋ฐ๋ก ์ฝ์ด๋ฒ๋ฆฌ๋ฉด Replica DB์ ์์ง ๋ฐ์๋์ง ์์์, ๊ฐํ์ ์ผ๋ก null์ด ๋ฐํ๋๋ ์ํ์ฑ์ด ์๊ธฐ ๋๋ฌธ
Primary DB ์๋ฒ๋ ์๋ฒ์ ๋ณต์ ๋ฅผ ์ํด MySQL ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ํ์ฑํํด์ ๋ก๊ทธ๋ฅผ ๋จ๊ธธ ์ ์๋ค.
๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์๋ DML (๋ฐ์ดํฐ ์กฐ์)์ DDL(๋ฐ์ดํฐ ์ ์)๋ฑ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณ๊ฒฝ๋ ๋ชจ๋ ์ด๋ฒคํธ๋ค์ ๊ธฐ๋กํ๋ค.
์ด ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ Replica DB๊ฐ ๋ฐ์์ ๊ทธ๋๋ก ๋ณต์ฌ/์ ์ฅํ Relay Log๋ฅผ ์์ฑํ ๋ค, ์ด๋ฅผ ์ฝ์ด ๋๊ธฐํ๋ฅผ ํ๋ ๋ฐฉ์์ด๋ค.
์ด ๊ณผ์ ์๋ 2๊ฐ์ Primary ์ค๋ ๋, 1๊ฐ์ Replica ์ค๋ ๋๊ฐ ๋์ํ๋ค.
๊ฐ ์ค๋ ๋๋ SHOW REPLICA STATUS ๋ช ๋ น์ ํตํด ์ํ๋ฅผ ํ์ธํ ์ ์๋ค.
- Replica ์๋ฒ๋ Primary ์๋ฒ์ ์ ์ํด ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ์ ๋ณด๋ฅผ ์์ฒญํ๋ค.
์ด ๋ Primary์์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ๋คํ ์ค๋ ๋ (Binlog dump thread)๊ฐ ์์ฑ๋์ด ๋ก๊ทธ๋ฅผ Replica ์๋ฒ๋ก ์ ์กํ๋ค.
ํด๋น ์ค๋ ๋๋ Replica์ ์ ์กํ ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ์ฝ์ ๋ ์ผ์์ ์ผ๋ก ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ์ ๊ถ Thread-Safe ๋ฅผ ๋ณด์ฅํจ. - Replica ์๋ฒ์์ START REPLICA ๋ช
๋ น์ผ๋ก ๋ณต์ ๊ฐ ์์๋๋ฉด Replication I/O Thread๊ฐ ์์ฑ๋๋ค.
์ด ์ค๋ ๋๋ Primary ์๋ฒ์ Binlog dump ์ค๋ ๋์์ ๋ก๊ทธ๋ฅผ ๊ฐ์ ธ์ ๋ก์ปฌ ํ์ผ์ธ Relay Log์ ๋ณต์ฌ/์ ์ฅํ๋ค. - ๊ทธ๋ฆฌ๊ณ Replica ์๋ฒ์์ Replication SQL Thread๋ฅผ ๋ง๋ค์ด Relay Log๋ฅผ ์ฝ์ด๋ค์ด๊ณ , ๋๊ธฐํ๋ฅผ ์งํํ๋ค.
์ด๋ ๊ฒ ์ฐ๊ธฐ(I/O)์ ์ฝ๊ธฐ(SQL)๋ฅผ ๋ถ๋ฆฌ์์ผฐ๊ธฐ ๋๋ฌธ์, Replica DB ๋๊ธฐํ ์๋๊ฐ ๋๋ฆฌ๋๋ผ๋ Relay Log๋ฅผ ์์ฑ ์๊ฐ์๋ ์ํฅ์ ๋ผ์น์ง ์๋๋ค.
Binary log๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณต๊ตฌ ํ ์ ์์๊น์?
mysqlbinlog ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ์ด์ง ํ์ผ์ ์ฌ๋์ด ๋ณผ ์ ์๋ ํํ๋ก ์ ํ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ฏ์ด๋ณด๋ฉด ์๊ฒ ์ง๋ง ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ ๋ณด๊ฐ ์๋๋ผ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑ/์์ ํ SQL ์ ๊ฐ์ง๊ณ ์๋ ๋
ผ๋ฆฌ์ ์ธ ์ ๋ณด ์
๋๋ค. ๊ทธ๋์ ๋ณต๊ตฌ๋ ๊ฐ๋ฅํ๊ฒ ์ง๋ง, ๋ฐ์ดํฐ ๋ณต๊ตฌ์ ๋ง์ ์๊ฐ์ด ์์๋ฉ๋๋ค.
2021.10.20 ์ถ๊ฐ) DB ๋ณด์์ ์ํด ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ์ํธํ ํ๊ธฐ ๋๋ฌธ์ mysqlbinlog๋ฅผ ์ฌ์ฉํด๋ ์ํธํ๋ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ผ์ ์ด์ด๋ณผ ์ ์๋ค๋ ๋ฉ์์ง๊ฐ ๋น๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ก๊ทธํ์ผ์ ์์ฑํ MySQL ์๋ฒ์์ ์๋ ์ํธํ ํค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ฆ, ๋ก๊ทธํ์ผ๋ง ๊ฐ์ ธ์ค๋๊ฒ ์๋๋ผ ์ค์ ์ด์์ค์ธ MySQL ์๋ฒ์ ์ ์ํด์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ํต์งธ๋ก ๋ฐฑ์ ํ๋ ค๋ฉด XtraBackup ๋ฑ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์๋์๋ ์ค์ ๋ก Maria DB๋ฅผ ๋ ๋ ค๋ฒ๋ ค์ Binary Log๋ก ๋ณต์ํ๋ค๋ ์ ) ๋ฐฐ๋ฌ์๋ฏผ์กฑ ์ด์ฃผํ๋์ ๊ธฐ๋ก์ ๋๋ค ๐
@ ๋ณต์ ์ ์ฃผ์์ฌํญ
- ํ๋์ Replica๋ ํ๋์ Primary๋ง ์ค์ ๊ฐ๋ฅํ๋ค. ๋น์ฐํ ์ด์ผ๊ธฐ
- Replica๋ ๋ฐ๋์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๊ตฌ์ฑํด์ผํ๋ค. ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์๋๋ผ, Primary์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ, ์ ํฉ์ฑ์ด ๊นจ์ง๋ค.
- Replica์ Primary DB์ ์๋ฒ ์ฅ๋น ์ฌ์์ ๋์ผํ ๊ฒ์ผ๋ก ์ฌ์ฉํด์ผํ๋ค. ๊ทธ๋์ผ ๋ณต์ ๊ฐ ๊ฐ๋ฅํ๋๊น
- ๋ณต์ ๋ฅผ ์ํด ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ์์ฑํ๋ ์ผ์ ๋งค์ฐ ๋น์ฉ์ด ํฐ ์์ ์ด๋ค. ๋ณต์ ๋ฅผ ํ์ง ์๋๋ค๋ฉด ๋ก๊ทธ ์์ฑ์ ๋ฉ์ถ์
- ๊ทธ๋์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ ๋ ํธ๋์ญ์
๊ฒฉ๋ฆฌ์์ค์ 2๊ฐ์ง ์ ๊ณตํด์ค๋ค.
โก 1. STATEMENT : Primary DB์ ์คํ๋ ์ฟผ๋ฆฌ ์์ฒด๋ฅผ ๊ธฐ๋กํ๋ค. / ๋ก๊ทธ ์ฉ๋์ด ์์์ ๋คํธ์ํฌ ๋น์ฉ์ ์ค์ด๋ค์ง๋ง ์ฟผ๋ฆฌ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์์ผํด์ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์์ค์ REPEATABLE READ ์ด์์ผ๋ก ํ๋ ๋จ์ ์ด ์๋ค.
โก 2. ROW : Primary DB์ ์คํ๋ ์ฟผ๋ฆฌ๋ก ์ธํด ๋ณ๊ฒฝ๋ ๋ ์ฝ๋๋ฅผ ๊ธฐ๋กํ๋ค. / ๋คํธ์ํฌ ๋น์ฉ์ด ์ปค์ง๋ค๋ ๋จ์ ์ด ์์ผ๋ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์์ค์ ์ต์ํ(READ COMMITED) ํ ์ ์์ด์ ๋ ์ฝ๋ Lock์ ์ํฅ์ ๋ ๋ผ์น๋ค.
๐ InnoDB ์คํ ๋ฆฌ์ง ์์ง
MySQL์ด ๋ฐ๊ณ ์๋ ์์ง์ผ๋ก, ๋ ์ฝ๋ ๊ธฐ๋ฐ์ Lock์ ์ ๊ณตํ์ฌ ๋์ ๋์์ฑ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ณ , ๋งค์ฐ ์์ ์ ์ด๋ค.
์์์ ์ธ๊ธํ [ MySQL์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ]๋ฅผ ๋ค์ ๊ฐ์ ธ์๋ณด์.
InnoDB๊ฐ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ๋ ์๋์ ๊ฐ๋ค.
- ๋ฒํผ ํ (์ค์ ๋ฐ์ดํฐ + insert ๋ฒํผ + Undo ๋ ์ฝ๋)
- ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ
- Redo ๋ก๊ทธ
- ์คํ ๋ฆฌ์ง ์์คํ ํ ์ด๋ธ Space (๊ธฐ์กด์ MyISBM์ ์ด๋ฅผ ํ์ผ๋ก ๊ด๋ฆฌํด์ ์์๋ ์ํ์ด ์์๋ค.)
- ์ฌ์ฉ์ ํ ์ด๋ธ Space (Cache)
InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ํน์ง
- ํ ์ด๋ธ์ Primary Key ์์๋๋ก ์ ์ฅ๋๋ค. ์ฆ ์ธ๋ฑ์ค ํ ์ด๋ธ ๊ตฌ์กฐ๋ผ์ Range Scan์ด ๋งค์ฐ ๋น ๋ฅด๋ค.
- ์คํ๊ณํ ๊ฒฐ์ ์ ์์ด Primary Key๊ฐ ์ธ๋ฑ์ค๋ก ์ ํ๋ ํ๋ฅ ์ด ๋๋ค.
- MVCC๋ฅผ ์ด์ฉํ์ฌ ์ฝ๊ธฐ๋ฅผ ์ํํ๋๋ฐ Lock์ ๊ฑธ์ง ์๋๋ค.
- ์คํ ๋ฆฌ์ง ์์ง ๋ ๋ฒจ์์ ์ธ๋ํค๋ฅผ ์ง์ํ๋ค. ์ด๋ ๋ถ๋ชจ ํ ์ด๋ธ๊ณผ ์์ ํ ์ด๋ธ์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๊ณ , ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ InnoDB๊ฐ ํ๋ค๋ ๋ง์ด๋ผ์ ์ ๊ธ(Lock)์ด ์ ํ๋๋ ํน์ง์ด ์๋ค. ๊ทธ๋์ ์ค๋ฌด์์๋ ์ธ๋ํค ์ ์ฝ์ผ ๊ฑธ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
- ์๋ ๋ฐ๋๋ฝ ๊ฐ์ง๊ฐ ์๋ค. ๊ทธ๋ฌ๋ MySQL ์์ง์์ ๋ฐ์ํ ํ ์ด๋ธ ๋ฐ๋๋ฝ์ ํ์งํ์ง ๋ชปํ๋ค. ์ด๋ innodb_table_lock ์ ํ์ฑํํ๋ฉด ๋ ์ฝ๋ ๋ฟ ์๋๋ผ ํ ์ด๋ธ ๋ ๋ฒจ์ ๋ฐ๋๋ฝ๋ ๊ฐ์งํ์ฌ ํด๊ฒฐํ ์ ์๋ค.
- ์๋ฒ ์์์ ํธ๋์ญ์ /๋์คํฌ์ ๊ธฐ๋ก๋ ์ฅ์ ๋ฅผ ์๋์ผ๋ก ๋ณต๊ตฌํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
@ InnoDB ๋ฒํผ ํ์ด๋?
๋์คํฌ์ ๋ฐ์ดํฐ ํ์ผ์ด๋ ์ธ๋ฑ์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์บ์ํด๋๋ ๊ณต๊ฐ์ด๋ค.
์ค์ง์ ์ธ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋๋ถ๋ถ์ ๋ฒํผ ํ์ด ์ฐจ์งํ๊ฒ ๋๋ค. ๋น์ฐํ ํฌ๊ธฐ๊ฐ ํด ์๋ก ์ฑ๋ฅ์ด ํฅ์๋๋ค. ๋ค๋ง ์ค์ ์๋น์ค์์๋ ์๋ฒ RAM ์ 50% ์ ๋๋ก ํ ๋นํด๋จ๋ค๊ฐ, ์๋ฒ ์ํ๋ฅผ ๋ณด๋ฉฐ ์กฐ๊ธ์ฉ ์ฌ๋ฆฌ๋ ๊ฒ์ด ์ข๋ค. ๋ฒํผ ํ์ ๋๋ฆฌ๋๊ฑด ์ฝ์ง๋ง ์ค์ด๋๊ฑด ๋งค์ฐ ๋ถ๋ด์ค๋ฌ์ด ์์ ์ด๊ธฐ ๋๋ฌธ.
์ฟผ๋ฆฌ๋ก ์ธํด ๋ณ๊ฒฝ๋์ด์ผ ํ ๋ ์ฝ๋๋ค์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณณ ์ ๊ณณ์ ์์นํ๋ค.
์ด๋ฅผ ๋ฒํผ๋ก ํ๋ฒ์ ๋ชจ์์ ์ฐ๊ธฐ ์์ ์ ๋ง๋๋ "์ฐ๊ธฐ ์ง์ฐ"์ ์ญํ ์ ํ๋ฉฐ Durty Page (์์ง ๋์คํฌ์๋ ๊ธฐ๋ก๋์ง ์์ ๊ณต๊ฐ)๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํ์ธํ์ฌ ๋์คํฌ์ ์ ์ฅํ๋ค.
๊ธฐ์กด์ InnoDB ๋ฒํผํ์ ํ๋๋ง ์ฌ์ฉํ์๋ค. ํ์ง๋ง ๊ทธ๋ก ์ธํด ๋ฒํผํ์ ์ค๋ ๋ ๊ฒฝํฉ์ ์ํ Lock์ด ๋ง์ด ๋ฐ์ํ๊ณ , ํ์ฌ๋ ๊ทธ๋ฆผ์ฒ๋ผ ์ฌ๋ฌ ๊ฐ์ ์์ ๋ฒํผ ํ๋ก ๋๋ ์ ์๊ฒ ๋ณ๊ฒฝ๋์๋ค. innodb_buffer_pool_instances ๋ณ์๋ก ๊ฐ์๋ฅผ ์กฐ์ ๊ฐ๋ฅํ๋ค. ๋จ, ๋ฒํผํ์ ํ ๋น๋ ํฌ๊ธฐ๊ฐ 1GB ๋ฏธ๋ง์ด๋ผ๋ฉด 1๊ฐ๋ง ์์ฑ๋๋ค.
Insert๋ Update๋ฑ ๋ฐ์ดํฐ ํ์ผ์ ๋ณ๊ฒฝํ ๋์๋, ๊ทธ ๋ฐ์ดํฐ์ ์ฐ๊ด๋ ์ธ๋ฑ์ค๋ ํจ๊ป ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํ๋ค.
์ด๋ ์์ ์๋ชจ๊ฐ ํฌ๊ธฐ ๋๋ฌธ์, InnoDB ๋ฒํผํ์ ๋ณ๊ฒฝํดํํ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ ์์๊ณต๊ฐ( Change buffer )์ ๋ง๋ค์ด๋๋ค.
[ Change Buffer ]์๋ ๋ฐ์ดํฐ์ ์ฐ๊ด๋์ด ๋ณ๊ฒฝํด์ผ ํ ์ธ๋ฑ์ค ํ์ด์ง๋ฅผ ์ ์ฅํด๋๊ณ , ์ฆ์ ์ ๋ฐ์ดํธ ํ์ง ์๊ณ ์ฐ๊ธฐ์ง์ฐ์ ํตํด ํ๋ฒ์ ์ฒ๋ฆฌํ๋ค.
@ InnoDB๊ฐ ๋ฒํผํ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๋ฒํผ ํ์ 3๊ฐ์ง ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ์๋ํ๋๋ก ๊ตฌํ๋์ด ์๋ค.
- LRU + MRU ๋ฆฌ์คํธ [ page_new, page1, page2, page3, ...., page_old ]
(Most Recnetly Used, ๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉ ํ ํ์ด์ง <-> Least Recently Used, ๊ฐ์ฅ ์ค๋ซ๋์ ์ฐธ์กฐ๋์ง ์์ ํ์ด์ง) - Flush ๋ฆฌ์คํธ - ๋์คํฌ์ ๊ธฐ๋กํ Durty ํ์ด์ง๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ
- Free ๋ฆฌ์คํธ - ์์ ๋์ง ์์ Clean ํ์ด์ง๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ ( LRU+MRU์ ์๋ Clean ํ์ด์ง๊ฐ ์ฌ๊ธฐ๋ก ์ฎ๊ฒจ์ง )
- 1-1. InnoDB๋ ํ์ํ ๋ฐ์ดํฐ(๋ ์ฝ๋)๊ฐ ์๋ค๋ฉด ๋จผ์ ๋ฒํผ ํ์ ์กด์ฌ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ค.
( ์ด๋ํฐ๋ธ ํด์ฌ ์ธ๋ฑ์ค๋ก ํ์ด์ง๊ฒ์ โก ํ ์ด๋ธ ์ธ๋ฑ์ค B-Tree๋ฅผ ์ด์ฉํด ๋ฒํผํ ํ์ โก ์ฐพ์๋ค๋ฉด ํด๋น ํ์ด์ง ํฌ์ธํฐ๋ฅผ MRU ์ชฝ์ผ๋ก ์น๊ธ) - 1-2. ๋ง์ฝ ๋ฒํผํ์ ์๋ค๋ฉด, ๋์คํฌ๋ฅผ ์ฝ์ด ๋ฒํผํ์ ์ ์ฌํ๊ณ ํด๋น ํ์ด์ง์ ํฌ์ธํฐ๋ฅผ LRU ํค๋์ ์ถ๊ฐํ๋ค.
- 2. ์๋ํ๋ค๊ฐ LRU ํค๋ ๋ถ๋ถ์ ์ ์ฌ๋ ๋ฐ์ดํฐ๊ฐ ์ฝํ๋ค๋ฉด MRU ๋ฐฉํฅ์ผ๋ก ํฌ์ธํฐ๋ฅผ ์ด๋ํ๋ค.
๋จ ๋๋ ์ฝ๊ธฐ์ ๊ฒฝ์ฐ ์ค์ ์ฟผ๋ฆฌ๋ณด๋ค ๋ ๋ง์๋์ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋๋ MRU ์ด๋์ด ๋ฐ์ํ์ง ์๋๋ค. - 3. ์ค๋ซ๋์ ์ฌ์ฉํ์ง ์์ LRU ๋๋ถ๋ถ์ผ๋ก ๋ฐ๋ ค๋ ๊ฒฝ์ฐ(Aging) ๋ฒํผ ํ์ ๊ณต๊ฐ์ ํ๋ณด(Eviction)ํ ๋ ์ญ์ ๋๋ค.
- 4. ๋ฐ๋๋ก ๋ฐ์ดํฐ๊ฐ ์์ฃผ ์ ๊ทผ๋์ด MRU ๋ถ๋ถ์ผ๋ก ์๋ค๋ฉด ํด๋น ํ์ด์ง๋ฅผ [ ์ด๋ํฐ๋ธ ํด์ ์ธ๋ฑ์ค ]์ ์ถ๊ฐํ๋ค.
๋ค๋ง ์ด๋ ๊ฒ ๋ฒํผ๋ฅผ ๊ฑฐ์ณ์ ๋์ํ๊ฒ๋๋ฉด, ์ค์ ๋์คํฌ์๋ ๋์ค์ ๊ธฐ๋ก๋๋ฏ๋ก DB์ ACID๋ฅผ ๋ณด์ฅํ ์ ์๋ค.
๊ทธ๋์ InnoDB๋ ReDo ๋ก๊ทธ๋ผ๋๊ฑธ ์ฌ์ฉํ๋ค.
InnoDB ๋ฒํผํ์๋ ๋์คํฌ์ ๋์ผํ ์ํ์ธ Clean Page์ ์ฟผ๋ฆฌ๋ก ๋ณ๊ฒฝ๋ Durty Page๊ฐ ํจ๊ป ์์ ๊ฒ์ด๋ค.
Redo ๋ก๊ทธ๋ Durty Page์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฆฌ์คํธ์ด๋ฉฐ ์๊ณผ ๋ค๊ฐ ์ฐ๊ฒฐ๋ ์ํ ๋ฆฌ์คํธ์ฒ๋ผ ์ฌ์ฉํ๋ค.
์ฆ, ๊ณ์ ์ฌ์ฉํ๋ค๋ณด๋ฉด Redo ๋ก๊ทธ์ ์๋ ์ง์ ์ (Log Entry)์ ์ธ์ ๊ฐ ๋ฎ์ด ์์์ง๊ฒ ๋๋ค.
์ฌ๊ธฐ์์ ์์ง ๊ธฐ๋ก์ด ์๋์ ์ฌ์ฌ์ฉํ๋ฉด ์๋๋ ๊ณณ์ Active Redo Log์ด๋ผ ๋ถ๋ฅธ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ก๊ทธ๋ ๊ณ์ ์ฆ๊ฐํ๋ ์ซ์์ธ LSN (Log Sequence Number)์ ์ฌ์ฉํ๋ค. InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ์ฃผ๊ธฐ์ ์ผ๋ก Redo๋ก๊ทธ์ ๋ด์ฉ์ ๋์คํฌ์ ์ ์ฅํ๋ ์ฒดํฌํฌ์ธํธ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋๋ฐ ์ด ๋ LSN์ ๊ธฐ์ค์ผ๋ก ์ ์ฅํ๋ค.
๊ทธ๋์ LSN์ ์ด์ฉํด์ ๊ฐ์ฅ ์ต๊ทผ ์ฒดํฌํฌ์ธํธ์ ๋ง์ง๋ง Redo log ์ํธ๋ฆฌ์ ์ฐจ์ด๋ฅผ [ Checkpoint Age ]๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋ง ๊ทธ๋๋ก ์์ง ๋์คํฌ์ ์ ์ฅ๋์ง ์์ ํ์ด์ง ๊ฐ์์ด๋ค.
์ฐธ๊ณ ๋ก Redo ๋ก๊ทธ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ญ๋น๋ฅผ ๋ง๊ธฐ ์ํด์ ์ ์ฒด ํ์ด์ง๊ฐ ์๋๋ผ, ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๊ธฐ๋กํด๋๋ค.
๊ทธ๋์ ํ๋์จ์ด ์ค์๋, ์๋ฒ ๋ค์ด๋ฑ์ด ๋ฐ์ํ๋ฉด Redo๋ก๊ทธ๋ง์ผ๋ก๋ ๋ณต๊ตฌ ํ ์ ์๋๋ฐ, ์ด๋ฅผ ์ํด InnoDB์์ Double Write Buffer๋ฅผ ์ ๊ณตํ๋ค.
์ฝ๊ฒ ๋งํ๋ฉด ํ์ผ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๊ธฐ๋กํ๊ธฐ ์ , ๋ฐ๋ก InnoDB ์์คํ ํ ์ด๋ธ๊ณต๊ฐ(DoubleWrite Buffer)์ ๋ํฐ ํ์ด์ง๋ฅผ ๋ณต์ฌํด๋๋ค. ์ด๋ MySQL ์๋ฒ๋ฅผ ์์ํ ๋ '๋ณต๊ตฌ' ์ฉ๋๋ก๋ง ์ฌ์ฉ๋๋ค. ๊ทธ๋์ ๋์ถฉ ๊ธฐ๋ก๋ง ํด๋๊ณ ๋ง์ฝ ํ๋์จ์ด ์ค์๋, ์๋ฒ ์ฅ์ ๋ฑ์ด ๋ฌ์ ๋ DoubleWrite ๋ฒํผ ๋ด์ฉ์ ํ๋ํ๋ ๋ชจ๋ ๋น๊ตํด์ ๋ค๋ฅธ ๋ด์ฉ์ ๋ด์ ํ์ด์ง๊ฐ ์๋ค๋ฉด, ๋ฒํผ์ ์๋ ๋ด์ฉ์ผ๋ก ๋ฎ์ด์์ด๋ค.
๋ด์ฉ์ ๋ณด๋ฉด I/O ์์ ์ ์๋นํ ๋ถํ๋ฅผ ์ค ๊ฒ ๊ฐ์ง๋ง, ํ๋๋์คํฌ์ ํน์ฑ์ ์ฐ์๋ ์์ฐจ๊ธฐ๋ก์ ๊ฑฐ์ ๋ถ๋ด์ด ๋์ง ์๋๋ค.
๋ค๋ง SSD์ ๊ฒฝ์ฐ ๋๋ค I/O์ ์์ฐจ I/O ๋ ๋ค ๋ถ๋ด์ด ๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ด ์ค์ํ ๊ฒฝ์ฐ์๋ง innodb_doublewrite ๋ณ์๋ก ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๋ง์ฝ ์ฑ๋ฅ์ ๋์ด๋ ค๊ณ [Redo ๋ก๊ทธ ๋๊ธฐํ ๊ธฐ๋ฅ]_(innodb_flush_log_at_trx_commit) ์ offํ๋ค๋ฉด, ์ด ๊ธฐ๋ฅ๋ ํจ๊ป ๊บผ์ ์ฑ๋ฅ์ ํฅ์ ์ํค๋๋ก ํ์.
@ ์ด๋ ๊ฒ๊น์ง Redo๋ก๊ทธ๋ฅผ ์ค๋ช ํ ์ด์ ๋, ์๋์ ์์๋ฅผ ์ดํดํ๊ธฐ ์ํจ์ด๋ค.
1 ๋ฒํผํ์ 100GB ์ธ๋ฐ, Redo ๋ก๊ทธ์ ์ ์ฒด ํฌ๊ธฐ๋ 100MB์ธ ๊ฒฝ์ฐ
2 ๋ฒํผํ์ 100MB ์ธ๋ฐ, Redo ๋ก๊ทธ์ ์ ์ฒด ํฌ๊ธฐ๋ 100GB์ธ ๊ฒฝ์ฐ
1๋ฒ์ ๊ฒฝ์ฐ Redo๋ก๊ทธ์ ํฌ๊ธฐ๊ฐ 100MB๋ผ์, ๋ก๊ทธ์ ํฌ๊ธฐ(Checkpoint Age)๋ ์ต๋ 100MB๋ง ํ์ฉ๋๋ค.
๋ง์ฝ ํ๊ท ์ ์ธ ๋ก๊ทธ์ ํฌ๊ธฐ๊ฐ 4KB๋ผ๋ฉด, ๋์ถฉ 25600๊ฐ์ ํ์ด์ง๋ง ๋ฒํผ ํ์ ์ ์ฅํ ์ ์๋ค๋ ๋ง์ด๋ค. ์ด ๊ฒฝ์ฐ ๋ฒํผํ์ ์๋ฌด๋ฆฌ ํฌ๊ฒ ํ ๋นํ๋ค๊ณ ํ๋ค, Redo ๋ก๊ทธ ํฌ๊ธฐ๊ฐ ๋ถ์กฑํด์ ๋๋ถ๋ถ(99G ์ ๋๊ฐ) ์ฌ์ฉํ์ง ์๊ณ ๋น์ด์๊ฒ ๋๋ค.
2๋ฒ์ ๊ฒฝ์ฐ ์ด๋ก ์ ์ผ๋ก๋ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ ์๋ ์๊ฒ ๋ค. ๊ทธ๋ฅ ๋ฒํผ ํ์ด ์์๊ฑฐ๋๊น
ํ์ง๋ง JVM์ GC๋ฅผ ์๊ฐํด๋ณด์. 2๋ฒ์ ์ํ๋ก ์๋น์ค๋ฅผ ์ด์ํด์ Checkpoint Age๊ฐ ์ด๋ง์ด๋งํ๊ฒ ์ปค์ง๋ค๋ฉด, ์ด๋ค ์ํฉ์ด ๋ฐ์ํ ๊น? InnoDB ์์ง์ ํ๋ฒ์ ์ด๋ง์ด๋งํ ๋์คํฌ ์์ ์ ๋ฐ๊ฒ๋์ด ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ์ง ๋ชปํ ๊ฒ์ด๋ค.
@ MVCC (Multi Version Concurrency Control), Undo ๋ก๊ทธ
Undo ๋ก๊ทธ๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ (Update, Delete) ๋ณ๊ฒฝ๋๊ธฐ ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๋ ๊ณต๊ฐ์ด๋ค.
๋กค๋ฐฑ์ด๋ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์์ค์ ๋์ํ๋ MVCC์ ์ฌ์ฉ๋๋ค.
MVCC๋ ํ๋์ ๋ ์ฝ๋์ ๋ํด ์ฌ๋ฌ๊ฐ์ง ๋ฒ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฝ๊ฒ๋งํด ํธ๋์ญ์ ์ ์ปค๋ฐ/๋กค๋ฐฑ ์ฌ๋ถ๋ ๊ด๊ณ์์ด, ํญ์ ๋ณ๊ฒฝ ์ด์ ์ ๋ ์ฝ๋๋ฅผ Undo๋ก๊ทธ์ ๋จ๊ฒจ๋๋ค.
๊ตณ์ด ์ด๋ ๊ฒ ์ฌ์ฉํ๋ ์ด์ ๋, ํธ๋์ญ์ ๋ฐ์ดํฐ ์ ํฉ์ฑ(REPEATABLE READ)๋ฅผ ์ค๋ ๋ Lock ์์ด ๊ตฌํํ๊ธฐ ์ํจ์ด๋ค.
ํ ํธ๋์ญ์ ์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ๋ฒ ์ฝ์์ ๋, ๋ฐ์ดํฐ์ ๊ฐ์ด ๋ฌ๋ผ์ง ์ ์๋ ์ ํฉ์ฑ ๋ฌธ์ ๋ฅผ Undo ๋ก๊ทธ๋ก ํด๊ฒฐํ๋ค.
๋จ, ์ด๋ ๊ฒ Undo๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋์ญ์ ์ ๋ฒ์๊ฐ ๊ธธ์ด์ง๊ณ ์ด์ ๋ฒ์ ์ ๋ ์ฝ๋(๋ฐ์ดํฐ)๋ค์ด ์์ฌ์ ์์คํ ํ ์ด๋ธ์ ๋ญ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ [REPEATABLE_READ๋ฅผ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ์์ค์ผ๋ก ์ฌ์ฉ]ํ๋ค๋ฉด ํธ๋์ญ์ ๋ฒ์๋ฅผ ์ต์ํํ ํ์๊ฐ ์๋ค.
'๐ฑBackend > DB(MySQL,PostgreSQL)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ฆฌ์ค-5 (0) | 2021.10.27 |
---|---|
์ ๋ฆฌ์ค - 4 (0) | 2021.10.20 |
์ ๋ฆฌ์ค - 3 (0) | 2021.10.20 |
์ ๋ฆฌ์ค #1 ์์ง ์ํคํ ์ฒ (0) | 2021.10.13 |
1. MySQL์ ๋ฌด์์ธ๊ฐ (0) | 2021.10.13 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev