분산 시스템에서의 시간 동기화
다음과 같은 웹 사이트에 익숙하다면 facebook.com 또는 구글.컴,어쩌면 한 번 이상 당신은 이러한 웹 사이트는 초당 수백만 또는 수천만 요청을 처리 할 수있는 방법을 궁금해했다. 이 엄청난 양의 요청을 견딜 수있는 단일 상용 서버가 최종 사용자에게 적시에 각 요청을 제공 할 수 있습니까?
이 문제에 깊이 잠수,우리는 분산 시스템의 개념에 도달,하나의 일관된 시스템으로 사용자에게 나타나는 독립적 인 컴퓨터(또는 노드)의 모음. 사용자에 대한 일관성에 대한 이러한 개념은 요청의 일괄 처리를 한 번에 처리하기 위해 병렬로 실행되는 여러 프로세스의 형태를 취하는 단일 거대한 시스템을 다루고 있다고 믿기 때문에 분명합니다. 그러나 시스템 인프라를 이해하는 사람들에게는 그렇게 쉬운 일이 아닙니다.
여러 시간대와 대륙에 걸쳐있는 수천 대의 독립 기계가 동시에 실행되는 경우,이러한 기계가 서로 효율적으로 협력 할 수 있도록(하나로 나타날 수 있도록)몇 가지 유형의 동기화 또는 조정이 제공되어야합니다. 이 블로그에서,우리는 시간의 동기화를 논의하고 주문 및 이벤트의 인과 관계에 기계 간의 일관성을 달성하는 방법.
이 블로그의 내용은 다음과 같이 구성됩니다:
- 클럭 동기화
- 논리 클럭
- 다음 단계는 무엇입니까?
물리적 클럭
중앙 집중식 시스템에서 시간은 모호하지 않습니다. 거의 모든 컴퓨터에는 시간을 추적 할 수있는”실시간 시계”가 있으며 일반적으로 정밀하게 가공 된 석영 크리스탈과 동기화됩니다. 이 석영의 잘 정의 된 주파수 진동을 기반으로 컴퓨터의 운영 체제는 내부 시간을 정확하게 모니터링 할 수 있습니다. 컴퓨터가 꺼지거나 충전이 중단되는 경우에도 쿼츠는 마더보드에 통합된 작은 발전소인 씨모스 배터리로 인해 계속 작동합니다. 컴퓨터가 네트워크(인터넷)에 연결되면 운영체제는 타이머 서버에 접속합니다.이 서버는 세계 협정시 수신기 또는 정확한 클럭이 장착되어 네트워크 시간 프로토콜을 사용하여 로컬 타이머를 정확하게 재설정합니다.
이 크리스탈 쿼츠의 주파수는 합리적으로 안정적이지만 다른 컴퓨터의 모든 크리스탈이 정확히 동일한 주파수에서 작동한다는 것을 보장하는 것은 불가능합니다. 모든 크리스탈이 약간 다른 속도로 실행되어 시계가 점차 동기화되지 않고 판독 할 때 다른 값을 제공하는 시스템을 상상해보십시오. 이 때문에 발생 하는 시간 값의 차이 시계 기울이기 라고 합니다.
이 상황에서,여러 개의 공간적으로 분리 된 기계를 갖는 것이 지저분 해졌다. 여러 개의 내부 물리적 클럭을 사용하는 것이 바람직한 경우 실제 클럭과 어떻게 동기화합니까? 우리는 어떻게 그들을 서로 동기화합니까?
네트워크 시간 프로토콜
컴퓨터 간의 쌍별 동기화에 대한 일반적인 접근 방식은 클라이언트-서버 모델을 사용하는 것입니다. 다음과 같은 예를 생각해 봅시다 2 기계 ㅏ 과 비:
먼저 값을 가진 타임 스탬프가 지정된 요청을 보냅니다. 비,메시지가 도착하면 수신 시간을 기록합니다.티 회선 자신의 로컬 시계와 응답에서 티 회선으로 타임 스탬프가있는 메시지 티 회선,이전에 기록 된 값을 편승 티 회선. 마지막으로,ㅏ,에서 응답을 받으면 비,도착 시간을 기록합니다. 메시지 전달의 시간 지연을 설명하기 위해,우리는 계산한다. 이제 추정 오프셋 상대 비 이다:
이 응용 프로그램은 시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계,시계 그러나 더 정확한 것으로 알려진 경우 시계를 조정하는 것은 현명하지 않습니다. 이 문제를 해결하기 위해 서버를 계층,즉 순위 서버로 분할하여 순위가 작은 덜 정확한 서버의 시계가 더 높은 순위의 더 정확한 서버와 동기화됩니다.
버클리 알고리즘
정확한 시간 동기화를 위해 시간 서버에 주기적으로 연락하는 클라이언트와 달리,구셀라와 자티는 1989 년 버클리 유닉스 논문에서 시간 서버(데몬)가 모든 기계를 주기적으로 폴링하여 시간이 무엇인지 묻는 클라이언트-서버 모델을 제안했다. 응답에 따라 메시지의 왕복 시간을 계산하고,시간 값의 이상 값을 알지 못하는 현재 시간을 평균하며,”다른 모든 기계에게 시계를 새로운 시간으로 발전 시키거나 특정 감소가 달성 될 때까지 시계를 늦추도록 지시합니다.”
논리 클럭
한 걸음 뒤로 물러나서 동기화 된 타임 스탬프에 대한 기반을 다시 생각해 봅시다. 이전 섹션에서,우리는 모든 참여 기계의 시계에 구체적인 값을 할당,이제 그들은 이벤트가 시스템의 실행 중에 발생하는 글로벌 타임 라인에 동의 할 수 있습니다. 그러나 타임 라인 전체에서 정말로 중요한 것은 관련 이벤트가 발생하는 순서입니다. 는 경우,예를 들어,어떻게든 우리는 알아야 할 이벤트가 발생하기 전에 이벤트 B,그것이 문제가되지 않은 경우 Tₐ=2,Tᵦ=6Tₐ=4,Tᵦ=10,한 Tₐ<Tᵦ. 이 동기화의 레슬리 램포트의 정의에 의해 영향을 논리적 시계의 영역에 우리의 관심을 이동”발생-전에”관계.
램포트의 논리 클럭
그의 경이로운 1978 년 종이 시간,시계 및 분산 시스템에서의 이벤트 순서에서 램포트는”일어나기 전에”관계를 정의했습니다.:
1. 만약 ㅏ 과 비 같은 프로세스의 이벤트이고 ㅏ 앞에 온다 비,다음 다음 비.
2. 한 프로세스에서 메시지를 보내는 경우 비 다른 프로세스에서 동일한 메시지를 수신하는 경우 다음 비.
3. 는 경우는 a→b b→c,다음→c.
는 경우 이벤트를 x,y 에서 발생하는 다른 프로세스하지 않고 메시지를 교환하지 않 x→y 도 y→x true,x,y 은 동시에 이루어 집니다. 주어진 씨 함수 시간 값을 할당하는 씨(ㅏ)모든 프로세스가 동의하는 이벤트에 대해 ㅏ 과 비 동일한 프로세스 내의 이벤트이고 ㅏ 이전에 발생합니다 비,씨(ㅏ)<씨(비)*. 마찬가지로,한 프로세스에 의한 메시지 전송이고 비 다른 프로세스에 의한 메시지 수신 인 경우,씨(ㅏ)<씨(비)**.
이제 램포트가 이벤트에 시간을 할당하기 위해 제안한 알고리즘을 살펴 보겠습니다. 3 개의 프로세스 클러스터를 사용하여 다음 예제를 고려하십시오.:
이 세 가지 프로세스의 클럭은 자체 타이밍으로 작동하며 처음에는 동기화되지 않습니다. 각 시계는 시간 단위마다 특정 값으로 증가하는 간단한 소프트웨어 카운터로 구현할 수 있습니다. 그러나 클럭이 증가하는 값은 프로세스마다 다릅니다:1 은 ㅏ,5 는 비,2 는 씨.
시간 1 에서 메시지를 보냅니다. 메시지가 전송 된 이후 시간 1 로 타임 스탬프되었습니다.,프로세스 값 10 비 확실히 가능합니다(우리는 9 틱이 걸렸다는 것을 추론 할 수 있습니다.
이제 메시지를 고려하십시오. 그것은 15 시에 출발하고 8 시에 도착합니다. 이 시계 값은 시간이 뒤로 갈 수 없기 때문에 분명히 불가능합니다. 에서**그리고 사실 평방 미터 2 에서 잎 15,그것은 도착해야합니다 16 이상. 따라서 현재 시간 값을 15 보다 크게 업데이트해야합니다(단순화를 위해 시간에+1 을 더함). 즉,메시지가 도착하고 수신자의 시계가 메시지 출발을 정확히 가리키는 타임스탬프 앞에 오는 값을 표시하면 수신자는 해당 시계를 출발 시간보다 한 시간 단위로 빠르게 전달합니다. 그림 6 에서 미디엄 2 는 이제 클록 값을 씨에서 16 으로 수정합니다. 그 결과,1990 년대 초반부터 1990 년대 초반까지 계속되었다.
위의 예에서 마틴반 스틴 등은 램포트의 알고리즘을 다음과 같이 공식화한다:
1. 실행하기 전에는 이벤트입니다(i.전자 메시지를 보내 네트워크를 통해,…),Pᵢ 증가 Cᵢ:Cᵢ<-Cᵢ+1 입니다.
2. 이전 단계를 실행한 후 타임스탬프를 설정합니다.
3. 다음 첫 번째 단계를 실행 하 고 응용 프로그램에 메시지를 전달 합니다.
벡터 시계
램포트의 정의로 다시 기억”발생-이전”관계,두 가지 이벤트가있는 경우 ㅏ 과 비 그러한 ㅏ 전에 발생 비,다음 ㅏ 또한 그 순서 앞에 위치 비,즉 씨(ㅏ)<씨(비). 그러나 이것은 역 인과 관계를 의미하지는 않습니다.,우리가 추론 할 수 없기 때문에 ㅏ 앞에 간다 비 단지 값을 비교함으로써 씨(ㅏ)과 씨(비)(증거는 독자에게 연습으로 남음).
타임스탬프를 기반으로 이벤트의 순서에 대한 자세한 정보를 도출하기 위해 램포트의 논리 클럭의 고급 버전인 벡터 클럭이 제안된다. 시스템의 각 프로세스에 대해 알고리즘은 다음과 같은 특성을 가진 벡터를 유지합니다.
1. 로컬 논리 클럭 또는 현재 타임스탬프 이전에 발생한 이벤트 수입니다.
2. 예를 들어,이벤트가 발생했음을 알 수 있습니다.
벡터 클럭의 알고리즘은 다음과 같습니다:
1. 실행하기 전에는 이벤트,Pᵢ 기록 새로운 이벤트 발생 자체를 실행하여 VCᵢ<-VCᵢ+1 입니다.
2. 이전 단계를 실행한 후 타임스탬프를 설정합니다.
3. 메시지가 수신되면 프로세스 피 제이 각 케이 자체 벡터 클럭을 업데이트합니다. 그런 다음 첫 번째 단계를 계속 실행하고 응용 프로그램에 메시지를 전달합니다.
의 이 단계는 프로세스 Pj 메시지를 받으면서 프로세스 Pᵢ 타임스탬프 ts(m)는,그것이 알고 있는 이벤트의 수가 발생 Pᵢ 부담에 앞서 보내의 m. 또한,Pj 도 알고있는 이벤트에 대한 알려져 왔다 Pᵢ 에 대해 다른 프로세스를 보내기 전에 m. (예 그 사실이 당신에 관한 이 알고리즘을 잡담 프로토콜🙂).
바라건대,설명이 너무 오래 머리를 긁적 떠나지 않습니다. 의 개념을 마스터하는 예에 뛰어 보자:
이 예에서는 세 가지 프로세스가 있습니다. (1,0,0)(1 단계)에 메시지를 보냅니다. 이 문제를 해결하는 방법은 무엇입니까?) = (1, 0, 0), (1,2,0)(1 단계)로 메시지를 보냅니다. 마찬가지로 프로세스 피 지선은 메시지를 받아들입니다 미디엄 2…에서 피 위,논리 클럭을(2,2,0)(3 단계)로 변경 한 후 메시지를 보냅니다 미디엄 3…에 피 지선(3,2,0). 피 메시지를 수신한 후 시계를(3,2,1)(1 단계)로 조정합니다. 나중에,그것은(1,4,0)에 의해 전송 된 메시지 미디엄 4 에 걸리고,따라서 시계를(3,4,2)로 조정합니다(3 단계).
동기화를 위해 내부 클럭을 빨리 감는 방법에 따라 이벤트 앞에 이벤트 비 모든 경우 케이,티(에이)티(비)티(비),그리고 적어도 하나의 인덱스가 있습니다 케이’어느 티(에이)<티(비). (2,2,0)이(3,2,1)앞에 오는 것을 보는 것은 어렵지 않지만(1,4,0)과(3,2,0)은 서로 충돌 할 수 있습니다. 따라서 벡터 시계를 사용하면 두 이벤트 사이에 인과 관계가 있는지 여부를 감지 할 수 있습니다.
이 분산 시스템에서 시간의 개념에 올 때,기본 목표는 이벤트의 올바른 순서를 달성하는 것입니다. 이벤트는 실제 클럭과 시간 순서대로 또는 실행 타임 라인을 따라 램트 포트의 논리 클럭과 벡터 클럭과 논리적 순서 중 하나를 배치 할 수 있습니다.
다음은?
다음 시리즈에서는 시간 동기화가 분산 시스템의 고전적인 문제,즉 최대 하나의 메시지,캐시 일관성 및 상호 배제에 대한 놀라 울 정도로 간단한 답변을 제공하는 방법을 살펴볼 것입니다.
레슬리 램 포트:시간,시계 및 분산 시스템에서 이벤트의 순서. 1978.
바바라 리스코프:분산 시스템에서 동기화된 클럭의 실제 사용. 1993.
마틴 반 스틴,앤드류 에스 타넨 바움:분산 시스템. 2017.
바바라 리스 코프,류바 슈리 라,존 브로츠와프 스키: 동기화 된 시계를 기반으로 한 가장 효율적인 메시지. 1991.
캐리 지 그레이,데이비드 알 쉐리톤:임대:분산 파일 캐시 일관성을 위한 효율적인 내결함성 메커니즘. 1989.
리카르도 구 셀라,스테파노 자티:버클리 유닉스 4.3 에서 템포에 의해 달성 된 클럭 동기화의 정확성. 1989.