유일성의 나머지 전제입니다. 같은 시각에 같은 노드 번호를 쓰는 노드가 둘이면 순번이 겹치는 순간 중복이 생깁니다.
번호를 주는 세 방법
| 방법 | 성질 |
|---|---|
| 설정 파일에 적어 둔다 | 가장 단순하다. 사람이 실수하면 겹친다 |
| 조정자에서 임대한다 | 겹침을 막을 수 있다. 부품이 하나 늘어난다 |
| 호스트 정보로 계산한다 | 자동이다. 값이 겹칠 수 있고 재현이 어렵다 |
발급기 64대 를 사람이 관리하는 규모라면 설정 파일도 충분합니다. 다만 자동으로 늘고 줄어드는 환경에서는 사람이 따라갈 수 없습니다.
임대의 함정: 성급한 재사용
임대 방식에서 노드가 응답하지 않으면 그 번호를 회수해 다른 노드에 줍니다. 그런데 응답이 없는 것과 죽은 것은 다릅니다. 잠깐 끊겼던 노드가 살아 있으면 같은 번호를 쓰는 노드가 둘이 됩니다.
그래서 번호를 다시 주기 전에 시간을 둡니다.
그 번호로 발급에 쓴 마지막 시각을 지나야 재사용할 수 있다
그 시각 이후로는 겹칠 수 없다
시간이 겹침을 막는 장치입니다. 시각 칸이 이미 ID에 있으므로, 마지막 사용 시각을 지나면 옛 노드가 살아 있어도 같은 값을 만들 수 없습니다.
번호가 부족해지는 환경
컨테이너 환경에서는 노드가 하루에 수백 번 생기고 사라집니다. 번호 칸이 10비트면 1,024개인데, 반납하지 않으면 하루 만에 소진됩니다.
| 대응 | 내용 |
|---|---|
| 정상 종료 때 반납한다 | 대부분의 경우를 덮는다 |
| 임대에 만료를 둔다 | 비정상 종료를 덮는다 |
| 만료 뒤 유예를 둔다 | 성급한 재사용을 막는다 |
세 장치가 함께 있어야 합니다. 반납만 있으면 갑자기 죽은 노드의 번호가 영원히 묶이고, 만료만 있으면 성급한 재사용이 생깁니다.
번호를 못 받으면 발급하지 않는다
시작할 때 번호를 받지 못하면 어떻게 할지 정해야 합니다. 임의의 번호를 골라 시작하면 겹칠 수 있습니다.
받지 못하면 발급을 시작하지 않는 것이 맞습니다. 시계 문제에서와 같은 원칙입니다. 시작 실패는 눈에 보이고 회복되지만, 중복은 조용하고 회복되지 않습니다.
사후 검증을 함께 둔다
구조로 막았어도 확인 장치를 둡니다. 발급한 ID의 중복 여부는 저장소의 유일 제약이 잡아 줍니다.
그 제약이 걸리는 것은 심각한 신호입니다. 시각 되돌림이나 번호 겹침 중 하나가 일어났다는 뜻이므로, 오류 하나로 보지 않고 즉시 원인을 찾아야 합니다.