[대규모 시스템 설계] 분산 시스템의 유일 ID 생성기 설계
가상 면접 사례로 배우는 대규모 시스템 설계 기초 요약정리 글입니다.
우리가 일반적으로 데이터베이스 ID 생성에 사용하는 auto_increment 속성은 분산 환경에서 사용하기 힘들다.
여러 데이터베이스 서버를 사용하는 경우 ID의 일관성을 유지하기 어렵고 지연 시간을 낮추기 힘들기 때문이다.
유일 ID 생성기 설계는 분산 시스템에서 달성하고자 하는 요구사항마다 달라질 수 있다.
따라서 학습을 위해 다음과 같은 요구사항이 있다고 가정하고 설계를 진행해보자.
유일 ID 생성 요구사항 예시
- ID는 유일해야 한다.
- ID는 숫자로만 구성되어야 한다.
- ID는 64비트로 표현될 수 있는 값이어야 한다.
- ID는 발급 날짜에 따라 정렬이 가능해야 한다.
- 초당 10,000개의 ID를 만들 수 있어야 한다.
유일성이 보장되는 ID 생성 방법
분산 시스템에서 유일성이 보장되는 ID를 만드는 방법으로 다음과 같은 방법이 있다.
- 다중 마스터 복제
- UUID
- 티켓 서버
- 트위터 스노플레이크 접근법
이러한 방법들에 대한 장단점을 살펴보면 다음과 같다.
다중 마스터 복제
이 방법은 DB의 auto_increment 기능을 활용하는 방법이다.
다만, ID 값을 구할 때 1만큼 증가시키는 것이 아닌 k(DB 서버의 수)만큼 증가시킨다.
장점
- 규모 확장성 문제를 어느 정도 해결할 수 있다.
- DB 수를 늘리면 초당 생산 가능 ID 수도 늘어난다.
단점
- 데이터 센터에 걸친 규모 확장이 어렵다. - 분산 시스템 부적합
- 시간의 흐름에 따라 ID가 커지도록 보장할 수 없다. - 요구사항 부적합
- 서버를 추가하거나 삭제할 때 잘 동작하도록 만들기 어렵다. - 분산 시스템 부적합
UUID
UUID는 유일성이 보장되는 ID를 만드는 간단한 방법으로 128비트짜리 수를 말한다.
UUID 값은 충돌 가능성이 매우 낮기 때문에 서버 간 조율 없이 독립적으로 생산이 가능하다.
웹 서버 하나당 한 개의 UUID 생성기를 사용하면 독립적인 ID가 만들어진다.
장점
- 서버 사이의 조율이 필요 없어지므로 동기화 이슈도 사라진다.
- 각 서버가 ID 생성기를 가지는 구조이므로 규모 확장이 쉽다.
단점
- 128비트짜리 수로 이루어지기 때문에 ID가 길다. - 요구사항 부적합
- ID를 시간순으로 정렬할 수 없다. - 요구사항 부적합
- ID에 숫자가 아닌 값이 포함될 수 있다. - 요구사항 부적합
티켓 서버
티켓 서버의 핵심 아이디어는 auto_increment 기능을 갖춘 데이터베이스 서버를 중앙 집중형으로 하나만 사용하도록 하는 것이다.
장점
- 유일성이 보장되는 숫자로만 구성된 ID를 쉽게 만들 수 있다.
- 구현하기 쉽고, 중소 규모 애플리케이션에 적합하다.
단점
- 티켓 서버가 중앙 집중형으로 사용되므로 단일 장애 지점이 될 수 있다. - 분산 시스템 부적합
트위터 스노플레이크 접근법
트위터에서 사용하는 스노플레이크라고 부르는 독창적인 ID 생성 기법이다.
생성해야 하는 ID 구조를 여러 section으로 분할하고 각 section에는 각자의 쓰임새를 나타내는 정보를 담는다.
sign
- 1 bit 할당
- 음수와 양수를 구별하는 데 사용된다.
타임스탬프
- 41 bit 할당
- 기원 시각 이후로 몇 ms가 경과했는지 나타내는 값이다.
데이터센터 ID
- 5 bit 할당
- 5비트이므로 32개의 데이터센터를 지원할 수 있다.
서버 ID
- 5 bit 할당
- 5비트이므로 32개의 서버를 사용할 수 있다.
일련번호
- 12bit 할당
- 각 서버에서는 ID 생성 시마다 해당 값을 1씩 증가시킨다. 이 값은 1ms마다 0으로 초기화된다.
즉, 같은 ms 동안 하나 이상의 ID를 만들어 낸 경우에만 0보다 큰 값을 가지게 된다.
데이터센터 ID와 서버 ID는 시스템이 시작될 때 결정되는 값으로 운영 중엔 바뀌지 않으며,
타임스탬프와 일련번호는 ID 생성기가 돌고 있는 중에 만들어지는 값이다.
이렇게 각 section의 값을 이용해 유일한 ID 값을 생성해낸다.
장점
- 숫자로만 이루어진 유일한 ID가 생성된다.
- 타임스탬프는 시간에 따라 점점 큰 값을 가지게 되므로 시간 순 정렬이 가능하다.
- 64비트로 표현 가능한 ID가 생성된다.
트위터 스노플레이크 접근법은 요구사항 예시를 모두 만족하며 분산 환경에서 규모 확장까지 가능한 방법이다.
이렇듯 유일성이 보장되는 ID 생성기 구현에는 다양한 전략이 있다.
다양한 유일 ID 생성 전략 중 우리가 설계해야 하는 요구사항에 맞는 전략을 적절히 선택해 사용하자.