[PostgreSQL] ์ค๋ฉ(sharding) - partition
SQL RDB์์ ์ค๋ฉ์ด๋ ๊ท๋ชจ๊ฐ ํฐ ํ ์ด๋ธ์ ์์๋ก ์ฌ๋ฌ๊ฐ๋ก ๋ถํ ํด์ ์ฌ์ฉํ๋ ๊ฒ์ ๋งํ๋ค.
๋ค ํ์ค์บ์ ๋๋ฆฌ๊ธฐ ์ด๋ ต๊ฑฐ๋ ํ๊ณณ์ ์ ์ฅํ๊ธฐ ํ๋ค ์ ๋์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ค๋ณด๋ฉด ์ฌ์ฉํ๊ฒ ๋๋ ๊ธฐ๋ฒ์ด๋ค.
์ค๋ฉ์ ์๋ฆฌ
๋๋ต์ ์ธ ์๋ฆฌ๋ ์ด๋ ๋ค.
- ์ผ๋จ ์ปฌ๋ผ์ค์ ๊ธฐ์ค๊ฐ์ผ๋ก ์ผ์ ๊ฒ์ ํ๋ ์ ํ๋ค. ๋ณดํต์ ์ ์ผ์ฑ์ด ๋ณด์ฅ๋๊ณ ์ธ๋ฑ์ค๋ฅผ ํ๋ ๊ธฐ๋ณธํค ๋ฑ์ผ๋ก ์ ํ ๊ฒ์ด๋ค.
- ๋ง์ฝ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ผ๋ฉด ์ ์ ๊ณ ์ ๋ฒํธ user_id๊ฐ 1,2,3,4... ์ ์์๋ก ๋ค์ด๊ฐ์์ ๊ฒ์ด๋ค.
- ์ค๋ ๋ถ๋ฐฐ์ฉ ํด์ํจ์๋ฅผ ์์ฑํ๋ค. 2๊ฐ์ ํ ์ด๋ธ๋ก ์ค๋ฉ์ ํ๊ณ ์ถ๋ค๋ฉด, user_id๋ฅผ ํ์ ์ง์๋๋ก ๋ถ๋ฐฐ๋๋๋ก ํ ์ ์๊ฒ ๋ค.
- ๊ทธ๋ฌ๋ฉด A ์ค๋์๋ 1,3,5,...์ ์ ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๊ณ , B ์ค๋์๋ 2,4,6,...์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋๋ก ๊ตฌ์ฑํ๋ฉด ๋๋ ๊ฒ์ด๋ค.
์๋ ์ด๋ฏธ์ง๋ ๋ฐฉ๊ธ ์ธ๊ธํ๋ ๊ฒ๊ณผ ๋์ผํ ์์๋ค. ์ซ์์์ A, B, C, D์ผ๋ก ๋ฐ๋์์ ๋ฟ์ด๋ค.

์ฅ๋จ์
์ผ๋จ ํน์ ์ค๋์๋ง ์ ๊ทผํด๋ ๋ ๊ฒฝ์ฐ์๋, ์ค๋ฉ์ ํ์ง ์์๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ฒ ์ค์บ์ ํด์ฌ ์๊ฐ ์๋ค. ๋ ๊ทธ๋ ๊ธฐ๋๋ฌธ์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ๊ณ ๋ คํด์ ์ค๋๋ฅผ ๋ถํ ํด์ผ ํ๋ค.
์ค๋๊ฐ ์ ๋งคํ๊ฒ ๋๋์ด์ ๋งค๋ฒ ์ค๋ ์ฌ๋ฌ๊ฐ๋ฅผ ๋ค ์ฝ์ด์ค๋ฉด, ๋๋ ๋์ ์๋ฏธ๊ฐ ์์ ๊ฒ์ด๋ค.
๋, ๋๋์ผ๋ก ์
๋ก๋ํ๋ ๊ฒฝ์ฐ์๋ ์๋นํ ์ฑ๋ฅ์ ์ด์ ์ด ์๋ค. ๋ฐ์ดํฐ ๋ญ์น๋ฅผ insertํ ๋ ๊ทธ๋ฅ ์ฌ๋ฆฌ๋๊ฒ ์๋๋ผ ๊ทธ๊ฑธ insertํด๋์ ์ ์ค๋๋ฅผ ํต์งธ๋ก ์ฌ๋ ค๋ฒ๋ฆฌ๋ ๊ฒ์ด๋ค. ๊ทธ๋ผ postgresql vaccum์ ํน์ฑ ์ผ๋ฐ์ ์ธ ๋๋ insert๋ ๋๋ delete๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ๊ฐ ๋๋ค.
partition attach์ partition detach ๋ฑ์ ๋ช
๋ น์ด๋ก ์ด๋ฅผ ์ํํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ์ ์์ฒด๊ฐ ๋ถ์กฑํด์ง ๊ฒฝ์ฐ์๋ ํ์์ ์ด๋ค. ๋์คํฌ์ ๋ค ์ฐ์ง๋ฅผ ๋ชปํ๋๋ฐ.. ์ด๋ป๊ฒ ํ๊ฒ ๋๊ฐ? ๋๋ ์ ๋ค๋ฅธ ๋จธ์ ์ ์ ์ฅํด์ผ์ง.
๊ฒ๋ค๊ฐ ์ ์ฌ์ฉ๋์ง ์๋ ์ค๋์ ๊ฒฝ์ฐ์๋ ๋๋ฆฌ๊ณ ์ ๋ ดํ ์คํ ๋ฆฌ์ง์ ๋ชฐ์๋ฃ์ด์ ๋น์ฉ์ ํจ์จํ๋ฅผ ๊พํ ์๋ ์๋ค.
๋ค๋ง, ๋ฉ๋ชจ๋ฆฌ ๋ถํ ์๋ ์ ๊ฒฝ์ ์ข ์จ์ผ ํ๋ค.
๊ด๋ จํด์ ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฌธ์ ๋ก๋ ์ ๋ช
์ธ(celebriry) ๋ฌธ์ ๋ผ๋ ๊ฒ์ด ์๋ค.
๊ทธ๋ฅ ์ปดํจํฐ์ ์ธ ์ฌ๊ณ ๋ก๋ ํ์ ์ง์ ๋ถ๋ฆฌํด๋์ผ๋ฉด ์์์ ๊ท ํ์ ๋ง์ถ๊ฒ ์ง ์ถ์ ์๋ ์์ง๋ง.. ํญ์ ๊ทธ๋ ์ง๋ ์๋ค. ์ด๋ฅผํ
๋ฉด ํน์ ๋ฐ์ดํฐ์๋ง ๋ฌด์ธ๊ฐ๊ฐ ์ ๋ฆฌ๋ ๊ฒฝ์ฐ ๋ง์ด๋ค. ์ด๋ฐ๊ฑด ๋ณตํฉ์ ์ธ ์ํคํ
์ฒ๋ฅผ ํตํด ํด๊ฒฐ์ ํด์ผํ๋ค.
partition
์ค๋ฉ๋ ์๋ฆฌ๋ ๊ฐ๋จํ์ง๋ง ์ง์ ๊ตฌ์ฑํ๋ ค๋ฉด ๊ท์ฐฎ๊ณ ๋ฒ๊ฑฐ๋ก์ด ์์ ์ธ๋ฐ, postgresql์ ๋คํํ ์ด๋ฌํ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ค.
์๋๋ ์์ ์ ์๋ณธ ์ฟผ๋ฆฌ๋ค.
create table Food
(
id serial primary key,
name varchar(100),
value int
);
๋ง์ฝ ์ด๋ฌํ ํ ์ด๋ธ์ ํํฐ์ ๋์ผ๋ก ๊ตฌํํ๊ณ ์ถ๋ค๋ฉด ์ผ๋จ ํํฐ์ ์ฉ ํ ์ด๋ธ์ ํ๋ ์์ฑํด์ผ ํ๋ค๋ฉด,
๋ค์๊ณผ ๊ฐ์ด partition by์ ํํฐ์ ํ์ ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
create table ํํฐ์
ํ
์ด๋ธ๋ช
... table ์ ์
partition by hash(๊ธฐ์ค๊ฐ)
ํํฐ์
ํ์
์ hash ์ธ์๋ range, list๊ฐ ์๋๋ฐ, ํด์๋ ๋๋จธ์ง์
์ ํด์ ๋ชจ๋ ์ค๋์ ๊ณจ๊ณ ๋ฃจ ๋ค์ด๊ฐ๋๋ก ์ ๋ํ๋ค.
range๋ ๋ง ๊ทธ๋๋ก ๊ฐ์ ๋ฒ์๋ณ๋ก ๋๋๋๊ฑฐ๊ณ ... list๋ ํน์ ๊ฐ์ ๋ชฉ๋ก๋ง ํ๋์ฝ๋ฉ๋ฐ์์ ๊ทธ๊ฑธ๋ก ๋๋๋ ๊ฒ์ด๋ค.
range๋ ๋ณดํต ๊ธฐ๊ฐ๋ณ๋ก ๋ถํ ํ๋๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๋ง๋ค์ด์ง ํํฐ์ ์ฉ ํ ์ด๋ธ์ ๊ทธ ์์ฒด๋ก๋ ๋์ํ์ง ์๋๋ค.
๊ทธ์ ์ฌ๋ฌ๊ฐ์ ํํฐ์
์ ๋ฌถ์ด์ ๋ณด์ฌ์ฃผ๋ ์ค๊ฐ์์ ๋ถ๊ณผํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ผ ์ด์ ์ ๊ธฐ๋ค ํํฐ์
์ ์ถ๊ฐํด๋ณด์.
๋๋ 2๋ก ๋๋จธ์ง์
์ ํด์ 1์ด ๋จ์ผ๋ฉด ํ์ ์ค๋๋ก, 0์ด ๋จ์ผ๋ฉด ์ง์ ์ค๋๋ก ๊ฐ๋๋ก ๊ตฌ์ฑํ๋ค.
create table ์ค๋๋ช
partition of ํํฐ์
ํ
์ด๋ธ๋ช
for values with(๊ฐ ์กฐ๊ฑด...);
๊ทธ๋ผ ๋ด๋ถ์ ์ผ๋ก ์ค๋ ํ
์ด๋ธ์ด ์์ฑ๋๊ณ ๊ด๋ฆฌ๋๋ค.
์ด๋ ๊ฒ ๋ณด์ผ ๊ฒ์ด๋ค.

์ด์ ๋ถํฐ๋ ํํฐ์
์ฉ ํ
์ด๋ธ์ ์ผ๋ฐ ํ
์ด๋ธ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ฅ ๋ฃ๋๊ฒ๋ ๋ฌธ์ ์๊ณ

์ฝ์ด์ฌ๋๋ ์ ์ฝ์ด์จ๋ค.

๊ทธ๋ฅ ์ญ ์ฝ์ด์ค๋๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ํ๋์ ์ฐ์ด๋ณด๋ฉด
์ค์ ๋ก๋ 2๋ฒ ํธ์ถํด์ ์ด์ด๋ถ์ด๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๋ฐ๋๋ก ์ง์๊ฐ๋ง ํํฐํ๋๋ก ์ ๋ํ๋ฉด
์ง์ ์ค๋๋ง ์ฝ์ด์ ๊ฐ์ ธ์ฌ ๊ฒ์ด๋ค.
๋ค๋ฅธ ํ์ (range)
๋ฐ๋ก ์์์๋ hash๋ก ์ค๋ฉ์ ํ์ง๋ง, ์ค์ ๋ก๋ range ๊ธฐ๋ฐ์ ์ค๋ฉ๋ ๊ณง์ ์ฐ์ด๊ณค ํ๋ค.
๋ก๊ทธ์ฑ ๋ฐ์ดํฐ ๊ฐ์ ๊ฒ๋ค์ ๋ฌ์ด๋ ์ฐ ๋จ์๋ก ๋ถํ ํด์ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
์ฐ์ ํํฐ์ ์ฉ ํ ์ด๋ธ์ ์ ์ํ ๋ hash ๋์ range๋ฅผ ๋ฃ์ด์ค๋ค.

๊ทธ๋ฆฌ๊ณ ์ด๊ฑธ ์ฐ๋จ์๋ก ์ค๋ฉํ ์ ์๊ฒ ํํฐ์ ๋ค์ 3๊ฐ๋ง ์ถ๊ฐํด๋ณด๊ฒ ๋ค.
์ด๋ฐ์์ผ๋ก FROM - TO์ ๋ฒ์๊ฐ์ ์ ์ง์ด๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ created_at ๋ ์ง๊ฐ์ ๋ฐ๋ผ ๊ฐ๊ฐ์ ์ค๋๋ก ์ ์ฅ์ด ๋ ๊ฒ์ด๋ค.

์ฐธ์กฐ
https://www.postgresql.org/docs/current/ddl-partitioning.html
https://needjarvis.tistory.com/574
https://www.digitalocean.com/community/tutorials/understanding-database-sharding
https://www.postgresql.fastware.com/postgresql-insider-prt-ove