데이터베이스 샤딩

Database sharding

행을 샤드 키에 따라 여러 DB에 나눠 저장합니다.

···
html
<div class="demo"><div class="head"><b>user_id % 4</b><span id="user">user 42</span></div><div class="stage shard"><div class="router">ID →</div><div class="shards"><div class="cell">shard 0</div><div class="cell">shard 1</div><div class="cell">shard 2</div><div class="cell">shard 3</div></div></div><div class="foot"><span id="route">42 → shard 2</span><span>one key, one route</span></div></div>
css
*{box-sizing:border-box}.demo{width:min(96vw,820px);height:min(94vh,350px);padding:clamp(8px,2vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);color:var(--fg);display:flex;flex-direction:column;gap:clamp(5px,1.5vmin,12px);font:600 clamp(12px,3.5vmin,15px)/1.25 var(--font-sans),sans-serif;overflow:hidden}.head,.foot,.row{display:flex;justify-content:space-between;align-items:center;gap:8px}.head b{color:var(--accent)}.head span,.foot,.muted{color:var(--muted)}.stage{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;gap:8px}.cell,.pill{border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:clamp(4px,1.2vmin,9px);text-align:center}.pill{border-radius:999px}.on{border-color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 17%,var(--surface))!important;color:var(--fg)!important}.bad{border-color:#e16a5d!important;background:color-mix(in srgb,#e16a5d 18%,var(--surface))!important}.foot{font-size:clamp(12px,3vmin,14px)}.shard{justify-content:space-around}.router{font:700 clamp(17px,6vmin,27px) var(--font-sans),sans-serif;text-align:center;color:var(--accent)}.shards{display:grid;grid-template-columns:repeat(2,minmax(65px,1fr));gap:6px;min-width:60%}.shards .cell{white-space:nowrap}
js
let n=0;const ids=[42,17,28,39];function tick(){document.getElementById('user').textContent='user '+ids[n];document.querySelectorAll('.shards .cell').forEach((e,i)=>e.classList.toggle('on',i===ids[n]%4));document.getElementById('route').textContent=ids[n]+' → shard '+ids[n]%4;n=(n+1)%4}tick();const t=setInterval(tick,850);document.querySelector('.demo').onclick=()=>{clearInterval(t);tick()}

샤딩은 하나의 논리적 데이터셋을 여러 물리적 데이터베이스에 수평으로 나누는 방식입니다. 요청은 샤드 키를 기준으로 해당 조각에 전달됩니다.

데모는 사용자 ID를 4로 나눈 나머지에 따라 샤드를 고릅니다. 실제 시스템은 해시나 범위 분할 등 다른 방식도 쓸 수 있습니다. 샤드를 가로지르는 조인과 집계는 복잡해지고, 키가 치우치면 특정 서버만 붐빌 수 있습니다.

언제 쓰나

단일 DB의 저장·쓰기 한계가 확인되고 적절한 분산 키가 있을 때 검토합니다.

페이지로 열기 ↗