[PostgreSQL] ์ƒค๋”ฉ(sharding) - partition

SQL RDB์—์„œ ์ƒค๋”ฉ์ด๋ž€ ๊ทœ๋ชจ๊ฐ€ ํฐ ํ…Œ์ด๋ธ”์„ ์ž„์˜๋กœ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ๋ถ„ํ• ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

๋‹ค ํ’€์Šค์บ”์„ ๋•Œ๋ฆฌ๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ํ•œ๊ณณ์— ์ €์žฅํ•˜๊ธฐ ํž˜๋“ค ์ •๋„์˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋‹ค๋ณด๋ฉด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.




์ƒค๋”ฉ์˜ ์›๋ฆฌ

๋Œ€๋žต์ ์ธ ์›๋ฆฌ๋Š” ์ด๋ ‡๋‹ค.

  1. ์ผ๋‹จ ์ปฌ๋Ÿผ์ค‘์— ๊ธฐ์ค€๊ฐ’์œผ๋กœ ์‚ผ์„ ๊ฒƒ์„ ํ•˜๋‚˜ ์ •ํ•œ๋‹ค. ๋ณดํ†ต์€ ์œ ์ผ์„ฑ์ด ๋ณด์žฅ๋˜๊ณ  ์ธ๋ฑ์Šค๋ฅผ ํƒ€๋Š” ๊ธฐ๋ณธํ‚ค ๋“ฑ์œผ๋กœ ์ •ํ•  ๊ฒƒ์ด๋‹ค.
  2. ๋งŒ์•ฝ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ผ๋ฉด ์œ ์ € ๊ณ ์œ ๋ฒˆํ˜ธ user_id๊ฐ€ 1,2,3,4... ์˜ ์ˆœ์„œ๋กœ ๋“ค์–ด๊ฐ€์žˆ์„ ๊ฒƒ์ด๋‹ค.
  3. ์ƒค๋“œ ๋ถ„๋ฐฐ์šฉ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. 2๊ฐœ์˜ ํ…Œ์ด๋ธ”๋กœ ์ƒค๋”ฉ์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, user_id๋ฅผ ํ™€์ˆ˜ ์ง์ˆ˜๋Œ€๋กœ ๋ถ„๋ฐฐ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.
  4. ๊ทธ๋Ÿฌ๋ฉด 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