이번 장에서는 분산 시스템에서 사용될 유일 ID 생성기를 설계해 볼 것이다.
참고) 관계형 DB에서
AUTO_INCREMENT
를 사용할 수 있지만, 이 방식은 분산환경에 적합하지 않다.
- DB 서버 한 대로는
AUTO_INCREMENT
방식의 처리량을 감당하기 어렵다.
- 여러 DB 서버를 쓰는 경우에는 지연시간을 낮추기가 매우 어렵다.
설계할 유일 ID 생성기에 대한 요구사항은 다음과 같다.
분산 시스템에서 유일성이 보장되는 ID를 만드는 방법은 여러가지가 있다. 아래와 같은 방식에 대해 알아볼 것이다.
다중 마스터 복제 방식은 데이터베이스의 AUTO_INCREMENT
기능을 활용하는 것이다.
AUTO_INCREMENT
처럼 ID값을 순차적으로 늘리지만, DB 서버의 수 만큼 증가시킨다.단점
UUID는 유일성이 보장되는 128비트 크기의 ID이다. 여러 시스템에서 동시에 생성된 UUID가 중복될 가능성은 없다고 봐도 무방하다.
123e4567-e89b-12d3-a456-426614174000
UUID는 서버 간 조율 없이 독립적으로 생성될 수 있으며, 비교적 간단히 생성할 수 있다.
장점
단점
UUID는 시간 순으로 정렬 할 수 없다?
UUID도 버전이 여러가지가 있는데, 생성 시 사용되는 값에 따라서 UUID도 조금씩 달라진다.
- V1: Timestamp와 MAC 주소를 기반으로 UUID를 생성
- V2: Timestamp와 MAC 주소, DCE 보안 버전을 기반으로 UUID를 생성
- V3: Namespace 기반으로 MD5 해싱 알고리즘을 활용해 생성
- V4: 무작위로 UUID를 생성
- V5: Namespace 기반으로 SHA-1 해싱 알고리즘을 활용해 생성
UUID V4의 경우 unique한 값이 생성될지라도 DB입장에서는 인덱싱 비용이 많이 든다.
이런 문제에 대해 MySQL에서 Sequencial UUID를 생성하는 방식은 다음과 같다.
DELIMITER // CREATE DEFINER=`root`@`localhost` FUNCTION `ordered_uuid`(uuid BINARY(36)) RETURNS binary(16) DETERMINISTIC RETURN UNHEX(CONCAT(SUBSTR(uuid, 15, 4),SUBSTR(uuid, 10, 4),SUBSTR(uuid, 1, 8),SUBSTR(uuid, 20, 4),SUBSTR(uuid, 25))); // DELIMITER ;
결과
참고)
티켓 서버는 유일성이 보장되는 ID를 만들 때 사용된다. 아이디어의 핵심은, AUTO_INCREMENT
기능을 갖춘 티켓 서버를 중앙 집중형으로 하나만 사용하는 것이다.
장점
단점
트위터는 스노플레이크(snowflake)라고 부르는 독창적인 ID 생성 기법을 사용한다. 이 방식은 분산 환경에서 고유하고 순차적인 ID를 생성할 수 있도록 설계되었다. 구조는 다음과 같다.
1bit
: 음수와 양수 구별 등의 용도로 사용될 수 있는 값41bit
: 기원 시각 이후 몇 밀리초가 경과했는지 나타내는 값5bit
: 32개의 데이터센터 표현 가능5bit
: 32개의 서버 표현 가능12bit
: 각 서버에서 ID를 생성할 때마다 일련번호를 1만큼 증가시키고, 이 값은 1 밀리초가 경과할 때마다 0으로 초기화일반적으로 데이터센터 ID와 서버 ID는 시스템 시작시에 결정되며, 일반적으론 시스템 운영중에 바뀌지 않는다.
반면 타임스탬프나 일련번호는 시스템 운영 중 동적으로 생성된다.
다양한 기술적 선택지를 살펴본 가운데 트위터 스노플레이크 접근법을 사용하여 상세 설계를 진행해보자. 동적으로 변경될 수 있는 부분인 타임스탬프와 일련번호에 대해 구체적으로 설계해볼 것이다.
타임스탬프는 앞서 살펴본 ID 구조에서 가장 중요한 41비트를 차지하고 있다. 타임스탬프는 시간이 흐름에 따라 점점 큰 값을 갖게 되므로 정렬 가능하다.
아래 그림은 41비트의 타임스탬프를 UTC 시간으로 변환하는 과정이다.
2^41 - 1
밀리초 이며, 이는 약 69년에 해당한다.일련번호는 12비트이므로 4096(=2^12
)개의 값을 가질 수 있다. 1밀리초 안에 둘 이상의 ID를 만들어낸 경우에만 0보다 큰 값을 갖게 된다.
다중 마스터 복제, UUID, 티켓 서버, 트위터 스노플레이크의 네 가지 방식을 살펴보았다. 선택한 방식은 스노플레이크인데, 모든 요구사항을 만족하면서도 분산 환경에서 규모 확장이 가능했기 때문이었다.
시계 동기화(clock synchronization)
NTP(Network TIme Protocol)
보통서버는 ntp서버 라는 시간의 기준이되는 서버가 존재한다. 일반서버들은 대부분 ntp서버와 통신을하여 시간을 맞추게 된다. 널리 사용되는 공용 ntp 서버는 다음과 같다.
time.bora.net (203.248.240.140)
time.nuri.net (211.115.194.21)
time2.kriss.re.kr (210.98.16.101)
NTP는 Stratum이라는 계층 구조를 가지는데 분산된 장비들에 대해서 정확한 기준 시간 제공이 가능해진다.
각 절(section)의 길이 최적화
고가용성(high availability)