[강의 정리] Distributed System 3.2: Clock synchronisation and monotonic clocks
# 강의 영상
정리
시간을 일정하게 맞춘다는 것은 쉬운듯 하면서도 어려운 일입니다. 우리는 살면서 하나의 시간 단위를 사용한다고 생각하지만, 사실은 시간을 측정하는 방법은 다양하며 평소에 접하는 시간은 그 중 특정 방법으로 측정된 시간일 뿐입니다. 시간 이라는 것은 언제나 중요한 요소 이지만 분산 시스템에서는 보다 더 중요하게 다가옵니다. 1초의 차이로 시스템이 합의되지 못할 수 있기 때문입니다. 이번 장에서는 시간 동기화 문제에 대해서 살펴보고 정리해 보도록 하겠습니다.
개인 컴퓨터나 휴대폰에서 볼 수 있는 시간은 어떻게 맞춰지고 있을까요? 내부에서 실제로 시간을 측정할 수 있는 도구가 들어가 있다면 굉장히 많은 부피를 차지할 것이고 가격 또한 비싸질 것입니다. 그리고 각각의 시간들의 오차가 생길 때 이 오차는 점진적으로 벌어지게 되고 모든 사람들이 한 시간을 바라보고 있다고 확신할 수 없기 때문에 우리는 시간을 맞출 수 있는 프로토콜인 Network Time Protocol (NTP) 를 이용하게 됩니다. 그리고, 현재 대부분의 운영 체제에 이 NTP 클라이언트가 포함되어 있습니다.
Network Time Protocol (NTP)
네트워크 상에서 시간을 동기화 한다는 것은 꽤나 어려운 일입니다. 이전에 얘기 했듯이 예기치 못한 문제 등으로 서로 latency 가 다르게 나타날 수도 있기 때문입니다. 이러한 문제를 최소화 하기 위해, NTP 는 이상치를 제거 하고 여러 샘플 측정값을 적용하는 방식을 사용합니다.
아래 그림은 NTP 가 클라이언트와 서버 사이의 시간 차이를 측정하는 방식을 보여줍니다.
우선 아래 그림은 클라이언트가 서버로 요청을 주고 응답을 받는 과정 사이에서 시간 차이를 추정하게 되는데, 첫번째 단계로 요청이 주고 받아진 통신 자체의 시간을 구하는 것입니다. 아래 표에서 "network delay" 를 나타내고, 그 값은 client 에서의 총 실행 시간에서 server 가 수행한 시간을 뺀 시간의 절반이 편도 평균 latency 라고 볼 수 있습니다. 즉, t3 가 끝나고 도착을 했을때는 예상되는 시간은 t3 에 편도 latency 인 값을 더한 시간 (클라이언트가 받은 t4 시간) 을 추측해 볼 수 있습니다.
그러므로 이 예측한 시간인 t3 + δ/2 와 t4 의 차이를 계산하면 클라이언트와 서버의 시간 차이를 예상 해 볼 수 있습니다. 여기서 보았듯이 두 네트워크 latency 총 시간의 절반으로 나눈 값을 하나의 편도 latency 라고 가정이 필요합니다. 하지만 특정 경우에서는 요청 시간과 응답 시간이 네트워크 대기 시간 등의 문제로 일정하게 나타나지 않습니다.
질문. What is the maximum possible error in the NTP client’s estimate of skew with regard to one particular server, assuming that both nodes correctly follow the protocol?
이제 NTP 는 클라이언트와 서버간의 시간 차이를 측정했으므로, 시간을 일정하게 맞춰주는 작업이 필요해집니다. 이 때 클라이언트는 차이나는 정도에 따라 시간을 조금 느리게 혹은 빠르게 조정하며 맞춰가며 이 과정을 "slewing" 이라고 합니다.
하지만 때때로 시간 차이가 너무 커서, "slewing" 이 너무 길어지는 경우가 있습니다. 이 때는 아예 클라이언트의 시간을 서버 timestamp 기준으로 바꿔 버리는 경우가 있는데 이 과정을 "stepping" 이라고 합니다. 이 클라이언트를 사용하는 사용자는 갑자기 시간이 올라가 버리는 모습을 보게 되는 것이죠. 그런데 여기서 시간 차이가 15분 이상 나는 경우 (default 기준 값)에는 아예 클라이언트에 문제가 있다고 판단해 조정을 그만 두고 사용자가 확인 할 수 있도록 하게 합니다. 그러므로 항상 우리의 시스템이 제대로 동기화 되고 있는지 살펴볼 필요가 있습니다. 단순시 NTP 를 사용하고 있다고 해서, 제대로 동기화 되고 있다고 보장 할 수 없으니 말이죠..
대부분의 운영 체제 혹은 프로그래밍 언어에서는 두가지 종류의 clock이 있습니다.
첫번째, Time-of-day clock 과 두번째, Monotic clock 이 있는데 큰 차이점은 Time-of-day 는 NTP 의 영향을 받아 시간이 천천히 혹으 빠르게 (일시적으로) 갈 수 있다는 점이 있지만 Monotic 은 특정 시간 기준으로 부터 지난 시간을 나타내기 때문에 NTP 의 영향을 받지 않는다.