Distributed Systems 이란?
분산 시스템은 흔히 구성 요소가 서로다른 네트워크 컴퓨터에 위치하며 서로 메세지를 전달하여 작업을 통신하고 조정하는 시스템이다. 이 시스템의 구성요소는 컴퓨터와 같은 물리적 하드웨어에서 실행되는 소프트웨어 프로그램으로 생각할 수 있다. 이러한 구성 요소는 웹 서버, 라우터, 웹 브라우저와 같이 다양한 형태를 취할 수 있으며 일반적으로 이러한 각 머신을 노드 라고 부른다.
Distributed Systems의 이점
분산 시스템에는 성능, 확장성, 가용성와 같은 세가지 이점이 있다.
성능
두대 이상의 저사양 컴퓨터를 사용하여 고성능 컴퓨터 한대를 사용하는 것과 같은 성능을 얻을 수 있다. 즉, 더 낮은 비용으로 더 나은 성능(요청당 지연시간 단축, 처리량 증가 등)을 얻을 수 있다.
확장성
여러 컴퓨터에 데이터를 분할하여 저장하고, 처리 작업을 분산 할 수 있다. 즉, 수 많은 컴퓨터에 데이터를 분할하여 저장, 처리를 통해 단일 컴퓨터 시스템보다 크게 시스템을 확장 할 수 있다.
가용성
여러 컴퓨터에 중복된 데이터를 저장하여 한 컴퓨터의 오류 발생시 다른 컴퓨터로 전환 할 수 있게 되어 서비스를 지속적으로 운영할 수 있게 된다.
Distributed Systems의 다양한 오류들
분산 시스템은 단일 컴퓨터에서 실행되는 소프트웨어 시스템보다 더 많은 제약을 받게 된다. 이러한 제약을 간과하고 개발을 하게 되면 여러 부분을 놓치게 되는데, 이러한 부분들을 정리한 것이 분산 컴퓨팅의 오류 라고 한다.
- The network is reliable
- 네트워크는 안정적이지 않을수 있다.
- Latency is zero
- 원격 시스템에 대한 호출에는 지연시간이 있다.
- Bandwidth is infinite
- 네트워크의 대역폭은 유한하다.
- The network is secure
- 네트워크는 안전(보안)하지 않을 수 있다.
- Topology doesn’t change
- 네트워크 구성이 변경될 수 있다.
- There is one administrator
- 관리의 권한이 여럿일 수 있다.
- Transport cost is zero
- 분산 시스템내의 두 지점간 통신에는 비용이 발생한다.
- The network is homogeneous
- 분산 시스템내의 각 노드들의 시간이 동일하지 않을 수 있다.
- 시간 동기화의 문제
Distributed Systems을 설계하기 어렵게 만드는 여러 이유
네트워크 비동기성, 부분적인 실패 및 동시성은 분산 시스템 분야의 복잡성을 높이는 주요 원인이므로, 실생활에서 분산 시스템을 구축할 때 이를 염두에 두어야 한다.
- 네트워크 비동기(Network asynchrony)
- 분산 시스템내 여러 노드별로 각각 처리 작업을 처리하여 요청이 비동기적으로 처리될수 있어 직관적이지 못하다.
- 부분적인 실패(Partial failures)
- 분산 시스템의 일부 구성요소에만 오류가 발생 할수 있으므로, 분산 시스템의 구성 요소 전체에 원자성이 필요한 경우 복잡도가 크게 상승한다.
- 이러한 문제로 인해 시스템의 모든 노드에 작업을 적용하거나, 어느 노드에도 적용하지 않아야 한다.
- 동시성(Concurrency)
- 각 노드가 동시에 여러 계산을 진행하므로 서로 간섭하고 예상치 못한 동작을 하여 추가적은 복잡성이 발생한다.
Distributed Systems 모델
분산 시스템 모델을 생성하려면 모델이 충족해야 하는 몇 가지 속성을 정의해야 한다. 알고리즘이 이 모델에 대해 정확하다는 것을 증명하면 이러한 속성을 충족하는 모든 시스템에 대해서도 알고리즘이 정확할 것이라고 확신할 수 있다.
각 시스템에는 다음과 같은 주요한 속성이 있다.
- 분산 시스템의 노드가 서로 상호 작용하는 방법
- 분산 시스템의 노드가 실패하는 방법
위와 같은 주요 속성에 대해, 네트워크 통신의 성격에 따라 두가지 범주로 나눌수 있다.
- 동기식 시스템
- 각 노드가 정확한 시계를 가지고 있고 메세지 전송 지연 및 처리 시간에 대해 상한이 존재하는 시스템
- 흔히, 하나의 노드가 작업을 처리할때 다른 노드는 해당 작업이 완료되어 메세지를 받을때 까지 잠금상태로 기다림
- 비동기식 시스템
- 각 노드에는 공통된 시간 개념이 없으므로 독립적이게 작업을 수행
- 하나의 노드가 적업을 처리할때, 다른 노드는 해당 작업이 완료되어 메세지를 받지 않더라도 다른 작업을 수행하고 있음
Distributed Systems 의 실패 유형
실패에는 여러 유형이 있으며 가장 기본적인 범주는 아래와 같다.
- 장애 중지(Fail-stop)
- 노드가 영구적으로 정지된 상태로 유지됨
- 충돌(Crash)
- 노드가 조용히 정지됨
- 생략(Omission)
- 노드가 요청에 응답을 하지 못함
- 임의의 동작(Byzantine)
- 노드가 의도한 프로토콜, 알고리즘, 로직등에 따라 동작하지 않을때 발생
Exactly-Once 의미론
분산 시스템에서 각 노드는 메세지 교환을 위해 서로 통신한다. 이때 네트워크는 안정적이지 않을 수 있기 때문에 메세지가 손실될 가능성이 있다.
이러한 경우, 아래 그림과 같이 아예 요청을 받지 못하는경우와 메세지가 여러번 전달될 수 있는 가능성이 존재하게 된다.
이러한 문제를 방지하기 위해 여러 접근방식을 취할 수 있다.
- 멱등성 작업 접근 방식(Idempotent operations approach)
- 멱등성은 동일한 연산에 대해 결과가 변경되지 않는 성질을 말한다
- 즉, 멱등성 잡업에 대하여 결과를 값 집합에 포함시켜 작업에 대해 여러번 수행하더라도 첫번째 작업의 결과만 반영하도록 한다.
- 멱등성 연산은 시스템에 업격한 제약을 가정하므로 모든 작업에 대하여 본질적으로 멱등성을 가지도록 시스템을 구축하기엔 불가능하다.
- 중복 제거 접근 방석
- 모든 메세지에 고유 식별자를 부여하고, 재시도된 모든 메세지에는 원본과 동일한 식별자를 포함한다.
- 배송과 처리의 차이 인식
- 네트워크 통신을 통한 배송과 배송된 메세지에 대한 어플리케이션의 처리에 대하여 구분한다.
- 분산 시스템에서는 정확히 한번만 배송하는 것은 불가능하나, 정확히 한번만 처리 하는 것은 가능한 경우가 있다.
Distributed Systems의 장애 감지
흔히 시간초과(Time Out) 방식을 통해 분산 시스템내의 오류를 감지하는데, 이는 분산 시스템에서 네트워크의 비동기적 특성으로 인해 충돌이 발생한 경우와 요청에 대한 응답이 느린경우를 구별하기가 쉽지 않다.
Time Out의 시간값이 작게 설정되어 있을 경우
시스템이 충돌한 노드를 기다리는데 더 적은 시간을 소비하게 된다. 그러나 네트워크 지연으로 인해 응답이 Time Out의 시간값보다 늦게 되면 노드가 장애가 발생했다고 착각할수 있다.
Time Out의 시간값이 크게 설정되어 있을 경우
시스템이 네트워크 지연에 대해 관대해 진다. 그러나 시스템은 충동한 노드를 식별하는 속도가 느려지게 되고 노드를 기다리는 동안의 시간을 낭비 할 수 있다.
Stateless and Stateful Systems
분산 시스템은 다은과 같은 두가지 범주중 하나에 속하게 된다.
- 무상태 시스템(Stateless)
- 과거에 발생한 일에 대해 상태를 유지하지 않으며 제공받은 입력을 기반으로 기능을 수행
- 상태 저장 시스템(Stateful Systems)
- 상태를 유지하고 변경하여, 상태에 따라 작업의 결과가 달라지게 됨
무상태 시스템의 모든 노드는 동일한 것으로 간주되어 지기 때문에 보통 무상태 시스템이 상태 저장 시스템에 비해 설계, 구축, 확장이 쉽다. 상태 저장 시스템은 서로 다른 노드가 각각 다른 데이터를 보유할 수 있으므로 데이터의 동기화를 위해 별도의 작업이 필요하다.
참고