메모리, 데이터베이스 샤딩

shockwave·2024년 10월 24일

TIL

목록 보기
40/49

메모리에 대해

CPU에 가까울 수록 빠르지만 용량이 적다
레지스터 (가장 빠른 저장장치)
--(캐시메모리)--
메모리
보조기억장치

주기억 장치

  • RAM
    읽기 쓰기 가능한 휘발성 메모리

  • ROM
    HDD, SSD, CD-ROM, USB
    읽기 전용 메모리 (전원이 꺼져도 유지됨)

  • CPU
    레지스터의 '논리' 주소를 이해하고 해당 주소의 데이터를 연산함

  • MMU (Memory Management Unit)
    메모리 매니지먼트 유닛
    레지스터 메모리에 저장된 물리 주소와 CPU가 이해하는 논리주소를 서로 치환해주는 역할을 함
    CPU는 논리주소만 알고 있고, 레지스터(메모리)는 물리 주소를 알고 있다.
    논리주소만으로는 메모리 내 정확한 데이터의 위치를 알 수 없다.
    그 위치를 알 수 있도록 도와주는 것이 MMU이다.

CPU가 논리주소로부터 메모리 위치를 찾는 방법
1. CPU가 논리주소 전달
2. MMU가 물리 주소 변환
3. 베이스 레지스터(물리 주소를 갖는 메모리)에서 물리주소 찾기
4. 물리 주소로 특정된 메모리 위치 찾음

  • 메모리 삭제 과정을 짧게 보자면?
    CPU -> 프로세스 A의 100번지 삭제
    MMU -> 베이스 레지스터에 프로세스 A의 물리주소 3000을 담고 있다.
    메모리 -> 3000 + 100 (3100) 물리주소 삭제
    /
    CPU -> 프로세스 B의 100번지 삭제
    MMU -> 베이스 레지스터의 프로세스 B의 물리주소 2000을 담고 있다.
    메모리 -> 2000 + 100 (2100) 물리주소 삭제
  • 베이스 레지스터
    실행 중인 프로그램의 가장 작은 물리 주소를 저장한다.

  • 한계 레지스터
    논리 주소의 최대 크기를 저장한다.

해당 프로그램이 베이스 레지스터에 100, 한계 레지스터에 150이 저장되어 있다면
해당 프로그램의 크기는 100 ~ 249번지의 주소 공간을 갖는다.

한계 레지스터가 없다면?
다른 프로그램의 주소 공간을 침범할 수 있음.
-> 인터럽트(트랩) 발생


데이터베이스 샤딩

게임 서비스 중 동접자수(CCU)가 늘어나면?
-> 트래픽이 과다하게 쏠린다
-> 쓰레드가 아파한다.

수평적 샤딩(Horizontal Sharding)
서버를 늘려서 여러 서버에 분할하여 데이터를 저장시킨다. (DB 분산)
4개의 서버로 분산 -> DB를 사용하기 위한 서버의 비용이 4배 + @(백업서버도 필요)

서버가 줄어드는 상황이라면,
데이터의 재분배를 진행해야 한다.
이 때, 서버에 저장된 데이터의 양에 따라 데이터 이동은 시스템에 큰 부하를 줄 수 있다.
이 문제를 어느정도 해결하는 방법이 있다.
-> 해시 링 기반 (Consistent Hashing 기법)

  • 샤딩의 장점
  1. 많은 커넥션을 준비 시킬 수 있어 CCU(동접자)가 늘어나도 부담이 없음(안정성)
  2. 샤드는 독립적으로 작동하기 때문에 요청을 병렬적으로 처리한다 (성능 향상)
  • 샤딩의 단점
  1. 병렬적이므로 서로 간의 트랜잭션이 어렵다.
    -> 트랜잭션 매니저로 가능하긴 하다. (Two-Phase Commit 프로토콜 - MSA에서 사용)
  2. 트랜잭션을 사용한다 쳐도 단일 트랜잭션에 비해 매우 느리다.
  3. 비용적 문제
  • 샤딩을 사용하기 전에 확인할 사항
  1. 데이터베이스 크기가 커서 단일 서버로 처리하기 힘든가?
  2. CCU가 단일 데이터베이스 서버의 커넥션 한계를 초과하는가?
  3. 현재 데이터베이스 성능이 부족한가?
  4. 샤드 관리와 모니터링 처리가 가능한 기술적 능력과 자원이 충분한가?
  5. 분산 트랜잭션 관리 역량이 되는가?
profile
생각을 많이. 입은 무겁게. 심장은 항상 열심히 뛰는 사람이 되자.

0개의 댓글