๋ฆฌํฌํ ์ฉ PostgreSQL ์ฝ๊ธฐ ๋ณต์ ๋ณธ: ๋์๋ณด๋๋ฅผ ๋น ๋ฅด๊ฒ ์ ์งํ์ธ์
๋ฆฌํฌํ ์ฉ PostgreSQL ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ ์ฌ์ฉํ๋ฉด ๋์๋ณด๋์ ๋ฌด๊ฑฐ์ด ์ฟผ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํด ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋๋ฆฌ๊ฒ ํ์ง ์์ผ๋ฉด์ ๋์๋ณด๋๋ฅผ ๋น ๋ฅด๊ฒ ์ ์งํ ์ ์์ต๋๋ค.

๋ฆฌํฌํ ์ด ๊ธฐ๋ณธ(primary) ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋๋ฆฌ๊ฒ ํ๋ ์ด์
ํํ ํจํด์ ์ด๋ ์ต๋๋ค: ๋๋ถ๋ถ์ ์๊ฐ ๋์ ์ฑ์ ๊ด์ฐฎ๊ฒ ๋๊ปด์ง๋ค๊ฐ ๋๊ตฐ๊ฐ ๋์๋ณด๋๋ฅผ ์ด๋ฉด ๊ฒฐ์ (checkout), ๋ก๊ทธ์ธ ๋๋ ์ง์ ๋๊ตฌ๊ฐ ๊ฐ์๊ธฐ ๋๋ ค์ง๋๋ค. ์๋ฌด๊ฒ๋ โ๋ค์ดโ ๋์ง๋ ์์ง๋ง ๋ชจ๋ ๊ฒ์ด ๋๋ ค์ง๋ ์ํฉ์ด์ฃ . ๋ณดํต ์ด๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ ๋ฐฉํฅ์ผ๋ก ๋์์ ๋๋ ค๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํธ๋์ญ์ (์ผ์์ ์ธ ์ฑ ์์ )์ ์งง๊ณ ์ ํ์ ์ ๋๋ค. ์์์ ํ์ ์ฝ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๊ณ , ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋น ๋ฅด๊ฒ ๋๋ ๋ค๋ฅธ ์์ฒญ์ด ์งํ๋๋๋ก ํฉ๋๋ค. ๋ฐ๋ฉด ๋ฆฌํฌํ ์ฟผ๋ฆฌ๋ ๋ฌ๋ฆฌ ๋์ํฉ๋๋ค. ๋ณดํต ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ค์บํ๊ณ , ์ฌ๋ฌ ํ ์ด๋ธ์ ์กฐ์ธํ๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ๊ณ ๊ทธ๋ฃนํํ๋ฉฐ ์ผ๋ณยท์๋ณ ํฉ๊ณ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ง์ ์ ์ผ๋ก ์ฐ๊ธฐ๋ฅผ ์ฐจ๋จํ์ง ์๋๋ผ๋ ์ฑ์ด ํ์ํ ๋์ผํ ๊ณต์ ์์์ ์๋ชจํ ์ ์์ต๋๋ค.
๋์๋ณด๋๊ฐ OLTP ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ผ์น๋ ์ผ๋ฐ์ ์ธ ์ํฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฌด๊ฑฐ์ด ์ฝ๊ธฐ ์์ ์ด CPU, ๋ฉ๋ชจ๋ฆฌ, ๋์คํฌ I/O๋ฅผ ๊ฒฝ์ํจ
- ํฐ ์ค์บ์ด ์บ์์ "ํซ" ํ์ด์ง๋ฅผ ๋ฐ์ด๋ด ์ผ๋ฐ ์ฟผ๋ฆฌ๊ฐ ๋๋ ค์ง
- ํฐ ์ ๋ ฌ๊ณผ GROUP BY๊ฐ ๋์คํฌ๋ก ์คํ๋์ด ๋ถํ๋ฅผ ๊ธ์ฆ์ํด
- ์ฅ๊ธฐ ์คํ ์ฟผ๋ฆฌ๊ฐ ๊ฒฝ์์ ์ฆ๊ฐ์์ผ ์คํ์ดํฌ๊ฐ ๊ธธ๊ฒ ์ง์๋จ
- ์์์ ํํฐ(๋ ์ง ๋ฒ์, ์ธ๊ทธ๋จผํธ)๊ฐ ๋ถํ๋ฅผ ์์ธก ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ฆ
์ฝ๊ธฐ ๋ณต์ ๋ณธ(read replica)์ ๊ธฐ๋ณธ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ๋ณต์ฌํ๋ฉด์ ์ฝ๊ธฐ ์ ์ฉ ์ฟผ๋ฆฌ๋ฅผ ์ ๊ณตํ ์ ์๋ ๋ณ๋์ PostgreSQL ์๋ฒ์ ๋๋ค. ๋ฆฌํฌํ ์ฉ PostgreSQL ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ ์ฌ์ฉํ๋ฉด ๋์๋ณด๋์ ๋ฌด๊ฑฐ์ด ์์ ์ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ฎ๊ฒจ ๊ธฐ๋ณธ์ ๋น ๋ฅธ ํธ๋์ญ์ ์ ์ง์คํ ์ ์์ต๋๋ค.
์ด๊ธฐ์ ์ ํด์ผ ํ ๊ธฐ๋์น๋ ์ด๋ ์ต๋๋ค: ๋ฆฌํ๋ฆฌ์นด๋ ์ฝ๊ธฐ๋ฅผ ๋์์ฃผ์ง๋ง ์ฐ๊ธฐ๋ฅผ ๋์ง ์์ต๋๋ค. ์ผ๋ฐ ๋ณต์ ๋ณธ์ ์์ ํ๊ฒ INSERT/UPDATE๋ฅผ ๋ณด๋ด๋ฉด ์ ๋๋ฉฐ, ๋ณต์ ์๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฏ๋ก ๊ฒฐ๊ณผ๊ฐ ๊ธฐ๋ณธ๋ณด๋ค ์ฝ๊ฐ ๋ค์ฒ์ง ์ ์์ต๋๋ค. ๋ง์ ๋์๋ณด๋์๋ ์ฝ๊ฐ ๋ ์ต์ ์ธ ์์น๋ฅผ ์์ฉํ๊ณ ์ผ๊ด๋ ์ฑ ์ฑ๋ฅ์ ์ป๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ธ ํธ๋ ์ด๋์คํ์ ๋๋ค.
๋ด๋ถ ๋์๋ณด๋(์: AppMaster์์)๋ฅผ ๋ง๋ ๋ค๋ฉด ์ด ๋ถ๋ฆฌ๋ ์ ๋ง์ ๋๊ฐ ๋ง์ต๋๋ค: ์ฑ์ ๊ธฐ๋ณธ์ ๊ณ์ ์ฐ๊ธฐ๋ฅผ ํ๊ณ , ๋ฆฌํฌํ ํ๋ฉด์ ๋ฆฌํ๋ฆฌ์นด๋ฅผ ์กฐํํฉ๋๋ค.
PostgreSQL์์ ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ด ์๋ํ๋ ๋ฐฉ์(์ฝ๊ฒ ์ค๋ช )
PostgreSQL ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ ๋ฉ์ธ(primary) ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฑฐ์ ์ค์๊ฐ ๋ณต์ฌ๋ณธ์ ์ ์งํ๋ ๋ ๋ฒ์งธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ฐ๊ธฐ(INSERT, UPDATE, DELETE)๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๋ณต์ ๋ณธ์ ์ฃผ๋ก ์ฝ๊ธฐ(SELECT)๋ฅผ ์ ๊ณตํ๋ฏ๋ก ๋ฆฌํฌํ ์ฟผ๋ฆฌ๊ฐ ์ผ์์ ํธ๋์ญ์ ๊ณผ ๊ฒฝ์ํ์ง ์์ต๋๋ค.
1๋ถ ์์ฝ: ๊ธฐ๋ณธ vs ๋ณต์ ๋ณธ
๊ธฐ๋ณธ์ ๋ถ์ฃผํ ์์ ์ ๊ณ์ฐ๋๋ก ์๊ฐํ์ธ์: ์ฌ๊ณ , ๊ฒฐ์ , ์ฃผ๋ฌธ์ ์ ๋ฐ์ดํธํ๋ฏ๋ก ๋ฐ์์ฑ์ด ์ค์ํฉ๋๋ค. ๋ณต์ ๋ณธ์ ํต๊ณ์ ์ถ์ธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ ๊ดํ๊ณผ ๊ฐ์ต๋๋ค. ๊ณ์ฐ๋์ ๋์์ ๊ด์ฐฐํ๊ณ ๊ณง๋ฐ๋ก ์์ ์ ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
๋ด๋ถ์ ์ผ๋ก PostgreSQL์ ๊ธฐ๋ณธ์์ ๋ฌด์จ ๋ณํ๊ฐ ์ผ์ด๋ฌ๋์ง ์คํธ๋ฆผ์ผ๋ก ๋ณด๋ด๊ณ , ๋ณต์ ๋ณธ์์ ์ด๋ฅผ ์ฌ์(replay)ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ณต์ ๋ณธ์ ๋์ผํ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง์ง๋ง ์ฝ๊ฐ ๋ค์ฒ์ง ์ ์์ต๋๋ค.
์ค๋ฌด์ ์ผ๋ก ๋ณต์ ๋ ๋ค์์ ๋ณต์ฌํฉ๋๋ค:
- ํ ์ด๋ธ ๋ฐ์ดํฐ(ํ)
- ์ธ๋ฑ์ค ๋ณ๊ฒฝ์ฌํญ(์ฟผ๋ฆฌ๊ฐ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅ)
- ์คํค๋ง ๋ณ๊ฒฝ(์ ์ปฌ๋ผ, ์ ํ ์ด๋ธ, ๋ง์ ์ ํ์ ๋ง์ด๊ทธ๋ ์ด์ )
- ์ ์ SQL์ ํตํด ์ผ์ด๋๋ ๋๋ถ๋ถ์ ๋ค๋ฅธ DB ๋ณ๊ฒฝ
๋ณต์ ๋ณธ์ด ํด๊ฒฐํ์ง ๋ชปํ๋ ๊ฒ: ๋ฌด๊ฑฐ์ด ์ฐ๊ธฐ๋ฅผ ์ ๋ ดํ๊ฒ ๋ง๋ค์ง ๋ชปํ๊ณ , ๋์ ์คํค๋ง๋ ๋๋ฝ๋ ์ธ๋ฑ์ค๋ก ์ธํ ๋๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ณ ์ณ์ฃผ์ง ์์ต๋๋ค. ๋ฆฌํ๋ฆฌ์นด์์๋ ๋์๋ณด๋ ์ฟผ๋ฆฌ๊ฐ ๊ฑฐ๋ํ ํ ์ด๋ธ์ ์ค์บํ๋ฉด ๋๋ฆด ์ ์์ต๋๋ค. ๋จ์ง ๊ทธ ๋๋ฆผ์ด ๋์์ ์ฒดํฌ์์์ ๋๋ฆฌ๊ฒ ๋ง๋ค์ง๋ ์์ต๋๋ค.
์ด ๋๋ฌธ์ PostgreSQL ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ ๋ฆฌํฌํ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ธ๊ธฐ ์์ต๋๋ค: OLTP(๋น ๋ฅด๊ณ ๋น๋ฒํ ํธ๋์ญ์ ) ์์ ์ OLAP ์คํ์ผ(๊ธด ์ฝ๊ธฐ, ๊ทธ๋ฃนํ, ์ง๊ณ) ์์ ๊ณผ ๋ถ๋ฆฌํด ์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ด๋ถ ๋์๋ณด๋๋ ๊ด๋ฆฌ์ ํจ๋์ ๋ง๋ค ๋(์: AppMaster) ๋ฆฌํฌํ ํ์ด์ง๋ฅผ ๋ณต์ ๋ณธ์ผ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋ ์ธก๋ฉด์ ๋ชจ๋ ๋ง์กฑ์ํค๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๋ฆฌํ๋ฆฌ์นด์ ์ ํฉํ ์ผ๋ฐ์ ์ธ ๋ฆฌํฌํ ์ํฌ๋ก๋
์ข์ ๊ท์น์ ์ด๋ ์ต๋๋ค: ์ฟผ๋ฆฌ๊ฐ ์ฃผ๋ก ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์์ฝ(read a lot of data to summarize)ํ๋ ๊ฒฝ์ฐ ๋ฆฌํ๋ฆฌ์นด์์ ์คํํ๊ธฐ์ ์ ํฉํ ํ๋ณด์ ๋๋ค. PostgreSQL ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ ๋ฆฌํฌํ ์ ์ฌ์ฉํ๋ฉด ์ฒดํฌ์์ ํ๋ก์ฐ, ๋ก๊ทธ์ธ ๋ฑ ํธ๋์ญ์ ์์ ์ ๋์๋ณด๋์ ๋ฌด๊ฑฐ์ด ์์ ์ผ๋ก๋ถํฐ ๋ณดํธํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ํํ ๋์๋ณด๋ ํจํด์ ๋์ ๋ ์ง ๋ฒ์์ ๋ช ๊ฐ์ ํํฐ์ ๋๋ค. โ์ง๋ 90์ผ์ ์ง์ญ, ์ํ, ์ฑ๋๋ณ๋กโ๋ ์ต์ข ์ฐจํธ์ 12๊ฐ ๋ง๋๋ง ์์ด๋ ์๋ฐฑ๋ง ํ์ ๊ฑด๋๋ฆด ์ ์์ต๋๋ค. ์ด๋ฐ ์ค์บ์ ๊ธฐ๋ณธ DB์ ๋์คํฌ ์ฝ๊ธฐ ๋ฐ ์บ์ ๊ณต๊ฐ์ ๋๊ณ ๊ฒฝ์ํฉ๋๋ค.
๋ฆฌํ๋ฆฌ์นด์ ์ ํฉํ ์ํฌ๋ก๋
๋๋ถ๋ถ์ ํ์ ๋ค์ ์์ ๋ค์ ๋ฆฌํฌํ DB๋ก ์ฎ๊ธฐ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค:
- ์ฌ๋ฌ ํ ์ด๋ธ์ ๊ฑธ์น ํฐ ์กฐ์ธ(orders + items + customers + refunds)
- SUM, COUNT DISTINCT, ๋ฐฑ๋ถ์์, ์ฝํธํธ ๊ฐ์ ์ง๊ณ
- ํฐ ๊ฒฐ๊ณผ ์งํฉ์ ์ ๋ ฌํ๊ณ ๊ทธ๋ฃนํํ๋ ์ฅ๊ธฐ ์คํ ์ฟผ๋ฆฌ
- ๋งค์๊ฐ/๋งค์ผ ์คํ๋๋ ์ค์ผ์ค๋ ๋ณด๊ณ ์(๊ฐ์ ๋ฌด๊ฑฐ์ด ์์ ์ ๋ฐ๋ณต)
- ์ฌ๋๋ค์ด ํด๋ฆญํ๋ฉฐ ๋ฐ๋ณต์ ์ผ๋ก ๋ณํ์ ์คํํ๋ ํ์์ BI ์ธ์
์ฟผ๋ฆฌ๊ฐ โ์ฝ๊ธฐ ์ ์ฉโ์ด๋ผ ํด๋ CPU, ๋ฉ๋ชจ๋ฆฌ, I/O๋ฅผ ์๋ชจํ ์ ์์ต๋๋ค. ํฐ GROUP BY๋ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ผ๋ก ๋ฐ์ด๋ผ ์ ์๊ณ , ๋ฐ๋ณต ์ค์บ์ ๋ฒํผ ์บ์๋ฅผ ์๋ชจํด ๊ธฐ๋ณธ์ด ๋์คํฌ์์ ๋ ์์ฃผ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
์ฐ๊ฒฐ(connection) ๋์๋ ์ค์ํฉ๋๋ค. ๋ง์ BI ๋๊ตฌ๋ ์ฌ์ฉ์๋น ์ฌ๋ฌ ์ฐ๊ฒฐ์ ์ด๊ณ ํ์ผ์ ๋ช ๋ถ๋ง๋ค ๊ฐฑ์ ํ๋ฉฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ถ์ถ์ ์คํํฉ๋๋ค. ์ด๋ ๊ฐ์์ค๋ฐ ์ฐ๊ฒฐ ๋ฐ ๋์ ์ฟผ๋ฆฌ ์คํ์ดํฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๋ฆฌํ๋ฆฌ์นด๋ ๊ทธ๋ฐ ์คํ์ดํฌ๊ฐ ์์ ํ๊ฒ ๋จ์ด์ง ์ฅ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ฐ๋จํ ์: ์ค์ 9์์ ์ด์ ๋์๋ณด๋๋ฅผ ์ด๋ฉด 50๋ช ์ด ๋์์ ์ด์ด ๊ฐ ํ์ด์ง ๋ทฐ๊ฐ ์ฌ๋ฌ ์์ ฏ์ ํธ๋ฆฌ๊ฑฐํ๊ณ ๊ฐ ์์ ฏ์ ๋ค๋ฅธ ํํฐ๋ก ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค. ๊ธฐ๋ณธ DB์์๋ ๊ทธ ๊ธ์ฆ์ผ๋ก ์ฃผ๋ฌธ ์์ฑ์ด ๋๋ ค์ง ์ ์์ง๋ง, ๋ฆฌํ๋ฆฌ์นด์์๋ ๋์๋ณด๋๊ฐ ๋๋ฆฌ๊ฑฐ๋ ์ฝ๊ฐ ๋ค์ฒ์ง ์ ์์ด๋ ํธ๋์ญ์ ์ ๋น ๋ฅด๊ฒ ์ ์ง๋ฉ๋๋ค.
AppMaster ๊ฐ์ ํ๋ซํผ์์ ๋ด๋ถ ๋์๋ณด๋๋ฅผ ๋น๋ํ๋ค๋ฉด, ๋ฆฌํฌํ ํ๋ฉด์ ๋ฆฌํ๋ฆฌ์นด ์ฐ๊ฒฐ๋ก ์ง์ ํ๋ ๊ฒ์ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๊ฐ ๋ช ์ด(๋๋ ๋ช ๋ถ) ๋ฆ์ ์ ์๋ค๋ ์ ์ ์ดํดํ๋ ํ ์ฌ์ด ์ด์ ์ ๋๋ค.
ํธ๋ ์ด๋์คํ: ์ต์ ์ฑ vs ์๋(๋ณต์ ์ง์ฐ)
์ฝ๊ธฐ ๋ณต์ ๋ณธ์ ๋์๋ณด๋๋ฅผ ๋น ๋ฅด๊ฒ ์ ์งํด ์ฃผ์ง๋ง ๋๊ฐ๊ฐ ์์ต๋๋ค: ๋ณต์ ๋ณธ์ ๋ณดํต ์ฝ๊ฐ ๋ค์ฒ์ง๋๋ค. ์ด ์ง์ฐ์ ๋ณต์ ์ง์ฐ(replication lag)์ด๋ผ๊ณ ํ๋ฉฐ, PostgreSQL ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ ๋ฆฌํฌํ ์ ์ฌ์ฉํ๋ ํต์ฌ ํธ๋ ์ด๋์คํ์ ๋๋ค.
์ฌ์ฉ์๊ฐ ์ธ์งํ๋ ๊ฒ์ ๋จ์ํฉ๋๋ค: ์ค๋์ ์์น๊ฐ ์กฐ๊ธ ๋ฎ๋ค, ์ต์ ์ฃผ๋ฌธ์ด ๋ณด์ด์ง ์๋๋ค, ์ฐจํธ๊ฐ ๋ช ๋ถ ๋ฆ๊ฒ ์ ๋ฐ์ดํธ๋๋ค. ๋๋ถ๋ถ์ ์ฌ๋์ ์ฃผ๊ฐ ์ถ์ธ๊ฐ 2๋ถ ์ ๋ ๋ฆ์ด๋ ๊ด์ฐฎ์ง๋ง โ๊ฒฐ์ ๊ฐ ๋ฐฉ๊ธ ์ฑ๊ณตํ๋คโ๋ ๋ทฐ๊ฐ ํ๋ฆฌ๋ฉด ๋ฌธ์ ๋ฅผ ์ผ์ต๋๋ค.
์ง์ฐ์ ๊ธฐ๋ณธ์ด ๋ณต์ ๋ณธ๋ณด๋ค ๋ ๋น ๋ฅด๊ฒ ๋ณ๊ฒฝ์ ์์ฑํ ๋ ๋ฐ์ํฉ๋๋ค. ํํ ์์ธ์ผ๋ก๋ ์ฐ๊ธฐ ํญ์ฃผ(ํ๋์ ์ธ์ผ, ๋๋ ์ํฌํธ), ์ ํ๋ ๋คํธ์ํฌ ๋์ญํญ, ๋๋ฆฐ ๋ณต์ ๋ณธ ๋์คํฌ, ํน์ ๋ณต์ ๋ณธ์ด ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํ๋ ๋์ CPU์ I/O๋ฅผ ๊ฒฝ์ํ๋ ์ฅ๊ธฐ ์ฟผ๋ฆฌ ๋ฑ์ด ์์ต๋๋ค.
ํ์ฉ ๊ฐ๋ฅํ ์ง์ฐ์ ๊ฒฐ์ ํ๋ ์ค์ฉ์ ๋ฐฉ๋ฒ์ ๋์๋ณด๋๊ฐ ์ง์ํ๋ ์์ฌ๊ฒฐ์ ์ ๋ง์ถ๋ ๊ฒ์ ๋๋ค:
- ๊ฒฝ์์ง KPI ๋์๋ณด๋: ๋ช ์ด์์ ๋ช ๋ถ์ ๋ณดํต ๊ด์ฐฎ์
- ์ด์ ๋๊ธฐ์ด(๋ฐฐ์ก, ์ง์): ๋ณดํต ๋ช ์ด ๋จ์์ ๊ทผ์ค์๊ฐ ๋ชฉํ
- ํ๊ณ ๋ง๊ฐ/๊ฐ์ฌ: ์ ์ด๋ ์ค๋ ์ท์ผ๋ก ์คํ(โ๋ผ์ด๋ธโ ์๋)
- ๊ณ ๊ฐ ๋์ "๋ด ์ต๊ทผ ์ฃผ๋ฌธ": ๊ทผ์ค์๊ฐ ๋๋ ๊ธฐ๋ณธ DB ์ฌ์ฉ
๊ฐ๋จํ ๊ท์น: ๋ณด๊ณ ์๊ฐ ์ต์ ์ปค๋ฐ๋ ํธ๋์ญ์ ์ ๋ฐ๋์ ํฌํจํด์ผ ํ๋ค๋ฉด ๊ธฐ๋ณธ DB(๋๋ ์ต์ ์ฑ์ ๋ณด์ฅํ๋ ์์คํ )๋ฅผ ์กฐํํด์ผ ํฉ๋๋ค. ์ ํ์ ์ธ ์๋ ์ฒดํฌ์์ ์ค ์ฌ๊ณ ๊ฐ์ฉ์ฑ, ์ฌ๊ธฐ(fraud) ๊ฒ์ฌ, ์ฆ์ ์กฐ์น๊ฐ ํ์ํ ๊ฒ๋ค์ ๋๋ค.
์์: ์์ ํ ๋์๋ณด๋๋ ๋ฆฌํ๋ฆฌ์นด์์ ์ฝ๊ณ 1๋ถ๋ง๋ค ์๋ก๊ณ ์นจํด๋ ์์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ "์ฃผ๋ฌธ ํ์ธ" ํ์ด์ง๋ ๋ฐ๋ก ๋ฐฉ๊ธ ์์ฑ๋ ์ฃผ๋ฌธ์ด "์์"์ผ๋ก ๋ณด์ด๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ๊ธฐ๋ณธ์ ์ฝ์ด์ผ ํฉ๋๋ค.
์ฑ์ด๋ ๋ ธ์ฝ๋ ๋๊ตฌ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ ํํ๊ฒ ํด ์ค๋ค๋ฉด(์: AppMaster์์ ์ฝ๊ธฐ ์ ์ฉ ํ๋ฉด์ ๋ฆฌํ๋ฆฌ์นด๋ก ์ง์ ) UI๋ฅผ ๋ฐ๊พธ์ง ์๊ณ ์ด ๋ถ๋ฆฌ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
๋จ๊ณ๋ณ: ๋์๋ณด๋๋ฅผ ์ํ ์ฝ๊ธฐ ๋ณต์ ๋ณธ ์ค์
๋์๋ณด๋๋ฅผ ์ํ ๋ฆฌํ๋ฆฌ์นด ์ค์ ์ ์ด๊ธฐ ๋ช ๊ฐ์ง ์ ํ์ ๋ช ํํ ํ๊ณ ๋ฆฌํฌํ ํธ๋ํฝ์ ๊ธฐ๋ณธ์์ ๋ถ๋ฆฌํ๋ ์์ ์ด ์ฃผ๋ฅผ ์ด๋ฃน๋๋ค.
1) ์ ์ ํ ํ ํด๋ก์ง ๊ฒฐ์
ํ ํด๋ก์ง๋ถํฐ ์์ํ์ธ์. ๋จ์ผ BI ๋๊ตฌ์ ๋ช ๊ฐ์ ๋์๋ณด๋์๋ ํ๋์ ๋ฆฌํ๋ฆฌ์นด๋ก ์ถฉ๋ถํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ฌ๋ฌ ๋ถ์๊ฐ๋ ์ฌ๋ฌ ๋๊ตฌ๊ฐ ํ๋ฃจ ์ข ์ผ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฉด ๋ณต์ ๋ณธ์ ์ฌ๋ฌ ๊ฐ ๋๋ ๊ฒ์ด ๋์์ด ๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ฃผ ๋ฐ์ดํฐ์ผํฐ์ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๋ค๋ฉด ์ง์ญ๋ณ ๋ฆฌํ๋ฆฌ์นด๊ฐ ๋์๋ณด๋ ์ง์ฐ์ ์ค์ฌ์ฃผ์ง๋ง, ๋ชจ๋ํฐ๋งํด์ผ ํ ์ฅ์๊ฐ ๋์ด๋ฉ๋๋ค.
๋ค์์ผ๋ก ๋๊ธฐ์(synchronous) ๋๋ ๋น๋๊ธฐ์(asynchronous) ๋ณต์ ๋ฅผ ์ ํํ์ธ์. ๋๊ธฐ์์ ์ต์ ์ฑ์ ์ต๋๋ก ํ์ง๋ง ์ฐ๊ธฐ๋ฅผ ๋๋ฆฌ๊ฒ ํด ๋ง์ ํ์ ๋ชฉ์ ์ ํด์น ์ ์์ต๋๋ค. ๋น๋๊ธฐ๊ฐ ๋์๋ณด๋์๋ ์ผ๋ฐ์ ์ธ ์ ํ์ด๋ฉฐ, ์ฝ๊ฐ์ ์ง์ฐ์ ๋ฐ์๋ค์ผ ์ ์๋ ๊ฒฝ์ฐ ์ ์ ํฉ๋๋ค.
2) ๋ฆฌํฌํ ์๋ฒ์ฒ๋ผ ๋ฆฌํ๋ฆฌ์นด ๊ตฌ์ฑ
๋ฆฌํ๋ฆฌ์นด๋ ์ ๋ ดํ ์์ฐ ๋ณต์ฌ๋ณธ์ด ์๋๋๋ค. ๋ฆฌํฌํ ์ฟผ๋ฆฌ๋ ์ ๋ ฌ์ ์ํ ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ, ์ค์บ์ ์ํ ๋น ๋ฅธ ๋์คํฌ, ๋ ๋ง์ CPU๋ฅผ ํ์๋ก ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
PostgreSQL ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ ๋ฆฌํฌํ ์ ๋ง๊ฒ ๊ตฌ์ฑํ๋ ์ค์ฉ์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ์ํ ๋ณต์ ๋ณธ ์์ ์์น(๊ฐ์ ๋ฆฌ์ ๋๋ ์ฌ์ฉ์์ ๋ ๊ฐ๊น์ด ๊ณณ)๋ฅผ ๊ฒฐ์
- ๋์๋ณด๋๊ฐ ํ์ฉํ ์ ์๋ ์ง์ฐ์ ๊ธฐ์ค์ผ๋ก ๋น๋๊ธฐ vs ๋๊ธฐ ์ ํ
- ์ฝ๊ธฐ ์ค์ฌ ์์ ์ ์ํ ๋ฆฌ์์ค(์ฃผ๋ก CPU, RAM, ๋์คํฌ IOPS)๋ฅผ ํ๋ก๋น์ ๋
- ๋ฆฌํฌํ ์ฌ์ฉ์ ๋ฐ ๋๊ตฌ๋ฅผ ์ํ ๋ณ๋์ ์ฝ๊ธฐ ์ ์ฉ ์๊ฒฉ์ฆ๋ช ์์ฑ
- ๋์๋ณด๋ ์ฟผ๋ฆฌ๋ฅผ ๋ฆฌํ๋ฆฌ์นด๋ก ๋ผ์ฐํ (์ฑ, BI ๋๊ตฌ ๋๋ ์์ ๋ฆฌํฌํ ์๋น์ค์์ ๋ฆฌํ๋ฆฌ์นด ์ฐ๊ฒฐ ๊ตฌ์ฑ)
๋ผ์ฐํ ํ ๊ฐ๋จํ ํ ์คํธ๋ก ํ์ธํ์ธ์: ์๋ ค์ง ๋ฌด๊ฑฐ์ด ๋์๋ณด๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํด ๊ธฐ๋ณธ DB ํ๋์์ ๋ ์ด์ ๋ณด์ด์ง ์๋์ง ํ์ธํฉ๋๋ค.
AppMaster๋ก ์ฑ์ ๋ง๋ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋ฆฌํฌํ ์ฉ ๋ณ๋ DB ์ฐ๊ฒฐ์ ์ ์ํ๊ณ ๋์๋ณด๋ ์๋ํฌ์ธํธ์๋ง ์ฌ์ฉํ๋๋ก ํ์ฌ ์ฒดํฌ์์ ๋ฑ ํธ๋์ญ์ ํ๋ฆ์ด ์์ฒด ๋น ๋ฅธ ๊ฒฝ๋ก๋ฅผ ์ ์งํ๋๋ก ํฉ๋๋ค.
๋ฆฌํฌํ ์ฌ์ฉ์์ ๋ํ ์ ๊ทผ ์ ์ด์ ์์ ์ฅ์น
๋ฆฌํ๋ฆฌ์นด๋ ๋์๋ณด๋์ ์ข์ง๋ง ๊ฐ๋๋ ์ผ์ด ํ์ํฉ๋๋ค. ๊ณต์ ๋ฆฌ์์ค๋ก ์ทจ๊ธํด ๋ฆฌํฌํ ๋๊ตฌ์ ํ์ํ ์ต์ ๊ถํ๋ง ์ฃผ๊ณ , ์๋ชป๋ ์ฟผ๋ฆฌ๊ฐ ํฐ ํผํด๋ฅผ ์ฃผ์ง ๋ชปํ๋๋ก ์ ํํ์ธ์.
๋จผ์ ๋ฆฌํฌํ ์ ์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์๋ฅผ ๋ง๋์ธ์. ๋ฆฌํ๋ฆฌ์นด์ ์ฐ๊ฒฐํ๋๋ผ๋ ์ฑ์ ๋ฉ์ธ ์๊ฒฉ์ฆ๋ช ์ ์ฌ์ฌ์ฉํ์ง ๋ง์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ํ๋ ๊ฐ์ฌ, ๋น๋ฐ๋ฒํธ ํ์ , ๊ถํ ์ถ์๊ฐ ์ฌ์์ง๋๋ค.
๋๋ถ๋ถ์ ํ์ ๋ง๋ ๊ฐ๋จํ ์ ๊ทผ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-- Create a dedicated login
CREATE ROLE report_user LOGIN PASSWORD '...';
-- Allow read-only access to a schema
GRANT CONNECT ON DATABASE yourdb TO report_user;
GRANT USAGE ON SCHEMA public TO report_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO report_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO report_user;
-- Put safety limits on the role
ALTER ROLE report_user SET statement_timeout = '30s';
ALTER ROLE report_user SET idle_in_transaction_session_timeout = '15s';
๋ค์์ผ๋ก ์ฐ๊ฒฐ ํญ์ฃผ(connection storm)๋ฅผ ์ ์ดํ์ธ์. ๋์๋ณด๋์ BI ๋๊ตฌ๋ ์ฌ๋ฌ ์ฐ๊ฒฐ์ ์ด์ด ํ์ผ์ ๊ฐฑ์ ํ๋ ๊ฒ์ ์ข์ํฉ๋๋ค. ๋ฆฌํฌํ ์ฐ๊ฒฐ์ DB์ ํ๋ฌ(pooler) ๋จ์์์ ์ ํํ๊ณ ํธ๋์ญ์ ํธ๋ํฝ๊ณผ ๋ถ๋ฆฌํ์ธ์.
์ค์ฉ์ ์ธ ์ฒดํฌ๋ฆฌ์คํธ:
- ์ฝ๊ธฐ ์ ์ฉ ์ฌ์ฉ์ ์ฌ์ฉ(INSERT/UPDATE/DELETE ๋ฐ ์คํค๋ง ๋ณ๊ฒฝ ๊ธ์ง)
- ์ฅ๊ธฐ ์ฟผ๋ฆฌ์ ์ ํด ์ธ์ ์ ์ํ ์ญํ ๋ณ ํ์์์ ์ค์
- ๋ฆฌํฌํ ์ฌ์ฉ์์ ์ต๋ ์ฐ๊ฒฐ ์๋ฅผ ์์ ํ ์์ค์ผ๋ก ์ ํ
- ๋์๋ณด๋์ ํ์ํ ์คํค๋ง์ ํ ์ด๋ธ๋ก ์ ๊ทผ์ ์ ํ
- ๋ฏผ๊ฐํ ์ด(PII, ๋น๋ฐ, ํ ํฐ)์ ๋ง์คํนํ๊ฑฐ๋ ๋ฆฌํฌํ ๋ทฐ์์ ์ ์ธ
๋ถ๋ถ ๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค์ผ ํ๋ค๋ฉด "์ฌ๋๋ค์ด ์ฃผ์ํ ๊ฒ"์ ๊ธฐ๋์ง ๋ง์ธ์. ๋ฏผ๊ฐ ํ๋๋ฅผ ์จ๊ธฐ๊ฑฐ๋ ํด์ํ ๋ฆฌํฌํ ๋ทฐ๋ฅผ ๋ง๋ค๊ฑฐ๋ ๊ด๋ฆฌ๋ ๋ฆฌํฌํ ์คํค๋ง๋ฅผ ์ ์งํ์ธ์. AppMaster๋ก ํ์ด ๋์๋ณด๋๋ฅผ ๋น๋ํ ๋๋ ๋ฆฌํ๋ฆฌ์นด ์ฐ๊ฒฐ ๋ฌธ์์ด๊ณผ ์ ์ฉ ๋ฆฌํฌํ ์ฌ์ฉ์๋ฅผ ์ฌ์ฉํด ์์ฑ๋ ์ฑ์ด ํ๋ก๋์ ์ฐ๊ธฐ ์ ๊ทผ ์์ด ์์ ํ๊ฒ ์ฝ๋๋ก ํ์ธ์.
์ด๋ฌํ ์ ์ด๋ PostgreSQL ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ ๋ฆฌํฌํ ์ฉ์ผ๋ก ๋น ๋ฅด๊ณ ์์ธก ๊ฐ๋ฅํ๋ฉฐ ๋จ์ฉํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
๋์๋ณด๋์์ ๋๋ผ์์ ์ค์ด๋ ๋ชจ๋ํฐ๋ง
๋ฆฌํ๋ฆฌ์นด๊ฐ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋์ํด์ผ๋ง ๋์์ด ๋ฉ๋๋ค. ํ์ ๋๋ผ๊ฒ ํ๋ ๋ ๊ฐ์ง๋ ๋ณด์ด์ง ์๋ ๋ณต์ ์ง์ฐ(๋์๋ณด๋๊ฐ "ํ๋ ค ๋ณด์ด๋" ํ์)๊ณผ ๋ฆฌํ๋ฆฌ์นด์ ์์ ์คํ์ดํฌ(๋์๋ณด๋๊ฐ ๋๋ ค์ง)์ ๋๋ค. ๋ชจ๋ํฐ๋ง์ ์ฌ์ฉ์๊ฐ ๋ฐ๊ฒฌํ๊ธฐ ์ ์ ์ด๋ฅผ ํฌ์ฐฉํด์ผ ํฉ๋๋ค.
๋จผ์ ์ง์ฐ์ ์ธก์ ํ๊ณ ๋น์ฆ๋์ค์ ๋ํด "์ถฉ๋ถํ ์ต์ "์ ๊ธฐ์ค์ ํฉ์ํ์ธ์. ๋ง์ ๋ฆฌํฌํ ๋์๋ณด๋์์ 30์ด~120์ด๋ ๊ด์ฐฎ์ต๋๋ค. ์ด๋ค ๋์๋ณด๋๋(์ฌ๊ณ ยท์ฌ๊ธฐ ๋ฑ) 5์ด๋ ๋๋ฌด ๊ธธ ์ ์์ต๋๋ค. ๋ฌด์์ ์ ํํ๋ ๊ทธ ์์น๋ฅผ ๊ฐ์ํํ๊ณ ์ด์ ๋ํด ๊ฒฝ๊ณ ๋ฅผ ์ค์ ํ์ธ์.
PostgreSQL ๋ฆฌํฌํ ๋ฆฌํ๋ฆฌ์นด์์ ์ฃผ์ํ ์ค์ฉ์ ์ ํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ณต์ ์ง์ฐ(์๊ฐ ๋ฐ ๋ฐ์ดํธ). ์๊ณ๊ฐ์ ๋ช ๋ถ ์ด์ ์ด๊ณผํ ๋ ๊ฒฝ๊ณ ํ๋๋ก ์ค์ ํ์ธ์.
- ๋ณต์ ๋ณธ ์ํ: ํผํฌ ๋ฆฌํฌํ ์๊ฐ ๋์ CPU, ๋ฉ๋ชจ๋ฆฌ ์๋ ฅ, ๋์คํฌ ์ฝ๊ธฐ I/O
- ๋ณต์ ๋ณธ์ ์ฐ๊ฒฐ ํฌํ(๋๋ฌด ๋ง์ ๋์๋ณด๋ ์ธ์ )
- ๋ณต์ ๋ณธ์์์ ๋๋ฆฐ ์ฟผ๋ฆฌ(๊ธฐ๋ณธ์ ํต๊ณ๋ง ๋ณด๊ณ ์ ๋ถ๋ฅผ ๊ฐ์ ํ์ง ๋ง ๊ฒ)
- autovacuum ๋ฐ ๋ธ๋กํธ(bloat). ํ ์ด๋ธ์ด๋ ์ธ๋ฑ์ค๊ฐ ๋ถํ๋ฉด ์ฝ๊ธฐ๊ฐ ์ ํ๋ฉ๋๋ค.
๋๋ฆฐ ์ฟผ๋ฆฌ ์ถ์ ์ ํน๋ณํ ์ฃผ์ํ์ธ์. ํํ ์คํจ ๋ชจ๋๋ ํ ์คํธ์์๋ ๊ด์ฐฎ์๋ ๋์๋ณด๋๊ฐ ํ๋ก๋์ ์์ "์ ์ฒด ํ ์ด๋ธ ์ค์บ ์ถ์ "๋ก ๋ฐ๋๋ ๊ฒฝ์ฐ์ ๋๋ค. ๋ณต์ ๋ณธ์ ๋ํด ๊ธฐ๋ณธ์์ ์ฌ์ฉํ๋ ๋ชจ๋ํฐ๋ง(์ด ์์ ์๊ฐ ๊ธฐ์ค ์์ ์ฟผ๋ฆฌ, ํ๊ท ์๊ฐ ๋ฑ)์ ๋์ผํ๊ฒ ์ ์ฉํ์ธ์.
๋ง์ง๋ง์ผ๋ก ๋ฆฌํ๋ฆฌ์นด๊ฐ ์ฌ์ฉ ๋ถ๊ฐ์ด๊ฑฐ๋ ๋๋ฌด ๋ค์ฒ์ก์ ๋ ์ฑ์ด ์ด๋ป๊ฒ ๋์ํ ์ง ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ์ธ์. ํ ๊ฐ์ง ๋์์ ์ ํ๊ณ ์ผ๊ด๋๊ฒ ๊ตฌํํ์ธ์:
- ์ง์ฐ์ด ์๊ณ๊ฐ์ ๋์ผ๋ฉด "๋ฐ์ดํฐ ์ง์ฐ" ๋ฐฐ๋๋ฅผ ํ์
- ๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ์ฐจํธ๋ฅผ ์ผ์ ๋นํ์ฑํํ๊ณ ๊ฐ๋ฒผ์ด ์์ฝ๋ง ์ ์ง
- ๊ณ ์ ์ฐฝ(์: ์ง๋ 15๋ถ) ๋์ ์บ์๋ ๊ฒฐ๊ณผ๋ก ๋์ฒด
- ํน์ ํ๋ฉด์ ๋ํด ์ค์ํ ์ฝ๊ธฐ๋ ๊ธฐ๋ณธ์ผ๋ก ๋๋๋ฆผ
- ๋ฆฌํ๋ฆฌ์นด๊ฐ ๋ณต๊ตฌ๋ ๋๊น์ง ๋์๋ณด๋๋ฅผ ์ฝ๊ธฐ ์ ์ฉ ์ ์ง
AppMaster์์ ๋ด๋ถ ๋์๋ณด๋๋ฅผ ๋น๋ํ๋ค๋ฉด ๋ฆฌํ๋ฆฌ์นด๋ฅผ ๋ณ๋ ๋ฐ์ดํฐ ์์ค๋ก ์ทจ๊ธํด ๋ฐ๋ก ๋ชจ๋ํฐ๋งํ๊ณ , ์ ์ ๋๋ ์ฑ๋ฅ์ด ๋จ์ด์ง ๋ ์ฐ์ํ๊ฒ ์ฑ๋ฅ์ด ์ ํ๋๋๋ก ์ค๊ณํ์ธ์.
ํผํด์ผ ํ ํํ ์ค์์ ํจ์
๋ฆฌํ๋ฆฌ์นด๊ฐ ๋์์ด ๋๊ธด ํ์ง๋ง ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ๋ ๋ง๋ฒ์ ๋ฒํผ์ ์๋๋๋ค. ๋๋ถ๋ถ์ ๋ฌธ์ ๋ ๋ฆฌํ๋ฆฌ์นด๋ฅผ ๋ฌด์ ํ ๋ถ์ ์ฐฝ๊ณ ๋ก ๋ค๋ฃจ๋ค๊ฐ ๋์๋ณด๋๊ฐ ๋๋ ค์ง๊ฑฐ๋ ์๋ชป๋๋ฉด ๋๋ผ๋ ๋ฐ์ ์ต๋๋ค.
์ฌ์ด ์ค์ ์ค ํ๋: ๋ฆฌํ๋ฆฌ์นด๋ ๊ณผ๋ถํ๋ ์ ์์ต๋๋ค. ๋ช ๋ฒ์ ๋์ ํ
์ด๋ธ ์ค์บ, ๋ฌด๊ฑฐ์ด ์กฐ์ธ, ๋๋ SELECT * ๋ด๋ณด๋ด๊ธฐ๊ฐ CPU์ ๋์คํฌ๋ฅผ ๋ชฐ์๋ถ์ฌ ํ์์์์ ์ ๋ฐํ ์ ์์ต๋๋ค. ๋น์ฉ ์ ๊ฐ์ ์ํด ๋ณต์ ๋ณธ์ ๊ธฐ๋ณธ๋ณด๋ค ์์ ํ๋์จ์ด์ ์ฌ๋ ค๋๋ฉด ๋๋ ค์ง์ ๋ ๋นจ๋ฆฌ ๋ํ๋ฉ๋๋ค.
๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ํจ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ค์๊ฐ์ฑ์ด ํ์ํ ํต์ฌ ํ๋ฉด์ ๋ฆฌํ๋ฆฌ์นด๋ก ๋ผ์ฐํ : ๋ณต์ ์ง์ฐ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์
- BI ๋๊ตฌ๊ฐ ๋๋ฌด ๋ง์ ์ฐ๊ฒฐ์ ์ด๊ฒ ๋ด๋ฒ๋ ค ๋๊ธฐ: ์ฌ๋ฌ ํ์ผ์ ๋์์ ๊ฐฑ์ ํ๋ฉด ๊ฐ ํ์ผ์ด ์ธ์ ์ ์ด๊ณ ์คํ์ดํฌ๋ฅผ ์ ๋ฐํจ
- ์ธ๋ฑ์ค๋ง์ผ๋ก ํด๊ฒฐ๋ ๊ฒ์ด๋ผ ๊ฐ์ ํ๊ธฐ: ์๋ฐฑ๋ง ํ์ ๋น๊ฒจ์ค๊ฑฐ๋ ์๋ชป๋ ํค๋ก ๊ทธ๋ฃนํํ๊ฑฐ๋ ์ ํ ์์ด ์กฐ์ธํ๋ฉด ์ธ๋ฑ์ค๋ง์ผ๋ก๋ ๋ถ์กฑํจ
- "ํ ๋ฒ์ ๋น ๋ฅด๋ค"๊ฐ ํญ์ ๋น ๋ฅด์ง ์๋ค๋ ์ ์ ์์: ์์นจ์๋ ๊ด์ฐฎ๋ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๊ฐ ์ปค์ง๊ฑฐ๋ ์ฌ๋ฌ ์ฌ๋์ด ์๋ก๊ณ ์นจํ๋ฉด ๋๋ ค์ง ์ ์์
- ํ์ผ์ค๋ฒ ๋์ ๊ณํ ๋๋ฝ: ํ์ผ์ค๋ฒ ์ค ๋ณต์ ๋ณธ์ด ์น๊ฒฉ๋๊ฑฐ๋ ๊ต์ฒด๋๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์ฝ๊ธฐ ์ ์ฉ ์ค๋ฅ๋ ์ค๋๋ ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ ์ ์์
ํ์ค์ ์์: BI ๋๊ตฌ๊ฐ "์ค๋์ ์ฃผ๋ฌธ" ํ์ด์ง๋ฅผ 1๋ถ๋ง๋ค ์๋ก๊ณ ์นจํ๊ณ ๋ฆฌํ๋ ์๋น ๋ฌด๊ฑฐ์ด ์ฟผ๋ฆฌ 5๊ฐ๋ฅผ ์คํํ๋ฉฐ 20๋ช ์ด ์ด์ด๋๋ฉด ๋ถ๋น 100๋ฒ์ ๋ฌด๊ฑฐ์ด ์ฟผ๋ฆฌ ๊ธ์ฆ์ด ๋ฐ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์์ ํ ์ ์์ง๋ง ๋ณต์ ๋ณธ์ ๋ฒํฐ์ง ๋ชปํ ์ ์์ต๋๋ค.
AppMaster ๊ฐ์ ํ๋ซํผ์ผ๋ก ๋ด๋ถ ๋์๋ณด๋๋ฅผ ๋ง๋ค ๋๋ ๋ฆฌํฌํ DB๋ฅผ ๋ณ๋ ๋์์ผ๋ก ์ทจ๊ธํ๊ณ ์ฐ๊ฒฐ ์ ํ๊ณผ ์ ์ ๋ ์๊ตฌ ๊ท์น์ ๋์ด ์ฌ์ฉ์๊ฐ ์ง์ฐ๋ ๋ฐ์ดํฐ์ ์์กดํ์ง ์๋๋ก ํ์ธ์.
๋ฆฌํ๋ฆฌ์นด์์ ๋ฆฌํฌํ ์ ๋น ๋ฅด๊ฒ ๋ง๋๋ ์ค๊ณ ํจํด
๋ฆฌํ๋ฆฌ์นด๋ ์จํต์ ํ์์ฃผ์ง๋ง ๋ชจ๋ ๋์๋ณด๋๋ฅผ ์๋์ผ๋ก ๋น ๋ฅด๊ฒ ๋ง๋ค์ง๋ ์์ต๋๋ค. ์ต๊ณ ์ ๊ฒฐ๊ณผ๋ ๋ฆฌํฌํ ์ฟผ๋ฆฌ๋ฅผ ์์ ๋์ ์ค์ด๊ณ ๋ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๋ฐ์ ์ต๋๋ค. ๋ค์ ํจํด์ PostgreSQL ๋ฆฌํฌ์นด์์ ๋ฆฌํฌํ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ฐ ํจ๊ณผ์ ์ ๋๋ค.
"๋ฆฌํฌํ ๋ ์ด์ด" ๋ถ๋ฆฌ
์ ์ฉ ๋ฆฌํฌํ
์คํค๋ง(์: reporting)๋ฅผ ๊ณ ๋ คํ์ธ์. ์์ ์ ์ธ ๋ทฐ์ ํฌํผ ํ
์ด๋ธ์ ๋๋ฉด BI ๋๊ตฌ๊ฐ ์์ ํธ๋์ญ์
ํ
์ด๋ธ์ ์ง์ ๊ฑด๋๋ฆฌ์ง ์๊ฒ ํ ์ ์๊ณ ์ต์ ํ ์ง์ ์ ํ ๊ณณ์ ๋ชจ์๋ ์ ์์ต๋๋ค. ์ข์ ๋ฆฌํฌํ
๋ทฐ๋ ์ง์ ๋ถํ ์กฐ์ธ์ ์จ๊ฒจ ๋์๋ณด๋ ์ฟผ๋ฆฌ๋ฅผ ๋จ์ํ๊ฒ ์ ์งํฉ๋๋ค.
๋น์ผ ์์ ์ฌ์ ์ง๊ณ
๋์๋ณด๋๊ฐ ๋์ผํ ํฉ๊ณ๋ฅผ ํ๋ฃจ ์ข ์ผ ๋ค์ ๊ณ์ฐํ๋ค๋ฉด ํ์ด์ง ๋ก๋๋ง๋ค ๋ค์ ๊ณ์ฐํ์ง ๋ง์ธ์. ์ด๋ฏธ ๊ทธ๋ฃนํ๋ ์ซ์๋ฅผ ์ ์ฅํ๋ ์์ฝ ํ ์ด๋ธ์ด๋ ๋ฌผ๋ฆฌํ๋ ๋ทฐ(materialized view)๋ฅผ ๋ง๋์ธ์.
ํํ ์ ํ:
- ๋ ์ง, ์ง์ญ, ์ฑ๋๋ณ ์ผ๋ณ ๋๋ ์๊ฐ๋ณ ๋กค์
- "๋ง์ง๋ง ์๋ ค์ง" ์ค๋ ์ท ํ ์ด๋ธ(์ฌ๊ณ , ๊ณ์ ์์ก)
- ์์ N ํ ์ด๋ธ(Top-N ์ ํ, ๊ณ ๊ฐ)
- ํํฐ๋ง์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํ ๋น์ ๊ทํ๋ ์นผ๋ผ์ด ์๋ ํฉํธ ํ ์ด๋ธ
๋ฌด๊ฑฐ์ด ๋ฉํธ๋ฆญ์ ์ค์ผ์ค๋ก ๊ฐฑ์
์ฌ์ ์ง๊ณ๋ฅผ ์คํํผํฌ์ ์์ฝ ์์ ์ผ๋ก ๊ฐฑ์ ํ์ธ์. ๋น์ฆ๋์ค๊ฐ "5๋ถ๋ง๋ค ์ ๋ฐ์ดํธ"๋ฅผ ์์ฉํ ์ ์๋ค๋ฉด ์์ ์ง์ฐ์ ํจ์ฌ ๋น ๋ฅธ ๋์๋ณด๋๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค. ๋งค์ฐ ํฐ ๋ฐ์ดํฐ์ ์ ์ ์ฒด ๋ฆฌํ๋ ์๋ณด๋ค ์ฆ๋ถ ์ ๋ฐ์ดํธ(๋ง์ง๋ง ์คํ ์ดํ์ ์ ํ๋ง)๋ก ํ๋ ๊ฒ์ด ๋ณดํต ๋ ์ ๋ ดํฉ๋๋ค.
์์ฃผ ์กฐํ๋๋ ํญ๋ชฉ ์บ์
๊ฐ์ ๋์๋ณด๋ ์์ ฏ์ด ๋ฐ๋ณต์ ์ผ๋ก ์์ฒญ๋๋ค๋ฉด ์ฑ ๋ ์ด์ด์์ ์งง์ ์๊ฐ(30~120์ด) ๋์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ์ธ์. ์๋ฅผ ๋ค์ด "์ค๋ ๋งค์ถ" ํ์ผ์ ํ์ฌ๋ ๋งค์ฅ๋ณ๋ก ์บ์ํ ์ ์์ต๋๋ค. AppMaster ๊ฐ์ ๋๊ตฌ์์๋ ๋์๋ณด๋๋ฅผ ์ ๊ณตํ๋ API ์๋ํฌ์ธํธ ์ฃผ๋ณ์ ์ด ์บ์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ฝ์ต๋๋ค.
๊ฐ๋จํ ๊ท์น: ๋๋ฆฌ๊ณ ์ธ๊ธฐ ์๋ ์ฟผ๋ฆฌ๋ ์ฌ์ ์ง๊ณํ๊ฑฐ๋ ์บ์ํ๊ฑฐ๋ ๋ ๋ค ํ์ธ์.
ํ์ค์ ์: ์ฒดํฌ์์์ ๋๋ฆฌ์ง ์๊ฒ ํ๋ ํ๋งค ๋ฆฌํฌํ
์์ ์ ์์๊ฑฐ๋ ์ฑ์ ์์ํด ๋ณด์ธ์. ๋ฉ์ธ DB๋ ๋ก๊ทธ์ธ, ์ฅ๋ฐ๊ตฌ๋, ๊ฒฐ์ , ์ฃผ๋ฌธ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๋์์ ํ์ ์๊ฐ๋ณ ๋งค์ถ, ์์ ์ํ, ํ๋ถ์ ๋ณด์ฌ์ฃผ๋ ๋์๋ณด๋๋ฅผ ์ํฉ๋๋ค.
๋ณ๊ฒฝ ์ ์๋ ๋์๋ณด๋๊ฐ ๊ธฐ๋ณธ DB์์ ๋ฌด๊ฑฐ์ด ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค. ์๋ง ๊ฐ์ ์์ ์ ๋๊ตฐ๊ฐ "์ง๋ 30์ผ ์ํ๋ณ" ์ฐจํธ๋ฅผ ์ด๋ฉด orders ํ ์ด๋ธ์ ํฐ ๋ถ๋ถ์ ์ค์บํฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋์๋ณด๋ ์ฟผ๋ฆฌ๋ค์ด ๋์ผํ CPU, ๋ฉ๋ชจ๋ฆฌ, ๋์คํฌ ์ฝ๊ธฐ๋ฅผ ๋๊ณ ๊ฒฝ์ํด ์ฒดํฌ์์์ด ๋๋ ค์ง๋๋ค.
ํด๊ฒฐ์ฑ ์ ๊ฐ๋จํฉ๋๋ค: ๋์๋ณด๋ ์ฝ๊ธฐ๋ฅผ ๋ฆฌํ๋ฆฌ์นด๋ก ์ฎ๊ธฐ์ธ์. PostgreSQL ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ ๋ฆฌํฌํ ์ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ์ ๋น ๋ฅธ ์ฐ๊ธฐ๋ฅผ ๊ณ์ํ๊ณ ๋ฆฌํ๋ฆฌ์นด๊ฐ ๊ธด ์ฝ๊ธฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๋์๋ณด๋๋ ๊ธฐ๋ณธ์ด ์๋ ๋ฆฌํ๋ฆฌ์นด ์ฐ๊ฒฐ ๋ฌธ์์ด์ ๊ฐ๋ฆฌํค๊ฒ ํฉ๋๋ค.
ํ์ ๋ํ ๋๊ตฌ๋ ์ค์๊ฐ์ ๊ธฐ๋ํ์ง ์๋๋ก ๋ช ํํ ์ต์ ์ฑ ๊ท์น์ ์ ํ์ต๋๋ค:
- ๋์๋ณด๋์ "๋ฐ์ดํฐ๊ฐ X๋ถ ์ ์ ์ ๋ฐ์ดํธ๋จ" ํ์
- ์ ์ ์๊ฐ ๋์ ์ต๋ 5๋ถ ์ง์ฐ ํ์ฉ
- ์ง์ฐ์ด 10๋ถ์ ๋์ผ๋ฉด ๋์๋ณด๋๋ฅผ "์ง์ฐ ๋ชจ๋"๋ก ์ ํํ๊ณ ๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ์ฐจํธ ์ผ์ ์ค์ง
- ์ฒดํฌ์์๊ณผ ์ฃผ๋ฌธ ์ ๋ฐ์ดํธ๋ ํญ์ ๊ธฐ๋ณธ์์ ์ฒ๋ฆฌ
๋ณ๊ฒฝ ํ ๊ฒฐ๊ณผ๋ ๋ถ๋ช ํฉ๋๋ค. ๋ฆฌํฌํธ ์คํ์ดํฌ ๋์์๋ ์ฒดํฌ์์์ ์์ ์ ์ผ๋ก ์ ์ง๋๊ณ , ์ฐจํธ๋ ํธ๋์ญ์ ๊ณผ ๊ฒฝ์ํ์ง ์์ผ๋ฏ๋ก ๋ ๋น ๋ฅด๊ฒ ๋ก๋๋ฉ๋๋ค.
์ฌ์ฉ์์๊ฒ ํ์ํ ๋ฉ์์ง๋ ๊ฐ๋จํฉ๋๋ค: ๋์๋ณด๋๋ "๊ทผ์ค์๊ฐ(near real time)"์ด์ง ๋ง์ง๋ง 10์ด์ ์ง์ค๋ ์ถ์ฒ๋ ์๋๋ผ๋ ์ . ์ ํํ ํฉ๊ณ๊ฐ ํ์ํ๋ฉด ์์ฝ๋ ๋ด๋ณด๋ด๊ธฐ๋ ์ข ๊ฐ ๋ณด๊ณ ์๋ฅผ ์คํํ๋๋ก ์๋ดํ์ธ์.
AppMaster๋ก ์ฑ์ ๋ง๋ค ๊ฒฝ์ฐ ์ฒ์๋ถํฐ ๋ฆฌํฌํ ์ ๋ณ๋ ์ฝ๊ธฐ ์ ์ฉ ์ฐ๊ฒฐ๋ก ์ทจ๊ธํด ํธ๋์ญ์ ํ๋ฆ์ด ์์ธก ๊ฐ๋ฅํ๋๋ก ํ์ธ์.
๋น ๋ฅธ ์ ๊ฒ ๋ฐ ๋ค์ ๋จ๊ณ
๋์๋ณด๋๋ฅผ ๋ฆฌํ๋ฆฌ์นด๋ก ์ฐ๊ฒฐํ๊ธฐ ์ ์ ๊ฐ๋จํ ์ ๊ฒ์ ํ์ธ์. ๋ช ๊ฐ์ง ์ค์ ๊ณผ ์ต๊ด๋ง์ผ๋ก ๊ฐ์ฅ ํํ ๋๋ผ์(์ค๋๋ ์์น, ํ์์์, ์ค์๋ก ์ฐ๊ธฐ)์ ์๋ฐฉํ ์ ์์ต๋๋ค.
๋ค์์ ๋ฆฌํ๋ฆฌ์นด๋ก ํธ๋ํฝ์ ๋ณด๋ด๊ธฐ ์ ์ ๊ตฌ์ฑํ ๋น ๋ฅธ ์ฒดํฌ๋ฆฌ์คํธ์ ๋๋ค:
- ๋ฆฌํฌํ ์ฐ๊ฒฐ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง๋ค๊ธฐ(์ ์ฉ ์ฌ์ฉ์ ์ฌ์ฉ ๋ฐ ์ฝ๊ธฐ ์ ์ฉ ํธ๋์ญ์ ๊ฐ์ )
- ๋ฆฌํฌํ ๊ณผ ์ฑ ํธ๋ํฝ ๋ถ๋ฆฌ(๋ณ๋ ์ฐ๊ฒฐ ํ๊ณผ ์ ์ ํ ์ฐ๊ฒฐ ํ๋)
- ๋ณต์ ๋ณธ์ด ๋์๋ณด๋๊ฐ ์์กดํ๋ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ถ์๋์ง ํ์ธ(๋ณต์ ๋ณธ์ ์ธ๋ฑ์ค๋ฅผ ๋ณต์ฌํ์ง๋ง ์ต๊ทผ ๋ณ๊ฒฝ์ด ๋น ์ก๋์ง ํ์ธ)
- ๋ฆฌํฌํ ์ฟผ๋ฆฌ๊ฐ ํ๋์ ๋์ ์ฐจํธ๋ก ์์คํ ์ ๋ฉ์ถ์ง ์๋๋ก statement ๋ฐ lock ํ์์์ ์ค์
- ์ฐจํธ๊ฐ ์์ ์ง์ฐ์ ๊ฒฌ๋๋์ง ๊ฒ์ฆ(ํ์ํ๋ฉด "as of" ํ์์คํฌํ ํ์ํ๊ฑฐ๋ ๋ถ ๋จ์๋ก ๋ฐ์ฌ๋ฆผ)
ํธ๋ํฝ์ด ํ๋ฅด๊ธฐ ์์ํ๋ฉด ๋ชจ๋ํฐ๋ง์ ์ฃผ๊ธฐ์ ์ธ ๊ฐ๋ฒผ์ด ๋ฃจํด์ผ๋ก ์ทจ๊ธํ์ธ์. PostgreSQL ๋ฆฌํฌํ ๋ฆฌํ๋ฆฌ์นด๋ "์ด์ ๋ ๊ด์ฐฎ์์"์ด ๋ฐ์ดํฐ๋ ์ฆ๊ฐ๋ก ๊ธ๋ณํ ์ ์์ผ๋ฏ๋ก ์ฃผ๊ฐ ์ ๊ฒ์ด ์ข์ต๋๋ค.
์ฃผ๊ฐ ๋ชจ๋ํฐ๋ง ์ฒดํฌ๋ฆฌ์คํธ(10๋ถ):
- ๋ณต์ ์ง์ฐ: ์ ํ์ ์ง์ฐ๊ณผ ํผํฌ ์ ์ต์ ์ ์คํ์ดํฌ ๊ด์ฐฐ
- ๋๋ฆฐ ์ฟผ๋ฆฌ: ์ด ์๊ฐ ๊ธฐ์ค ์์ ์ฟผ๋ฆฌ ์ถ์
- ์ฐ๊ฒฐ: ์ต๋ ์ฐ๊ฒฐ, ํ ํฌํ, ์ ํด ์ฐ๊ฒฐ ๋์ ํ์ธ
- ๋์คํฌ ๋ฐ CPU: ๋ฌด๊ฑฐ์ด ์ค์บ ์ค ๋ณต์ ๋ณธ์ ์ ์ฅ์ ๋ณ๋ชฉ ์ฌ๋ถ
- ์คํจํ ์ฟผ๋ฆฌ: ํ์์์, ์ทจ์๋ ๋ฌธ์ฅ, ๊ถํ ์ค๋ฅ ํ์ธ
๋ค์ ๋จ๊ณ๋ ์ฃผ๋ก ๋ผ์ฐํ ๊ท์น๊ณผ ๋์ฒด(fallback) ๊ณํ์ ๊ดํ ๊ฒ์ ๋๋ค. ๋์๋ณด๋, ๋ด๋ณด๋ด๊ธฐ, ๊ด๋ฆฌ์ ๋ฆฌํฌํธ ๊ฐ์ ์๋ํฌ์ธํธ ์ค ์ด๋ค ๊ฒ์ด ๋ฆฌํ๋ฆฌ์นด์์ ์์ ํ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๊ฒ์ ์ต์ ์ฑ์ด ํ์ํด ๊ธฐ๋ณธ์ ๋จ๊ฒจ๋์ง ๊ฒฐ์ ํ์ธ์. ์ง์ฐ์ด ์๊ณ๊ฐ์ ๋์์ ๋ ์ด๋ค ๋์์ ํ ์ง ์ ํ์ธ์: ๊ฒฝ๊ณ ๋ฐฐ๋ ํ์, ์ผ๋ถ ํ์ด์ง๋ฅผ ์ํด ์ฝ๊ธฐ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ํ, ๋๋ ๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ์ฐจํธ๋ฅผ ์ผ์ ๋นํ์ฑํ ๋ฑ.
๋ด๋ถ ๋์๋ณด๋๋ ๊ด๋ฆฌ์ ๋๊ตฌ๋ฅผ ๋ง๋ ๋ค๋ฉด AppMaster๋ ๋ฆฌํฌํ ํ๋ฉด์ ๋ฆฌํ๋ฆฌ์นด๋ก ์ฐ๊ฒฐํ๋ฉด์ ํต์ฌ ํธ๋์ญ์ ์ฑ์ด ์ํํ ๋์ํ๋๋ก ๋น ๋ฅด๊ฒ ๋ฐฐํฌํ๋ ์ค์ฉ์ ์ธ ๋ฐฉ๋ฒ์ด ๋ ์ ์์ต๋๋ค.


