7. 분산 시스템을 위한 유일 ID 생성기 설계
#
1단계. 문제 이해 및 설계 범위 확정- 다음의 설계 원칙을 예시로 들 수 있습니다.
- ID는 유일해야 합니다.
- ID는 숫자로만 구성되어야 합니다.
- ID는 64비트로 표현될 수 있는 값이어야 합니다.
- ID는 발급 날짜에 따라 정렬 가능해야 합니다.
- 초당 10,000개의 ID를 만들 수 있어야 합니다.
#
2단계. 개략적 설계안 제시 및 동의 구하기- 아래와 같은 선택지가 있습니다.
- 다중 마스터 복제(multi-master replication)
- UUID(Universally Unique Identifier)
- 티켓 서버(ticket server)
- 트위터 스노플레이크(twitter snowflake) 접근법
#
다중 마스터 복제- 데이터베이스의 auto_increment 기능을 활용하는 것이나, 1만큼 증가가 아닌 k만큼 증가시킵니다.
- 아래의 단점이 있습니다.
- 여러 데이터 센터에 걸쳐 규모를 늘리기 어렵습니다.
- ID의 유일성은 보장되나, 값이 시간 흐름에 맞추어 커지도록 보장할 수는 없습니다.
- 서버를 추가하거나 삭제할 때도 잘 동작하도록 만들기 어렵습니다.
#
UUID- UUID는 컴퓨터 시스템에 저장되는 정보를 유일하게 식별하기 위한 128비트짜리 수입니다.
- 다음의 장점이 있습니다.
- UUID를 만드는 것이 단순합니다. 서버 사이의 조율이 필요 없으므로 동기화 이슈도 없습니다.
- 각 서버가 자기가 쓸 ID를 알아서 만드는 구조이므로 규모 확장도 쉽습니다.
- 단점
- ID가 128비트로 깁니다. 요구사항과 맞지않습니다.
- ID를 시간순으로 정렬할 수 없습니다.
- ID에 숫자(numeric) 아닌 값이 포함될 수 있습니다.
#
티켓 서버- auto_increment 기능으 갖춘 데이터베이스 서버(티켓 서버)를 중앙 집중형으로 하나만 사용하는 것입니다.
- 장점은 아래와 같습니다.
- 유일성이 보장되는 오직 숫자로만 구성된 ID를 쉽게 만들 수 있습니다.
- 구현하기 쉽고, 중소 규모 애플리케이션에 적합합니다.
- 단점
- 티켓 서버가 SPOF(Single-Point-of-Failure)가 됩니다.
- 이 서버가 장애가 발생하면, 모든 시스템이 영향을 받습니다.
#
트위터 스노플레이크 접근법- 이 요구사항에 맞는 방법입니다.
- 생성해야 하는 ID의 구조를 여러 절(section)로 분할하는 것입니다.
- 1비트: o
- 1비트를 할당합니다.
- 41비트: 타임 스탬프
- 시각 이후 몇 밀리초가 경과했는지 나타내는 값입니다.
- 5비트: 데이터센터 ID
- 5비트를 할당합니다.(2^5=32개 데이터센터를 지원합니다.)
- 5비트: 서버 ID
- 5비트 할당(위와 같이, 데이터센터당 32개 서버를 사용할 수 있습니다.)
- 12비트: 일련 번호
- 각 서버에서 ID를 생성할 때마다 일련 번호를 1만큼 증가시킵니다.
- 1밀리초가 경과할 때마다 0으로 초기화합니다.
- 1비트: o
#
3단계. 상세 설계#
타임스탬프- 시간이 지날수록 점점 더 큰 값을 같습니다.
- 최대 기간은 69년입니다. 이 기간이 지나면 오버플로가 발생하므로 시각을 바꾸거나 ID체계를 다른 것으로 이전해야 합니다.
#
일련번호- 일련 번호는 12비트이므로, 2^12=4096개의 값을 가질 수 있습니다. 어떤 서버가 같은 밀리초 동안 하나 이상의 ID를 만들어 낸 경우에만 0보다 큰 값을 같게 됩니다.
#
4단계. 마무리- 다음의 사항을 추가로 논의할 수 있습니다.
- 시계 동기화(clock synchronization) : NTP(Network Time Protocol)과 같은 문제로 해결함
- 각 절(section)의 길이 최적화: 동시성(concurrency)이 낮고 수명이 긴 애플리케이션이라면 일련번호 절의 길이를 줄이고 타입스탬프 절의 길이를 늘리는 것이 효과적일 수도 있습니다.
- 고가용성(high availability): ID 생성기는 필수 불가결(mission critical) 컴포넌트이므로 아주 높은 가용성을 제공해야 합니다.