본문으로 건너뛰기

스노우플레이크 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를 생성하는 머신끼리 서로 조율할 필요가 없도록 이 형식을 만들었습니다. 여러 서버가 "이 번호가 이미 사용되었는가?"라고 묻지 않고도 동시에 ID를 생성할 수 있습니다. 이 도구는 입력한 값으로 스노플레이크 ID 하나를 만들고, 그 값들이 64비트를 어떻게 채우는지 보여 줍니다.

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

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

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

이 도구는 네 가지 값을 하나의 64비트 ID로 결합하고, 결과를 타임스탬프, 머신, 시퀀스 구간으로 나누어 표시합니다.

타임스탬프는 트위터 에포크라고 하는 고정된 시작점부터 측정합니다. 이 시작점은 2010년 11월 4일, UTC 1:42:54.657이며, 유닉스 에포크로부터 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를 만듭니다.

1delta = timestamp - 1288834974657
2id = (delta << 22) | (dataCenterId << 17) | (machineId << 12) | sequence
3

<<는 왼쪽 비트 시프트입니다. 숫자를 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비트 타임스탬프 블록, 10비트 머신 블록, 12비트 시퀀스 블록으로 나누어 보여 주므로 숫자의 구조를 그대로 확인할 수 있습니다.

스노플레이크 ID의 사용처

트위터는 모든 서버가 확인해야 하는 중앙 카운터 없이도 여러 머신에 걸쳐 고유하고 대체로 시간순인 ID를 얻기 위해 이 형식을 만들었습니다. 다른 플랫폼들도 이 아이디어를 따랐습니다. 예를 들어 디스코드는 ID에 트위터의 스노플레이크 형식을 사용한다고 밝히고 있습니다. 같은 아이디어는 데이터베이스 샤딩, 전자상거래 시스템의 주문 ID, 분산 애플리케이션의 이벤트 로그에도 쓰이며, 여러 머신이 각자 독립적으로 ID를 발급하면서도 대체로 시간순 정렬을 유지해야 하는 모든 곳에 적용됩니다.

스노플레이크 ID의 한계

실제 운영용 스노플레이크 생성기는 보통 자체 시계를 계속 유지합니다. 같은 밀리초에 만든 ID마다 시퀀스 번호를 올리고, 시퀀스가 4,095에 도달하면 다음 밀리초까지 기다립니다. 이 도구는 계산 사이에 상태를 기억하지 않습니다. 입력한 타임스탬프, ID, 시퀀스 번호로 ID 하나를 만들 뿐이므로, 형식을 살펴보는 데는 유용하지만 실제 운영 서비스와는 다릅니다.

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

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

스노플레이크 ID의 역사

트위터는 저장소를 MySQL에서 Cassandra로 옮기면서 스노플레이크를 만들었는데, Cassandra에는 순차적 ID를 위한 기능이 없었습니다. 설계 목표는 64비트 미만이면서 고유하고, 대체로 시간순이며, 바로 정렬할 수 있는 ID였습니다. 초기 버전은 2010년에 공개되었다가 나중에 폐기되어 내부 재작성 버전으로 대체되었습니다. 다른 대형 플랫폼들도 같은 필요, 즉 여러 머신이 동시에 생성하는 고유하고 정렬 가능한 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년 칠월경까지입니다. 41비트 타임스탬프 필드는 고정된 2010년 에포크를 기준으로 최대 약 69.7년을 표현할 수 있으며(트위터의 설명은 이를 69년으로 반올림합니다), 그 이후에는 값이 필드를 넘칩니다.

참고 자료

  1. 트위터. Snowflake README(snowflake-2010 태그), GitHub. 스노플레이크 README — 조율이 필요 없고 대체로 시간순인 64비트 미만 ID. 41비트 시간(69년), 10비트 머신 ID(머신 1,024대), 12비트 시퀀스(머신당 밀리초마다 4,096개). MySQL에서 Cassandra로의 이전이 계기였습니다.
  2. 트위터. IdWorker.scala(snowflake-2010 태그), GitHub. 스노플레이크 IdWorker.scala — twepoch = 1288834974657. 워커 비트 5개, 데이터 센터 비트 5개, 시퀀스 비트 12개. 시프트는 12, 17, 22입니다.
  3. 디스코드. API Reference: Snowflakes. 디스코드 API 레퍼런스 — 디스코드는 ID에 트위터의 스노플레이크 형식을 사용합니다.
  4. 트위터. Snowflake README(master), GitHub. 스노플레이크 폐기 공지 — 초기 버전은 2010년에 공개되었으며 폐기되었습니다.