์Šคํ”„๋ง

์Šคํ”„๋ง ๋Œ€๊ทœ๋ชจ์‹œ์Šคํ…œ์„ค๊ณ„ (2)

KIMHYEYUN 2025. 1. 11. 21:13
๋ฐ˜์‘ํ˜•

๊ฒŒ์‹œ๊ธ€ ํ…Œ์ด๋ธ” ์„ค๊ณ„

column_name Type Description
article_id BIGINT Primary Key
title VARCHAR(100) ์ œ๋ชฉ
content VARCHAR(3000) ๋‚ด์šฉ
board_id BIGINT ๊ฒŒ์‹œํŒID(Shard Key)
writer_id BIGINT ์ž‘์„ฑ์žID
created_at DATETIME ์ƒ์„ฑ์‹œ๊ฐ„
modified_at DATETIME ์ˆ˜์ •์‹œ๊ฐ„

์—ฌ๊ธฐ์„œ Shard Key๋Š” ๊ฒŒ์‹œํŒ ID
์™œ? ๊ฒŒ์‹œ๊ธ€ ์„œ๋น„์Šค๋Š” ๊ฒŒ์‹œํŒ ๋‹จ์œ„๋กœ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ธฐ์—, ๊ฒŒ์‹œํŒ ๋‹จ์œ„๋กœ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์ด ์กฐํšŒ๋˜๋Š” ๊ฒƒ

primary key ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Snowflake ์‚ฌ์šฉ

  • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๊ณ ์œ ํ•œ 64bit ID๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ๋„ ์ค‘๋ณต ์—†์ด ์ˆœ์ฐจ์  ID๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์น™
    • [1bit][41bits:ํƒ€์ž„์Šคํƒฌํ”„][10bits:๋…ธ๋“œID][12bits:์‹œํ€€์Šค ๋ฒˆํ˜ธ]
    • ํƒ€์ž„์Šคํƒฌํ”„ : ์ˆœ์ฐจ์„ฑ
    • ๋…ธ๋“œID + ์‹œํ€€์Šค ๋ฒˆํ˜ธ : ๊ณ ์œ ์„ฑ
  • ์œ ๋‹ˆํฌ, ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ์ˆœ์ฐจ์„ฑ, ๋ถ„์‚ฐํ™˜๊ฒฝ์—์„œ์˜ ๋†’์€ ์„ฑ๋Šฅ

DB Shard ๋ž€?

์ˆ˜ํ‰์  ๋ฐ์ดํ„ฐ ๋ถ„ํ• ์„ ํ†ตํ•ด ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ™•์žฅ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.
๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ DB๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
๊ฐ ๋ถ„๋ฆฌ๋œ DB๋ฅผ Shard๋ผ๊ณ  ํ•˜๋ฉฐ, ์ƒค๋“œ์—๋Š” ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋ถ„๋งŒ ์ €์žฅ๋œ๋‹ค.

์‚ฌ์šฉ ์ด์œ 

  • ๋ฐ์ดํ„ฐ ์–‘ ์ฆ๊ฐ€ ๋ฌธ์ œํ•ด๊ฒฐ
  • ํ™•์žฅ์„ฑ(Scalability)
  • ์„ฑ๋Šฅ ํ–ฅ์ƒ
  • ๊ฐ€์šฉ์„ฑ(Availability)

์›๋ฆฌ

๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ๊ธฐ์ค€์— ๋”ฐ๋ผ ๋‚˜๋ˆ„์–ด ๊ฐ ์ƒค๋“œ์— ์ €์žฅํ•œ๋‹ค. ์ƒค๋“œ ๊ฐ„์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๋ณต๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ๋ถ„ํ•  ๊ธฐ์ค€์€ ์„ค๊ณ„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

  1. ์ƒค๋”ฉ ํ‚ค(Sharding Key)
    ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ธฐ์ค€์ด ๋˜๋Š” ํ‚ค
  2. ์ƒค๋“œ ํ• ๋‹น ๋ฐฉ์‹
    ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค ์ƒค๋“œ์— ๋ฐฐ์น˜ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ๋ฒ”์œ„ ๊ธฐ๋ฐ˜ ์ƒค๋”ฉ(Range-based Sharding)
      ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ๊ฐ’ ๋ฒ”์œ„๋กœ ๋‚˜๋ˆ”
    • ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์ƒค๋”ฉ(Hash-Based Sharding)
      ์ƒค๋”ฉ ํ‚ค๋ฅผ ํ•ด์‹ฑํ•˜์—ฌ ์ƒค๋“œ๋ฅผ ์„ ํƒ
    • ์ง€์—ญ ๊ธฐ๋ฐ˜ ์ƒค๋”ฉ(Geographic-Based Sharding)
      ๋ฐ์ดํ„ฐ๋ฅผ ์ง€๋ฆฌ์  ์œ„์น˜์— ๋”ฐ๋ผ ๋ถ„ํ• 

์žฅ์ ๊ณผ ๋‹จ์ 

์žฅ์ 

  1. ํ™•์žฅ์„ฑ
  2. ์„ฑ๋Šฅํ–ฅ์ƒ
  3. ๋…๋ฆฝ์  ์žฅ์•  ์ฒ˜๋ฆฌ
  4. ๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ

๋‹จ์ 

  1. ๋ณต์žก์„ฑ ์ฆ๊ฐ€
  2. ๋ฐ์ดํ„ฐ ์ด๋™ : ์ƒค๋“œ ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์žฌ๋ถ„ํ• (resharding)ํ•  ๋•Œ ๋ณต์žกํ•œ ์ž‘์—… ํ•„์š”
  3. ๊ธ€๋กœ๋ฒŒ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์–ด๋ ค์›€ : ์ƒค๋“œ๊ฐ„ ํŠธ๋žœ์žญ์…˜(Distrubuted Transactions)์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›€
  4. ์ฟผ๋ฆฌ ์ œํ•œ : ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„์‚ฐ๋˜๋ฏ€๋กœ ์ง‘๊ณ„ ์ฟผ๋ฆฌ์™€ ๊ฐ™์€ ์ž‘์—…์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ
  5. ๋ฐ์ดํ„ฐ ๋ถˆ๊ท ํ˜• : ์ž˜๋ชป๋œ ์ƒค๋”ฉํ‚ค ์‚ฌ์šฉ์‹œ ํŠน์ • ์ƒค๋“œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชฐ๋ฆด ์ˆ˜ ์žˆ์Œ

ํ—›ํŠผ์ง“ 2

์ด๋ฒˆ์—๋Š” docker์—์„œ ๊ตฌ์„ฑํ•œ db ์—ฐ๊ฒฐ์—์„œ ๋ฌธ์ œ๋ฐœ์ƒ;;;
์ •์ƒ์ ์œผ๋กœ ์ž˜ํ•œ๊ฑฐ๊ฐ™์€๋ฐ;;

server:
  port: 9000
spring:
  application:
    name: kuke-board-article-service
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/article
    username: root
    password: root
  jpa:
    database-platform: org.hibernate.dialect.MySQLDialect
    open-in-view: false
    show-sql: true
    hibernate:
      ddl-auto: none

๊ทผ๋ฐ ๊ณ„์†ํ•ด์„œ ์—ฐ๊ฒฐ ์‹คํŒจ;!

๋ณ„๋ณ„์ง“ ๋‹คํ•ด๋ดค๋‹ค....

uri ๋ณ€๊ฒฝ๋ถ€ํ„ฐ docker container ์žฌ์‹œ์ž‘ ๋“ฑ๋“ฑ ๊ทผ๋ฐ ํ˜น์‹œ...... ๋‚ด pc์— mysql ์žˆ๋Š”๋ฐ... ๊ฑ”๋„ 3306 ์ธ๋ฐ;;;

ํ™•์ธ ๊ฒฐ๊ณผ

์—ญ์‹œ๋‚˜ 2๊ฐœ๊ฐ€ ๋Œ์•„๊ฐ€๋Š”์ค‘...

์ด๋ฏธ ๋‚ด ๋…ธํŠธ๋ถ mysql์ด  127.0.0.1:3306์„ ์‚ฌ์šฉ์ค‘์ด์—ˆ๋˜ ๊ฒƒ!

๊ทธ๋ž˜์„œ docker์˜ mysql์„ 3307:3306 ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ค์‹œ ์ƒ์„ฑํ•ด์ฃผ๋‹ˆ ์ •์ƒ ๋™์ž‘!

ํ—›ํŠผ์ง“ 3

test๋ฅผ ์œ„ํ•ด์„œ RestClient๋ฅผ ์ด์šฉํ–ˆ๋Š”๋ฐ ๊ณ„์† http://localhost:9000/v1/articles๋ฅผ ๋ชป์ฐพ๋Š”๋‹ค๊ณ  ๋‚˜์™”๋‹ค...

์•Œ๊ณ ๋ณด๋‹ˆ Spring Boot Application์„ ์‹คํ–‰ํ•˜๋ฉด์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋Œ๋ ค์•ผํ–ˆ์Œ.... ใ…Žใ…Žใ…Žใ…Ž

728x90
๋ฐ˜์‘ํ˜•