문제 이해 및 설계 범위 확정
질문을 통해 모호함을 없애라
요구사항
- ID는 유일
- ID는 숫자로만 구성
- ID는 64비트로 표현될 수 있는 값
- ID는 발급 날짜에 따라 정렬 가능
- 초당 10,000개의 ID 생성 가능해야 한다.
개략적 설계안 제시 및 동의 구하기
분산 시스템에서 유일성이 보장되는 ID를 만드는 방법은 여러 가지다.
각각의 선택지를 알아보자.
- 다중 마스터 복제
- 데이터베이스의 auto_increment 기능을 활용하는 것
- 다만, ID값을 구할 때 1만큼 증가시키는 게 아니라 k만큼 증가시킨다
- 단점
- 시간의 흐름에 맞추어 커지도록 보장할 수 없다
- -> 하나의 서버에 요청이 몰린 이후에 다른 서버에 요청이 가면 이후 시간인데도 더 작은 값을 가질 수 있을 것 같다
- 서버를 추가하거나 삭제할 때도 잘 동작하도록 만들기 어렵다
출처:https://velog.io/@pjoon357/대규모-시스템-설계-기초-7.-분산-시스템을-위한-유일-ID-생성기-설계
- UUID
- 컴퓨터 시스템에 저장되는 정보를 유일하게 식별하기 위한 128비트짜리 수
- 서버 간 조율 없이 독립적으로 생성 가능
- 단점
- 128비트로 길다
- 시간순 정렬 불가
- 숫자가 아닌 값
- 타겟 서버
- 타겟 서버는 중앙 집중형으로 하나만 사용된다.
- 단점
- SPOF(single point of failure)
- 이를 극복하기 위해 여러 대 서버가 필요하지만, 데이터 동기화와 같은 새로운 문제 발생
출처:https://velog.io/@pjoon357/대규모-시스템-설계-기초-7.-분산-시스템을-위한-유일-ID-생성기-설계
- 트위터 스노플레이트 접근법
- 위의 모든 조건을 만족하는 방법
- 64비트를 분산
- 사인(sign) 비트: 1비트를 할당
- 타임스탬프(timestamp): 41비트를 할당
- 기원 시간(epoch) 이후로 몇 밀리초가 경과했는지 나타내는 값
- 데이터센터 ID: 5비트 할당
- 서버 ID: 5비트 할당
- 일련번호: 12비트를 할당
- 각 서버에서는 ID를 생성할 때마다 이 일련번호를 1만큼 증가
- 이 값은 1밀리 초가 경과할 때마다 0으로 초기화된다.
출처:https://velog.io/@pjoon357/대규모-시스템-설계-기초-7.-분산-시스템을-위한-유일-ID-생성기-설계