본문 바로가기

Studying/Data System Design

분산 시스템의 골칫거리 [데이터 중심 애플리케이션 설계 8장]

  1. 결함과 부분 장애
    1. 단일 컴퓨터에서의 소프트웨어는 항상 같은 결과를 내는 결정적이다. 완전하게 동작하거나 전체 장애가 발생한다.
    2. 분산 시스템에서는 부분 장애가 발생한다. (비결정적)
    3. 신뢰성 없는 구성 요소를 사용해 신뢰성 있는 시스템 구성한다.
      1. 오류 수정 코드 (error-correcting code): 데이터를 정확하게 전송하게 해줌
      2. IP(Internet protocol)은 신뢰성이 없으나 TCP에서 신뢰성을 제공한다.
  2. 결함 감지
    1. 네트워크에선 몇 번 시도해보고 타임아웃이 발생하면 결함으로 감지
  3. 동기 네트워크 대 비동기 네트워크
    1. 전화는 동기 네트워크로 통화마다 회선을 만들어서 할당한다. 지연 시간 최대치가 보장이 돼서 제한있는 지연이라 한다.
    2. TCP는 비동기 네트워크로 패킷 교환 네트워크이다. 데이터 전송률을 동적으로 조절해서 최대한 빨리 처리하는 데 초점을 맞춘다.
    3. 사용율이 높아질 수록 동적 자원 분할이 비용이 줄어든다.
  4. 신뢰성 없는 시계
    1. 단조시계(monotonic clock)와 일 기준 시계(time of day clock)
      1. 일 기준 시계
        1. epoch 이래로 흐른 초를 반환하는 형식으로 보통 NTP로 동기화한다.
        2. 로컬 시계가 너무 앞서면 강제로 리셋돼서 뒤로 가는 현상이 나타나기도 한다.
      2. 단조 시계
        1. 지속 시간(시간 구간)을 재는 데 적합한 것으로 두 값의 차이로 시간이 얼마나 흘렀는 지를 측정한다.
        2. 절대적인 값은 의미가 없어서 다른 두 대의 컴퓨에서 나온 단조 시계를 비교하는 건 의미가 없다.
    2. 분산 환경에서는 각자의 시간이 있어서 시간 만으로 실제 순서를 알 수가 없다. 논리적 시계로 카운터를 기반으로 이벤트 순서화를 사용해야 한다.
    3. 시계 읽기의 신뢰 구간
      1. NTP 서버의 불확실성과 네트워크의 문제로 시간의 신뢰 구간을 정확히 알 수가 없다.
      2. Spanner의 구글 트루타임(TrueTime) API는 로컬 시계의 신뢰 구간을 명시적으로 나타내서 겹치지 않는다면 순서를 알 수 있다.
    4. 프로세스 중단
      1. 동기화된 시계에 의존하면 동기화가 깨졌을 때 문제가 발생한다.
      2. 로컬 단조 시계를 사용해도 프로세스가 멈추는 현상이 있을 수 있다.
      3. 분산 시스템에선 상당 시간 멈출 수 있다는 것을 가정해야 한다.
    5. 응답시간 보장
      1. 프로세스가 명시된 간격의 CPU시간을 할당받을 수 있게 보장하는 실시간 운영체제(RTOS) 사용
      2. 가비지 컬렉션 제한하기
  5. 지식, 진실, 그리고 거짓말
    1. 여러 분산 알고리즘은 투표로 정족수를 사용한다.
    2. 펜싱(fencing) 토큰: 잘못된 리더같은 현상을 막기 위해 잠금이나 임차권을 승인할 때마다 펜싱 토큰을 반환하게 해서 최신의 펜싱토큰을 가진 경우만 처리하도록 한다.
    3. 비잔틴 결함: 펜싱 토큰은 부주의한 경우를 막지만 의도적으로 거짓말하는 문제가 있을 수 있다. 이럴 경우 비잔틴 결함이 있다고 한다.