dev.Log

멀티마스터에서 키충돌 피하는 법 본문

BACKEND.*/Server

멀티마스터에서 키충돌 피하는 법

초코푸딩 2024. 12. 28. 21:57

미리 알았더라면 좋았을 것 같은.... 

 

<조건>

1. 아이디는 유일해야 한다

2. 아이디는 숫자로만 구성되어야 한다

3. 아이디는 발급 날짜에 따라 정렬가능해야한다.

 

multi-master 구성 시 이런 조건을 만족하는 ID 생성기를 구현하고자 할 때 

트위터 스노플레이크 접근법이 있다.

 

1비트 - 41비트 - 5비트 - 5비트 - 12비트

사인비트 - 타임스탬프 - 데이터센터ID - 서버ID - 일련번호

1. 사인(sign)비트 : 1비트를 할당. 지금으로서는 쓰임새가 없지만 나중을 위해 유보. 음수와 양수를 구별하는데 사용

2. 타임스탬프 : 기원시각 (epoch)이후로 몇 밀리초가 경과했는지를 나타내는 값

3. 데이터센터ID : 2의5승 = 32개 데이터 센터 지원 가능 

4. 서버ID : 데이터 센터당 32개 서버 사용 가능

5. 일련번호 : 12비트 : 각서버에서 ID생성할 때마다 이 일련번호를 1만큼 증가 시킴 

 

Q. 타임스탬프와 서버 ID만으로 충분하지 않을까?

 

A.

밀리초단위에서 충돌 문제 -> 일련번호가 필요

멀티마스터일때 여러 데이터센터에서 동시에 ID를 생성하는 경우 서로 다른 데이터 센터에서 생성된 ID가 충돌안하게 -> 데이터센터 ID필요

스케일아웃을위한 유연성 -> 데이터센터ID + 서버ID 

예외처리 (시계가 역방향으로 조정되거나 클러스터가 리셋되는 경우 타임스탬프만으로는 충돌할 수 있음) -> 데이터센터ID 서버ID 일련번호가 추가적인 유일성을 확보함

 

ID 생성 서버들이 전부 같은 시계를 사용하지 않을 수 있으므로 NTP(Network Time Protocol)을 참고.

 

정렬할때는

1. 스노우 플레이크 ID기반 정렬

    - 서버간 시간 동기화가 불완전한 경우 순서가 어긋날 수 있음

2. 타임스탬프를 기준으로 먼저 정렬한 다음에 동일한 타임스탬프에 대해서는 스노우 플레이크 ID를 보조키로 사용 (복합인덱스)

   - 두가지 데이터를 함께 관리해야하므로 복잡도가 증가 

3.  클라이언트 타임스탬프도 함께 사용!

   - 서버타임스탬프를 1차 기준으로 쓰고 그 다음은 스노우플레이크ID를 사용하고 그 다음은 보조적으로 클라이언트 타임스탬프를 참고...

 

 

 

 

 

'BACKEND.* > Server' 카테고리의 다른 글

두 가지 솔루션을 도커로 패키징하기  (0) 2025.02.15
epoll 보다 좋은 io_uring  (0) 2025.02.01
backpressure vs RingBuffer  (0) 2024.12.26
JIT 컴파일러  (0) 2024.12.22
하이퍼스레딩  (0) 2024.12.22
Comments