dh_0e

[특강] 샤딩(Sharding) 본문

내일배움캠프/특강

[특강] 샤딩(Sharding)

dh_0e 2024. 6. 11. 20:40
 CCU가 엄청나게 늘어나면 Pool에는 커넥션이 메마르고, 데이터베이스가 부족해진다. 이 떄 샤딩이란 기술을 활용하여 이 문제를 해결해보자.

 

샤딩(Sharding)

  • 데이터를 조각내 분산 저장하는 데이터 처리 기법으로 일괄적 관리가 힘든 거대 데이터베이스나 네트워크를 물리적으로 쪼개는 기술이다.
  • 즉, 하나의 게임 서버 데이터를 하나의 데이터베이스에서 관리하는 것이 아닌 여러 데이터베이스에서 나눠서 관리를 한다는 것

장점

  • 더 많은 커넥션을 준비시킬 수 있어 CCU가 늘어나도 크게 지장을 받지 않음
  • 샤드는 독립적으로 작동하기 때문에 요청을 병렬적으로 처리할 수 있음 > 전반적인 성능 향상
  • 특정 샤드가 문제가 생겨도 일부 유저들을 제외하고는 전체 게임 자체의 가용성은 계속 유지할 수 있음

방법

로직으로 샤드를 나눌 수 있다. 플레이어 ID % 샤드의 총 개수 = 저장되는 샤드 번호
ex) 샤드가 4개일 때, 플레이어 ID가 4, 8, 12, ... 이면 0번샤드에,1, 5, 9, ...이면 1번 샤드에 저장
범위 기반으로도 샤드를 나눌 수 있다. 1~1000 1번째 샤드, 1001~2000 2번째 샤드 ..

 

문제점

샤드의 총 개수는 회사의 재정적 문제나 게임의 흥행에 의해 줄어들 수도, 늘어날 수도 있음

이런 식의 문제가 발생함

해결 방법

위 문제점이 해결되기 위해 2가지를 해결 해야한다.

1. 해시 값들이 균등하게 분포되어야 함
2. 샤드의 총 개수와 같은 외부 요인으로 인해 기존의 해싱 결과가 지장을 받으면 안 됨

이를 어느정도 해결하는 방법이 Consistent Hashing 기법이다.

 

Consistent Hashing

  • 해시 링을 기반으로 동작을 하는 해싱 기법

출처: https://medium.com/@saransh98/node-js-implement-consistent-hashing-f024e43b4259

  • 위 그림에서 req가 플레이어 ID이며 S가 샤드라고 할 때, 시계 방향으로 해시 링을 탐색해 나가면서 만나는 것이 첫 번째 샤드라고 할 때 아래 그림과 같이 샤드가 정해지며 플레이어 ID가 저장된다.

  • 이 때, S2 샤드가 제거 된다고 가정하면, 플레이어 ID 4, 5를 제외하곤 재배치를 하지 않아도 된다.
  • 전반적으로 데이터를 재배치하는 것이 아닌, 최소한의 이동만 할 수 있다.

출처: https://jiwondev.tistory.com/299

  • 또한 다음과 같이 가상 노드라는 개념을 도입하여 여러 가상 샤드를 링에 배치하면 샤드의 개수가 적을 때에도 적은 데이터만을 추가적으로 사용하여 데이터가 특정 샤드로 편중되는 것을 막아준다.

 

단점

  • 일반적으로 트랜잭션은 단일 데이터베이스에서만 작동이 되도록 설계되어 있어 트랜잭션 적용에 어려움이 있다. (ACID 속성의 원자성때문)
  • 여러 유저의 여러 테이블들을 JOIN해서 결과를 보여줘야 할 때에도 단일 데이터베이스에 비해서 느리다.

 

결론

  • 장점처럼 단점도 명확하기 때문에 필요한 순간에만 적용을 하자.

샤딩 체크리스트

  • [ ] 데이터베이스 크기가 커서 단일 서버로 처리하기 어려운가요?
  • [ ] 동시 접속자가 많아 단일 데이터베이스 서버의 커넥션 한계를 초과합니까?
  • [ ] 현재 데이터베이스 성능이 부족하여 응답 시간이 길거나 처리 속도가 느린가요?
  • [ ] 복잡한 샤드 관리와 모니터링을 처리할 수 있는 기술적 능력과 자원이 충분한가요?
  • [ ] 분산 트랜잭션 관리를 할 수 있는 역량이 있습니까?