[가상 면접 사례로 배우는 대규모 시스템 설계 기초]7. 분산 시스템을 위한 유일 ID 생성기 설계
https://product.kyobobook.co.kr/detail/S000001033116
가상 면접 사례로 배우는 대규모 시스템 설계 기초 | 알렉스 쉬 - 교보문고
가상 면접 사례로 배우는 대규모 시스템 설계 기초 | “페이스북의 뉴스 피드나 메신저,유튜브, 구글 드라이브 같은 대규모 시스템은 어떻게 설계할까?” IT 경력자라도 느닷없이 대규모 시스템
product.kyobobook.co.kr
1장 사용자 수에 따른 규모 확장성 : https://inhyeok-blog.tistory.com/40
2장 개략적인규모추정 : https://inhyeok-blog.tistory.com/41
3장 시스템 설계 면접 공략법 : https://inhyeok-blog.tistory.com/42
4장 처리율제한장치의설계 : https://inhyeok-blog.tistory.com/43
5장 안정해시설계 : https://inhyeok-blog.tistory.com/44
6장 키-값저장소설계 : https://inhyeok-blog.tistory.com/45
7장 분산시스템을위한유일 ID 생성기설계 : https://inhyeok-blog.tistory.com/46
8장 URL 단축기설계 : https://inhyeok-blog.tistory.com/47
9장 웹크롤러설계 : https://inhyeok-blog.tistory.com/48
10장알림시스템설계 : https://inhyeok-blog.tistory.com/49
11장뉴스피드시스템설계 : https://inhyeok-blog.tistory.com/50
12장채팅시스템설계 : https://inhyeok-blog.tistory.com/51
13장검색어자동완성시스템 : https://inhyeok-blog.tistory.com/52
14장유튜브설계 : https://inhyeok-blog.tistory.com/53
15장구글드라이브설계 : https://inhyeok-blog.tistory.com/54
이번 장에서는 분산환경에서 사용될 유일 ID 생성기를 설계한다. auto_increment 속성이 설정된 관계형 데이터베이스의 기본 키를 사용하는 것은 DB서버 한대로 그 요구를 감당할 수 없을 뿐더러, 여러 DB서버를 쓰는 경우에는 지연 시간을 낮추기가 무척 힘들 것이기 때문에 불가능하다. 이제 아래에서 자세한 설계를 살펴본다.
요구사항
- ID는 유일해야 한다.
- ID는 숫자로만 구성되어야 한다.
- ID는 64비트로 표현될 수 있는 값이어야 한다.
- ID는 발급 날짜에 따라 정렬 가능해야 한다.
- 초당 10,000개의 ID를 만들 수 있어야 한다.
후보
1. 다중 마스터 복제(multi-master replication)
다중 마스터 복제는 n개의 DB서버에서 1씩 증가하는 값을 생성하는 것이 아니라, n씩 증가하는 값을 생성하는 것이다. 하지만 이 방식은 여러 데이터 센터에 걸쳐 규모를 늘리기 어려우며, 서버를 추가/삭제할 때도 잘 동작하도록 하기 어렵다. 그리고 ID의 유일성은 보장되지만, 시간이 흐름에 따라 커지도록 할 수 없다.
2. UUID
UUID는 랜덤한 값을 사용하는 128비트짜리 수다. 충돌확률이 0에 가깝게 작다.(물론 0은 아니다) UUID는 각 서버에서 독립적으로 ID를 발급하는 방식이기 때문에 동기화이슈도 없고, 단순하다. 또한 규모에 확장 역시 간편하다. 하지만 128비트로 길이가 길고, 시간순으로 정렬할 수 없으며, ID에 숫자가 아닌 값이 포함된다는 단점이 있다.
3. 티켓서버
ID를 생성하는 서버를 하나 두고 필요할 때마다 발급 받는 것이다.(아이디를 생성하는 방식은 auto_increment) 이는 유일성이 보장되는 오직 숫자로만 구성된 ID를 쉽게 만들 수 있다. 구현이 쉽고, 중소 규모 애플리케이션에 적합하다. 하지만 티켓서버가 SPOF가 된다는 치명적인 단점이 있다.
4. 트위터 스노플레이크 접근법(땅땅땅 결정)
트위터 스노플레이스 ID 생성 기법은 다음과 같다.
사인 비트(1비트) + 타임스탬프(41비트) + 데이터센터 ID(5비트) + 서버 ID(5비트) + 일련번호(12비트)
이 방법은 앞선 모든 요구사항을 만족시킬 수 있다!