본문으로 건너뛰기

Unique-Id-Generator

1 Unique Id Generator

  • 분산 시스템에서 사용될 유일한 ID 생성기를 설계해보자.
  • 분산 시스템에서 유일성이 보장되는 ID를 만드는 방법은 여러 가지다.
    • 다중 마스터 복제
    • UUID
    • 티켓 서버
    • 트위터 스노플레이크

요구사항

  • ID는 유일해야 한다.
  • 발급 날짜에 따라 정렬이 가능해야 한다.

2 다중 마스터 복제

  • 이 접근법은 데이터베이스의 auto_increment 기능을 활용한다.
  • 다음 ID의 값을 구할 때 1만큼 증가시키는 것이 아니라 k 만큼 증가시킨다.
    • k: 현재 사용 중인 데이터베이스 서버의 수

단점

  • ID의 유일성은 보장되지만 그 값이 시간 흐름에 맞추어 커지도록 보장할 수는 없다.
    • 하나의 데이터베이스가 계속 아이디를 만들어내다가 다른 데이터베이스에서 아이디를 만들면 시간 흐름상 늦게 만들어졌지만 아이디는 더 작을 수 있다.
  • 서버를 추가하거나 삭제할 때도 잘 동작하도록 만들기 어렵다.

3 UUID

  • [[UUID-And-SequentialID]] 참고
  • UUID는 컴퓨터 시스템에 저장되는 정보를 유일하게 식별하기 위한 128비트 짜리 수다.
  • UUID의 충돌 가능성은 지극히 낮다.
  • UUID는 서버 간 조율 없이 독립적으로 생성 가능하다.
  • UUID는 시간순으로 정렬할 수 없다는 단점이 있지만 최신 버전의 UUID는 시간순 정렬을 지원한다.

장점

  • UUID를 만드는 방법이 단순하여 서버 사이 조율이 필요 없어 동기화 이슈가 없다.
  • 각 서버가 자기가 쓸 ID를 알아서 만드는 구조로 규모 확장도 쉽다.

단점

  • ID가 128비트로 길다.

4 티켓 서버

  • auto increment 기능을 갖춘 데이터베이스 서버(티켓 서버)를 중앙 집중형으로 하나만 사용하는 것

장점

  • 유일성이 보장된다.
  • 구현하기 쉽고 중소 규모의 애플리케이션에 적합하다.

단점

  • 티켓 서버가 SPOF가 된다.
  • 티켓 서버에 장애가 발생하면 해당 서버를 이용하는 모든 시스템이 영향을 받는다.
  • 이를 보완하기 위해 티켓 서버를 여러 대 준비하면 데이터 동기화 같은 새로운 문제가 발생한다.

5 트위터 스노플레이크

  • 트위터는 스노플레이크라고 부르는 독창적인 ID 생성 기법을 사용한다.

ID 구조

![[Pasted image 20230920194038.png]]

  • ID는 64비트로 표현한다.
  • 1비트
    • 부호를 나타낸다.
  • 41비트
    • 타임스탬프 비트다.
    • 기원 시간 이후로 몇 밀리초가 경과했는지를 나타낸다.
    • 41비트로 표현할 수 있는 값은 대략 69년에 해당한다.
    • 따라서 이 ID 생성기는 69년 동안만 정상작동 한다.
  • 10비트
    • 5비트: 데이터센터 ID
    • 5비트: 서버ID
    • 총 32개의 데이터센터와 데이터센터 당 32개의 서버를 지원할 수 있다.
  • 12비트
    • 일련번호를 나타낸다.
    • ID를 생성할 때 각 서버에서 이 번호를 1만큼 증가시킨다.
    • 1밀리초가 경과하면 0으로 초기화 된다.