# 분산 시스템을 위한 유일 ID 생성기

### 1. 다중 마스터 복제

- 새로운 레코드를 만들 때마다 k(서버 수)만큼 증가한 값을 ID로 쓴다.

- 서로 영향을 끼치지 않고 ID를 만들기 때문에 성능이 보장된다.

**단점**

- 여러 데이터 센터에 걸쳐 규모를 늘리기 어렵다.

- 서버의 추가 및 삭제가 어렵다.

- ID가 시간 흐름에 맞추어 커지도록 보장할 수 없다.

### 2. UUID (Universally Unique Identifier)

- 충돌 가능성이 지극히 낮은 128비트 문자열

- 서버의 조율 없이 각자 만들 수 있다.

**장점**

- 단순하고 동기화 이슈가 없다.

- 확장에 용이하다.

**단점**

- 128비트로 비교적 길다.

- 시간과 연관성이 없다.

- 숫자만 있지 않고 문자도 포함된다.

### 3. 티켓 서버

- ID를 만드는 서버를 따로 두고 이 서버에서 DB에게 ID값을 준다.

**장점**

- 유일성이 보장된다.

**단점**

- SPOF 문제 발생

- 티켓 서버를 여러 대 두면 동기화 문제 발생

### 4. 트위터 스노우플레이크

패킷 구성하듯 `64`비트를 여러 구역으로 쪼개서 값을 부여한다.

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/134356_3uQACwWGRzd1F0ohiI?q=80&s=1280x180&t=outside&f=webp)

- `01` sign bit : 일단 예약 비트이다.

- `41` timestamp : epoch(아무 시간이나 정함) 이후 millisecond

- `05` datacenter id : 총 32개의 데이터센터를 표시

- `05` server id : 데이터센터당 32개의 서버를 표시

- `12` serial number : 각 서버에서 이 숫자를 1씩 증가

**특징**

- 타임스탬프가 제일 앞에 있기 때문에 시간에 따른 정렬이 가능하다.

- 타임스탬프는 2^{41}-1 밀리초, 즉 69년만 측정 가능하다.

- 일렬번호가 의미하는 것 : 한 서버가 1ms 내에 최대 2^12개의 ID를 만들 수 있다.

    - 동시성이 적은 어플리케이션의 경우 일렬번호를 줄일 수 있다.

    - 또 데이터센터와 서버 수도 적절히 예측해 조절한다.

For the site tree, see the [root Markdown](https://slashpage.com/kaonmir.md).
