분산 시스템에서 유일성이 보장되는 ID를 만드는 방법은 여러가지이다.
- 다중 마스터 복제 (multi-master replication)
- UUID (Universally Unique Identifier)
- 티켓 서버 (Ticket Server)
- 트위터 스노플레이크 (Twitter Snowflake) 접근법
다중 마스터 복제
이 접근법은 데이터베이스의 auto_increment 기능을 활용하는 것이다. 다만 다음 ID의 값을 구할 때 1이 아니라 k만큼 증가시킨다. 여기서 k는 현재 사용중인 데이터베이스의 서버의 수다.
- 데이터베이스 수를 늘리면 초당 생산 가능 ID수도 늘릴 수 있기 때문에 규모 확장성 문제를 어느정도 해결 가능하다.
- 여러 데이터센터에 걸쳐 규모를 늘리기 어렵다.
- ID의 유일성은 보장되지만 그 값이 시간 흐름에 맞추어 커지도록 보장할 수는 없다.
- 서버를 추가하거나 삭제할때도 잘 동작하도록 만들기 어렵다.
UUID
컴퓨터 시스템에 저장되는 정보를 유일하게 식별하기 위한 128비트짜리 수다.
- UUID는 서버 간 조율 없이 독립적으로 생성 가능하다.
장점
- UUID를 만드는 것은 단순하다. 서버 사이의 조율이 필요없으므로 동기화 이슈도 없다.
- 각 서버가 자기가 쓸 ID를 알아서 만드는 구조이므로 규모확장도 쉽다.
단점
- ID가 128비트로 길다.
- ID를 시간순으로 저렬할 수 없다.
- iD에 숫자아닌 값이 포함될 수 있다.
티켓 서버
auto_increment 기능을 갖춘 데이터베이스 서버, 즉 티켓 서버를 중앙 집중형으로 하나만 사용하는 것이다.
장점
- 유일성이 보장되는 오직 숫자로만 구성된 ID를 쉽게 만들 수 있다.
- 구현하기가 쉽고, 중소 규모 애플리케잇ㄴ에 적합하다.
단점
티켓서버가 SPOF(Single-Point-Of-Failure)가 된다. 이 서버에 장애가 발생하면, 해당 서버를 이용하는 모든 시스템이 영향을 받는다.
이 이슈를 피하기 위해서는 티켓 서버를 여러대 준비해야하는데 그렇게 되면 데이터 동기화문제가 생길 수 있다.
트위터 스노플레이크 접근법
생성해야하는 ID 구조를 여러 절(section)로 분할하는 것이다.
- 사인 비트 : 1비트 할당. 음수 양수를 구별하는 데 사용가능
- 타임스탬프 : 41비트 할당. 기원 시각(epoch) 이후로 몇 밀리초가 경과했는지를 나타내는 값이다.
- 데이터센터 ID : 5비트 할당. $2{^5}$ = 32 개의 데이터센터를 지원할 수 있다.
- 서버 ID : 5비트 할당. 데이터 센터당 32개의 서버를 사용할 수 있다.
- 일련번호 : 12비트 할당. 각 서버에서는 ID를 생성할 때마다 이 일련 번호를 1반큼 증가시킨다. 이 값은 1밀리초가 경과할 때마다 0으로 초기화(reset)된다.
데이터 센터 ID와 서버 ID는 시스템이 시작할 때 결정되며, 일반적으로 시스템 운영중에는 바뀌지 않는다. 데이터 센터 ID나 서버 ID를 잘못 변경하게 되면 ID 충돌이 발생할 수 있으므로, 그런 작업을 해야 할 때는 신중해야한다. 타임스탬프나 일련번호는 ID 생성기가 돌고 있는 중에 만들어지는 값이다.
타임스탬프
타임스탬프는 앞서 살펴본 ID구조에서 가장 중요한 41비트를 차지하고 있다.
타임스탬프는 시간이 흐름에 따라 점점 큰 값을 갖게 되므로, 결국 ID는 시간순으로 정렬가능하게 될 것이다.
일련번호
일련번호는 12비트이므로 $2^{12}$=4096개의 값을 가질 수 있다. 어떤 서버가 같은 밀리초 동안 하나 이상의 ID를 만들어 낸 경우에만 0보다 큰 값을 갖게된다.
요약
시계 동기화
이번 설계에서는 ID생성 서버들이 모두 같은 시계를 사용한다고 가정하였으나, 그렇지 않은 경우 유효하지 않을 수 있다.
NTP(Network Time Protocol)은 이 문제를 해결하는 가장 보편적 수단이다.
각 절(section)의 길이 최적화
동시성이 낮고 수명이 긴 애플리케이션이라면 일련번호 절의 길이를 줄이고 타임스탬프 질의 길ㅣ를 늘리는 것이 효과적일 수 있다.
고가용성(high availability)
ID생성기는 피수 불가결 컴포넌트이므로 아주 높은 가용성을 제공해야 할 것이다.
'🏛️ Architecture' 카테고리의 다른 글
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 9장 웹 크롤러 설계 (3) | 2023.03.12 |
---|---|
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] Chapter 8 URL 단축기 설계 (2) | 2023.03.07 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 6장 키-값 저장소 설계 (1) | 2023.02.28 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 5장. 안정 해시 설계 (0) | 2023.02.28 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 4장 처리율 제한 장치의 설계 (1) | 2023.02.24 |