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으로 초기화 된다.