분산 컴퓨팅 10. 벡터 시계와 스냅샷 찍기

    들어가기 전

    • 이 글은 핵심 이론부터 프로그래밍 실습까지 분산 컴퓨팅을 읽고 정리한 글입니다. 
    • 몇몇 참고 글도 있습니다.

     


    요약

    • 분산 시스템의 스냅샷은 프로세스 / 채널 State가 모두 포함됨.
    • 분산 시스템의 스냅샷을 챈디 - 램포트 알고리즘을 통해서 작성할 수 있음. 
    • 챈디 - 램포트 알고리즘은 마커를 이용해서 채널의 State를 정확히 기록함. 

     

     

     


    10.1 단체 메세징 어플리케이션 문제

     

     

     

     

     

     


    10.2 벡터 시계 

     

     

     

     


    10.3 전역 스냅샷

    분산 시스템에서 특정 시점의 상태를 잘 보존해둔다면 분산 시스템 운영에 많은 도움이 될 수 있다. 예를 들어 장애가 발생해서 분산 시스템을 전체 재기동 해야하는 경우, 해당 시점의 상태로 돌아가는데 사용할 수 있기 때문이다. 

    분산 시스템에서 상태 보존의 대상이 되는 것은 크게 두 가지다. 

    1. 프로세스의 상태 : 각 프로세스가 가지고 있는 상태
    2. 채널의 상태 : 프로세스끼리 메세지를 전송하는 창구 

    프로세스는 채널을 통해 소통 중이다. 프로세스 A → 프로세스 B로 메세지를 보냈을 때, 그 메세지는 '채널'을 통과하고 있는 경우도 있을 것이다. 이런 경우까지 고려해서 분산 시스템의 스냅샷은 프로세스 / 채널을 모두 포함해야하고, 이것을 전역 스냅샷(Global Snapshot)이라고 한다. 

     

    분산 프로세스의 스냅샷은 어떻게? 

    분산 시스템을 관제하는 어떤 서버가 존재하고, 클라이언트는 이 서버에게 요청해서 스냅샷을 받을 수 있다고 가정해보자. 그런데 한 가지 문제점이 있다. 

    분산 프로세스의 스냅샷은 어느 시점에 어떻게 작성해야하는 것일까? 

    앞서서 분산 프로세스 간의 절대적인 시간 동기화는 어렵다는 것을 공부했다. 이것을 미루어본다면, 분산 프로세스가 약속된 시간에 함께 스냅샷을 찍는다는 것은 굉장히 어려운 일임을 직감할 수 있다. 아래에서 좀 더 알아보자. 

     

     

    올바르지 않은 전역 스냅샷 예시

    위 상태의 스냅샷을 찍는다고 가정해보자. 

    1. 채널 그 자체를 들여다 볼 수 있는 방법이 없기 때문에 프로세스가 가지고 있는 상태에 대한 스냅샷만 찍히게 된다. 
    2. 두 분산 프로세스의 완전한 시간적 동기화는 이루어 질 수 없다. 

    스냅샷을 동시에 찍는다고는 하지만 시간적 동기화가 이루어 질 수 없으며, 채널의 내용을 모른다. 따라서 스냅샷을 찍고보면 프로세스 A, 프로세스 B에 'O'라는 토큰이 존재할 수도 있다. 혹은 프로세스 A,B 모두에 'O'라는 토큰이 존재하지 않을 수도 있다. 위 두 문제 때문에 이 상태로 찍은 스냅샷은 Data Inconsistency 문제를 수반한다. 

     

     

    Chandy - Lamport Snapshot Algorithm (마커 기반 Global Snapshot)

    챈디 - 램포트 알고리즘은 마커(Maker)를 기반으로 분산 시스템의 프로세스 / 채널의 스냅샷을 찍는 알고리즘이다. 이 알고리즘은 다음과 같이 동작한다. 

    • 분산 시스템의 특정 프로세스(A)가 마킹 알고리즘을 시작함.
      • 자신의 Local State를 기록함. 
      • 마커를 분산 시스템에 BroadCast 함. 
    • 다른 프로세스(B)는 마커를 받았을 때 다음과 같이 동작한다.
      • 처음 받은 마커인 경우
        • Local State를 기록함. 
        • 채널로 들어오는 메세지를 기록함. 
        • 해당 프로세스와 연결된 채널은 기록 종료
        • 다른 프로세스들과 연결된 모든 채널들을 감시 시작.
        • A를 제외한 다른 프로세스에게 마커를 전달. 
      • 이전에 받은 마커인 경우.
        • 해당 프로세스와 연결된 채널은 기록 종료. 
    • 모든 프로세스가 마커를 받은 시점에 스냅샷이 종료됨. 

    마커를 이용해 채널의 상태까지 스냅샷을 찍으려고 하는 방법이다. 중요한 부분은 다음 두 가지다.

    • 처음 마커를 받은 시점의 로컬 상태를 기억한다. 
    • 각 채널로 마커가 전달될 때 마다 해당 채널은 기록을 종료하고, 채널의 스냅샷을 작성함. 

     

     

    챈디 - 램포트 스냅샷 알고리즘의 예시

    1. 프로세스 1이 스냅샷을 찍기 시작.
      1. P1의 상태를 S1으로 저장. 
      2. P2, P3에 Marker를 전송함. 
      3. C21, C32에서 전송되는 메세지 기록 시작.
    2. 프로세스 3이 마커를 처음 수신. (From P1)
      1. P3의 상태를 S3로 저장
      2. C13 채널 기록 중지 및 스냅샷 작성. (어떤 메세지도 오지 않았기 때문에 Empty)
      3. C23로 전송되는 메세지 기록 시작. 
      4. 프로세스 1,2로 Marker 전송
    3. 프로세스 1이 마커 수신. (From P3)
      1. C31 채널 기록 중지 및 스냅샷 작성. 
    4. 프로세스 2가 마커를 처음 수신. (From P3)
      1. P2의 상태를 S2로 저장. 
      2. C32 채널 기록 중지 및 스냅샷 작성. (어떤 메세지도 오지 않았기 때문에 Empty)
      3. C12로 전송되는 메세지 기록 시작. 
      4. 프로세스 1,3으로 Marker 전송
    5. 프로세스 1이 마커 수신 (From P2)
      1. C21 채널 기록 중지 및 스냅샷 작성. → (MSG G → D 수신)
    6. 프로세스 3이 마커 수신 (From P2)
      1. C23 채널 기록 중지 및 스냅샷 작성. 
    7. 프로세스 2가 마커 수신 (From P1)
      1. C12 채널 기록 중지 및 스냅샷 작성
    8. 모든 프로세스가 마커 수신. 스냅샷 알고리즘 종료. 

    처음 마커를 받는 경우, "채널 기록 중지 및 스냅샷 작성" 이라고 표현을 했다. 그러나 해당 채널은 마커를 처음 받았기 때문에 애초에 어떤 채널도 감시하고 있던 상태는 아니었다. (마커를 받았을 때부터 채널을 감시하기 시작한다는 것을 기억해라!)  

    특정 채널로 마커를 받으면 해당 채널에는 더 이상 전달될 메세지가 없다는 것이 보장된다. 마커는 해당 채널을 기록하는 것을 종료하고, 기록된 것을 스냅샷으로 작성하라는 명령어이기 때문이다. 그렇기 때문에 처음 마커를 수신한 경우에는 채널을 기록한 적은 없지만, 기록을 종료하고 스냅샷으로 만들게 된다. 이 때 기록한 것이 아무것도 없기 때문에 채널은 Empty로 작성되는 것이다. 

     

     

     

    참고

     

     

    댓글

    Designed by JB FACTORY