본문으로 건너뛰기

스노우플레이크 ID 생성기 - 고유한 분산 ID 생성

스노우플레이크 ID 생성기는 타임스탬프, 머신 ID, 데이터센터 ID, 시퀀스 번호를 조합해 고유한 64비트 식별자를 만드는 무료 도구다. 기존 ID를 입력하면 각 구성 요소를 비트 단위로 분해해 보여주므로 분산 시스템 설계와 디버깅에 쓰인다.

스노우플레이크 ID 생성기

선택사항: 밀리초 단위의 Unix 타임스탬프 (기본값은 현재 시간)

머신 ID (0-31)

데이터 센터 ID (0-31)

시퀀스 번호 (0-4095)

스노우플레이크 ID
2094810864283549696
00111010001001001000011011000011101110101
00000
00000
000000000000
타임스탬프 (41 비트)
데이터 센터 ID (5 비트)
머신 ID (5 비트)
시퀀스 번호 (12 비트)
로딩 계산기...
📚

문서화

스노플레이크 ID 생성기란?

스노플레이크 ID 생성기는 타임스탬프, 머신 식별자, 시퀀스 번호로 고유한 64비트 숫자를 만듭니다. 트위터는 여러 서버가 서로 “이 번호가 이미 사용되었나?”라고 확인하지 않고도 동시에 각 트윗에 식별자를 생성할 수 있도록 2010년에 이 형식을 만들었습니다. 이 도구는 입력한 값으로 스노플레이크 ID 하나를 만들고, 해당 값들이 64비트를 어떻게 채우는지 보여 줍니다.

이 스노플레이크 ID 생성기의 작동 방식

생성기는 네 가지 입력을 받습니다.

  • 타임스탬프: 밀리초 단위의 유닉스 타임스탬프입니다. 비워 두면 현재 시간을 사용합니다.
  • 머신 ID: 0부터 31까지의 정수입니다(5비트). 트위터의 원래 명칭은 “워커 ID”입니다.
  • 데이터 센터 ID: 0부터 31까지의 정수입니다(5비트).
  • 시퀀스 번호: 0부터 4095까지의 정수입니다(12비트). 같은 밀리초에 생성된 ID를 구분하는 데 사용합니다.

이 도구는 네 값을 하나의 64비트 ID로 결합합니다. 그런 다음 결과를 타임스탬프, 데이터 센터, 머신, 시퀀스 구간으로 나눈 이진수로 보여 줍니다.

타임스탬프는 트위터 에포크라고 하는 고정된 시작점 2010년 11월 4일, 1:42:54.657 UTC를 기준으로 측정됩니다. 이는 유닉스 에포크 후 1,288,834,974,657밀리초에 해당합니다. 이 생성기에서는 시작점을 변경할 수 없습니다. 생성되는 모든 ID는 이 하나의 고정된 날짜를 기준으로 측정됩니다.

스노플레이크 ID 구조

스노플레이크 ID는 네 부분으로 나뉘는 64비트 정수이며, 최상위 비트부터 읽습니다.

비트필드치역
1부호 비트항상 0
41타임스탬프트위터 에포크 이후의 밀리초
5데이터 센터 ID0–31
5머신(워커) ID0–31
12시퀀스 번호0–4095

선행 비트는 항상 0이므로 스노플레이크 ID는 항상 양수입니다. 41비트 타임스탬프 필드와 12비트 시퀀스 필드는 스노플레이크 ID를 정렬에 유용하게 만드는 두 부분입니다. 나중에 만들어진 ID일수록 타임스탬프 구간이 더 크므로 이전 ID 뒤에 정렬됩니다.

스노플레이크 ID 수식

생성기는 다음 수식으로 ID를 만듭니다.

d=t−1288834974657d = t - 1288834974657

I=(d<<22)∣(c<<17)∣(m<<12)∣sI = (d << 22) \mathbin{|} (c << 17) \mathbin{|} (m << 12) \mathbin{|} s

여기서 d는 델타 값이고, t는 밀리초 단위로 입력된 타임스탬프, I는 완료된 ID, c는 데이터 센터 ID, m은 머신 ID, s는 시퀀스 번호를 나타낸다.

<<는 왼쪽 비트 시프트입니다. 숫자를 22비트 왼쪽으로 시프트하는 것은 해당 숫자에 2²², 즉 4,194,304를 곱하는 것과 같습니다. 시프트 크기(22, 17, 12)는 필드 너비에서 직접 정해집니다. 시퀀스 필드의 너비가 12비트이므로 머신 ID는 12비트 위에 놓입니다. 머신 필드의 너비가 5비트이므로 데이터 센터 ID는 17비트 위에 놓입니다(12 + 5). 나머지도 같은 방식입니다.

스노플레이크 ID 계산 방법: 계산 예제

누군가 다음과 같이 입력한다고 가정해 보겠습니다.

  • 타임스탬프: 1,288,834,975,657 (트위터 에포크 후 정확히 1,000밀리초)
  • 데이터 센터 ID: 1
  • 머신 ID: 1
  • 시퀀스 번호: 0

단계 1 — 델타를 구합니다. 타임스탬프에서 에포크를 뺍니다. 1,288,834,975,657 − 1,288,834,974,657 = 1,000입니다.

단계 2 — 각 필드를 제 위치로 시프트합니다.

  • 타임스탬프: 1,000 << 22 = 4,194,304,000
  • 데이터 센터 ID: 1 << 17 = 131,072
  • 머신 ID: 1 << 12 = 4,096
  • 시퀀스: 0

단계 3 — 비트 OR로 결합합니다. 시프트된 필드가 서로 겹치지 않으므로 더한 결과는 비트 OR를 적용한 결과와 같습니다.

4,194,304,000 + 131,072 + 4,096 + 0 = 4,194,439,168

이것이 이 입력에 대한 스노플레이크 ID입니다. 도구의 결과 화면은 동일한 64비트 이진 문자열을 다시 41비트 타임스탬프 블록, 5비트 데이터 센터 블록, 5비트 머신 블록, 12비트 시퀀스 블록으로 나누어 숫자의 구조가 보이도록 합니다.

스노플레이크 ID의 사용처

트위터는 모든 서버가 확인해야 하는 중앙 카운터 없이 수천 대의 데이터베이스 머신에서 트윗에 고유하고 대략적으로 시간 순서가 맞는 ID를 부여하기 위해 이 형식을 만들었습니다. 이후 디스코드와 인스타그램도 메시지와 게시물에 유사한 64비트 ID 설계를 채택했습니다. 같은 개념은 데이터베이스 샤딩, 전자 상거래 시스템의 주문 ID, 분산 애플리케이션의 이벤트 로그에도 사용됩니다. 여러 머신이 독립적으로 ID를 발급하면서도 대략적인 시간순 정렬이 필요한 환경에 적합합니다.

스노플레이크 ID의 한계

실제 운영 환경의 스노플레이크 생성기는 일반적으로 자체 실행 시계를 유지합니다. 같은 밀리초에 생성되는 각 ID마다 시퀀스 번호를 늘리고, 시퀀스가 4,095에 도달하면 다음 밀리초까지 기다립니다. 이 도구는 계산 사이에 상태를 기억하지 않습니다. 입력된 값으로 ID 하나를 만들기 때문에 형식 탐색에는 유용하지만 실제 운영 서비스와는 다릅니다.

이 설계에는 어떤 서비스가 구현하더라도 고정된 한계가 있습니다.

  • 고정 에포크: 이 생성기는 2010년 11월 4일(트위터 에포크) 이후의 타임스탬프만 허용합니다. 그 이전 날짜는 인코딩할 수 없습니다.
  • 타임스탬프 상한: 41비트 타임스탬프 필드는 2080년 7월 무렵에 소진됩니다. 그 이후에는 에포크와의 차이가 41비트에 들어맞지 않습니다.
  • 시퀀스 한계: 같은 밀리초에 하나의 머신이 발급할 수 있는 서로 다른 ID는 4,096개(0–4095)뿐이며, 그 이후에는 값이 반복됩니다.
  • 머신 공간: 머신 ID와 데이터 센터 ID에 각각 5비트를 사용하므로, 하나의 배포 환경에서 충돌 없이 할당할 수 있는 서로 다른 머신 식별자는 1,024개입니다(32 × 32).
  • 전역이 아닌 로컬 정렬: ID는 동기화된 시계를 사용하는 머신에서 생성된 경우에만 서로 올바르게 정렬됩니다. 머신 간 시계 오차로 엄격한 시간 순서가 깨질 수 있습니다.

스노플레이크 ID의 역사

트위터는 많은 독립적인 데이터베이스 서버에서 확장하기 어려운 단순 자동 증가형 데이터베이스 ID를 대체하기 위해 2010년에 스노플레이크 ID 형식을 발표했습니다. 실제 눈송이처럼 생성된 ID 중 어느 두 개도 같지 않다는 생각에서 이름이 유래했습니다. 이후 이 설계는 오픈 소스로 공개되었고, 여러 머신이 동시에 고유하고 정렬 가능한 ID를 생성해야 했던 다른 대형 플랫폼들이 수정된 형태로 이를 복제했습니다.

자주 묻는 질문

스노플레이크 ID란 무엇인가? 스노플레이크 ID는 타임스탬프, 머신 식별자, 시퀀스 번호로 구성된 64비트 숫자입니다. 여러 머신이 서로 조정하지 않고도 고유한 ID를 생성할 수 있도록 설계되었습니다.

스노플레이크 ID 수식은 무엇인가? id = ((timestamp − epoch) << 22) | (dataCenterId << 17) | (machineId << 12) | sequence이며, 에포크는 고정된 시작 날짜이고 <<는 왼쪽 비트 시프트입니다.

이 생성기에서 에포크를 변경할 수 있나요? 아니요. 이 도구는 항상 고정된 트위터 에포크인 2010년 11월 4일을 기준으로 타임스탬프를 측정합니다. 다른 시작 날짜를 설정하는 필드는 없습니다.

이 도구는 기존 스노플레이크 ID를 디코딩하나요? 아니요. 입력한 타임스탬프, 머신 ID, 데이터 센터 ID, 시퀀스 번호로 새 ID만 만든 다음 해당 ID의 비트 구성을 보여 줍니다.

머신 한 대가 밀리초당 생성할 수 있는 스노플레이크 ID는 몇 개인가요? 최대 4,096개입니다. 시퀀스 필드의 너비가 12비트이고 값의 범위는 0부터 4,095까지이기 때문입니다.

이 생성기는 몇 년까지 유효한 타임스탬프를 생성할 수 있나요? 2080년 7월 무렵까지입니다. 41비트 타임스탬프 필드는 고정된 2010 에포크를 기준으로 약 69.7년까지 저장할 수 있으며, 그 이후에는 값이 필드를 초과합니다.

참고 문헌

  1. “스노플레이크 발표.” 트위터 엔지니어링 블로그, 2010.
  2. "Snowflake ID." 위키백과, https://en.wikipedia.org/wiki/Snowflake_ID