분산 시스템 기초
조정, 일관성, 장애 허용성, 그리고 트레이드오프와 같은 핵심 분산 시스템 개념을 이해합니다.
시스템이 분산되는 이유
단일 서버는 작은 규모에서는 잘 동작하지만, 실제 시스템은 트래픽, 데이터 크기, 신뢰성 요구 때문에 결국 이를 넘어섭니다.
- 한 대의 머신은 CPU, 메모리, 저장소, 네트워크 처리량에 명확한 한계가 있습니다.
- 데이터와 트래픽이 증가하면 성능 병목이 생기며, 수직 확장만으로는 이를 감당할 수 없습니다.
- 단일 서버 구성은 단일 장애 지점을 만들기 때문에 고가용성을 보장할 수 없습니다.
상세정보
대부분의 시스템은 구축과 관리가 단순하기 때문에 단일 서버로 시작합니다. 작은 규모에서는 한 대의 머신이 요청을 처리하고, 로직을 실행하며, 큰 복잡성 없이 데이터를 저장할 수 있습니다.
사용량이 증가하면 이 모델은 한계에 부딪힙니다. 트래픽이 늘어나면 지연 시간이 증가하고 리소스가 고갈되며, 데이터셋이 커질수록 쿼리가 느려지고 저장 시스템에 부담이 커집니다.
신뢰성도 큰 문제가 됩니다. 그 한 대의 서버가 실패하면 전체 시스템이 중단됩니다. 이는 지속적인 가용성이 필요한 시스템에서는 허용될 수 없습니다.
이러한 한계를 극복하기 위해 시스템은 여러 머신에 작업을 분산합니다. 하나의 서버에 의존하는 대신 워크로드를 공유하여 확장성과 장애 허용성을 확보하지만, 그 대신 조정과 일관성에서 새로운 과제가 생깁니다.
분산 시스템이란 무엇인가
분산 시스템은 네트워크를 통해 서로 조정하여 하나의 시스템처럼 동작하는 여러 개의 독립적인 머신입니다.
- 각 머신(노드)은 자체 메모리와 리소스를 가지고 독립적으로 동작합니다.
- 노드는 공유 메모리 대신 네트워크 호출을 통해 통신합니다.
- 이 시스템은 사용자에게 하나의 통합된 서비스처럼 보이도록 설계됩니다.
상세정보
분산 시스템에서는 여러 서버가 함께 요청을 처리하고, 데이터를 저장하며, 로직을 실행합니다. 각 서버는 별도의 머신이며, 종종 서로 다른 위치에서 실행되지만, 사용자 관점에서는 함께 하나의 시스템을 이룹니다.
단일 머신 시스템과 달리, 이러한 노드들은 메모리를 공유하지 않습니다. 대신 네트워크를 통해 메시지를 보내며 통신하고, 이로 인해 지연과 장애 가능성이 생깁니다.
이 때문에 조정이 매우 중요합니다. 노드들은 물리적으로 떨어져 있어도 데이터 값이나 시스템 결정 같은 공유 상태에 대해 합의해야 합니다.
핵심 과제는 지연, 장애, 그리고 네트워크 전반의 부분적인 가시성에도 불구하고, 이 독립적인 머신들의 집합이 하나의 시스템처럼 일관되고 신뢰성 있게 동작하도록 만드는 것입니다.
복제
복제는 여러 머신에 데이터를 복사하여 가용성, 장애 허용성, 읽기 성능을 향상시킵니다.
- 데이터는 primary node에서 하나 이상의 replica node로 복사됩니다.
- 한 노드가 실패하면 다른 replica가 계속 요청을 처리할 수 있습니다.
- 읽기 요청은 여러 replica에 분산되어 부하를 줄일 수 있습니다.
상세정보
복제는 동일한 데이터를 여러 머신에 저장하는 분산 시스템의 핵심 기법입니다. 일반적으로 하나의 노드가 primary로 동작하며 쓰기를 처리하고, 다른 노드들은 데이터의 복사본을 받는 replica로 동작합니다.
이 구성은 신뢰성을 향상시킵니다. primary 또는 어떤 replica가 실패하더라도, 시스템은 남아 있는 노드를 사용해 계속 동작할 수 있어 다운타임을 줄일 수 있습니다.
복제는 특히 읽기 중심 시스템에서 성능도 향상시킵니다. 모든 읽기 요청을 하나의 머신으로 보내는 대신, 요청을 여러 replica에 분산할 수 있습니다.
하지만 복제는 복잡성을 추가합니다. 업데이트를 여러 노드에 전파해야 하며, 동기화 지연으로 인해 replica 간에 일시적인 불일치가 발생할 수 있습니다.
분할 내성
분할 내성이란 네트워크의 일부가 서로 통신할 수 없게 되어도 시스템이 계속 동작하는 것을 의미합니다.
- 네트워크 장애로 인해 시스템이 서로 고립된 노드 그룹으로 분리될 수 있습니다.
- 노드는 계속 실행될 수 있지만 서로 통신할 수는 없습니다.
- 시스템은 완전히 중단되지 않고 이러한 장애를 처리해야 합니다.
상세정보
분산 시스템에서는 머신들이 네트워크를 통해 통신하며, 네트워크는 본질적으로 신뢰할 수 없습니다. 연결이 끊길 수 있고, 메시지가 지연될 수 있으며, 시스템의 전체 구간에 접근할 수 없게 될 수도 있습니다.
네트워크 분할은 노드들이 서로 통신할 수 없는 그룹으로 나뉘는 경우에 발생합니다. 예를 들어, 서버 A와 서버 B가 모두 실행 중이더라도 네트워크 장애 때문에 서버 A가 서버 B에 도달하지 못할 수 있습니다.
이것은 근본적인 문제를 만듭니다. 분할의 양쪽이 각각 독립적으로 요청을 계속 처리할 수 있고, 그 결과 서로 충돌하는 상태가 생길 수 있습니다.
분할 내성이란 이러한 장애가 발생해도 시스템이 계속 동작하도록 설계되었음을 의미하며, 노드 간 조정이 일시적으로 불가능할 수 있음을 받아들입니다.
분산 시스템에서의 일관성
일관성은 분산 시스템의 모든 노드가 같은 시점에 같은 데이터를 보는지를 정의합니다.
- 강한 일관성은 모든 읽기 작업이 모든 노드에서 최신 쓰기 결과를 반환하도록 보장합니다.
- 최종 일관성은 일시적인 차이를 허용하지만 시간이 지나면 수렴함을 보장합니다.
- 더 높은 일관성은 종종 가용성이나 성능을 희생하는 대가를 치릅니다.
상세정보
분산 시스템에서는 데이터가 여러 머신에 복제되는 경우가 많으며, 이로 인해 그 데이터를 동기화 상태로 유지하는 문제가 생깁니다. 일관성은 특정 시점에 이러한 복제본들이 얼마나 잘 맞춰져 있는지를 정의합니다.
강한 일관성에서는 쓰기가 발생한 후, 어떤 노드에 읽기가 도달하더라도 이후의 모든 읽기는 즉시 업데이트된 값을 반환합니다. 이를 위해서는 노드 간의 긴밀한 조정이 필요합니다.
최종 일관성에서는 업데이트가 시간이 지나면서 전파됩니다. 쓰기 이후 일부 노드는 일시적으로 오래된 데이터를 반환할 수 있지만, 결국 모든 노드는 같은 상태로 수렴합니다.
이러한 트레이드오프는 피할 수 없습니다. 엄격한 일관성을 강제하는 시스템은 특히 네트워크 지연이나 장애가 있을 때 성능이나 가용성을 희생하는 경우가 많습니다.
CAP 정리
CAP 정리는 분산 시스템이 세 가지 속성인 일관성, 가용성, 분할 내성 중 두 가지만 보장할 수 있다고 말합니다.
- 일관성은 모든 노드가 동일하고 최신의 데이터를 반환한다는 뜻입니다.
- 가용성은 장애가 발생하더라도 모든 요청이 응답을 받는다는 뜻입니다.
- 분할 내성은 네트워크 분리 상황에서도 시스템이 계속 동작한다는 뜻입니다.
상세정보
CAP 정리는 분산 시스템의 어려운 제약을 보여줍니다. 네트워크 분할이 발생하면, 완벽한 일관성과 완전한 가용성을 동시에 유지할 수 없습니다.
일관성을 유지하려면 노드 간 조정이 필요합니다. 모든 읽기 요청이 최신 쓰기를 반환하려면, 노드들이 현재 상태에 대해 합의해야 하며, 이 과정에서 네트워크를 통한 통신을 기다려야 할 수 있습니다.
반면 가용성은 응답성을 우선합니다. 일부 노드에 접근할 수 없더라도 시스템은 요청을 계속 처리하며, 그 결과 오래되었거나 일관되지 않은 데이터를 반환할 수 있습니다.
분할 내성은 실제 시스템에서는 네트워크 장애가 반드시 발생하므로 피할 수 없습니다. 이로 인해 시스템은 하나의 선택을 해야 합니다. 분할이 발생했을 때 일관성을 지키기 위해 응답을 지연하거나, 즉시 응답하되 일시적인 불일치를 받아들이는 것입니다.
분산 조정
분산 조정은 여러 노드가 공유된 결정과 시스템 상태에 대해 합의하도록 보장합니다.
- 노드는 충돌과 일관성 없는 시스템 동작을 피하기 위해 조정해야 합니다.
- 일반적인 패턴에는 리더 선출, 분산 락, 합의가 포함됩니다.
- ZooKeeper, etcd, Consul 같은 특화된 시스템은 조정을 안정적으로 처리합니다.
상세정보
분산 시스템에서는 여러 노드가 독립적으로 동작하지만, 많은 작업은 이들이 조정된 방식으로 행동해야 합니다. 조정이 없으면 노드들이 서로 충돌하는 결정을 내릴 수 있고, 그 결과 데이터가 일관되지 않거나 시스템 장애가 발생할 수 있습니다.
리더 선출은 하나의 노드를 선택해 결정을 내리거나 중요한 작업을 처리하게 하는 일반적인 패턴입니다. 이를 통해 여러 노드가 동시에 같은 작업을 수행하는 것을 방지합니다.
분산 락은 단일 머신의 동시성에서의 락과 비슷하게, 한 번에 하나의 노드만 공유 리소스에 접근하거나 수정할 수 있도록 보장하지만, 네트워크 전반에서 구현됩니다.
합의 알고리즘은 더 나아가, 장애가 발생하더라도 노드들이 값이나 결정에 대해 합의할 수 있게 합니다. ZooKeeper, etcd, Consul 같은 도구는 이러한 조정 메커니즘을 제공하므로 엔지니어가 이를 처음부터 직접 구현할 필요가 없습니다.
분산 시스템의 과제
분산 시스템은 단일 머신 시스템에는 존재하지 않는 장애 모드와 복잡성을 도입합니다.
- 네트워크 장애와 지연으로 인해 통신이 신뢰할 수 없고 예측하기 어려워집니다.
- 복제된 데이터는 노드 간에 일시적으로 일관되지 않을 수 있습니다.
- 여러 머신을 조정하는 일은 상당한 설계 복잡성을 추가합니다.
상세정보
시스템이 분산되면 네트워크를 통해 동작해야 하며, 네트워크는 본질적으로 신뢰할 수 없습니다. 메시지는 지연되거나, 손실되거나, 순서가 바뀐 채 도착할 수 있어, 단순한 작업도 추론하기 훨씬 더 어려워집니다.
데이터 일관성도 과제가 됩니다. 복제를 사용하면, 특히 부하가 크거나 네트워크 지연이 있을 때 서로 다른 노드가 같은 데이터의 서로 다른 버전을 어떤 시점에는 보유할 수 있습니다.
노드 간 조정은 또 다른 어려움을 더합니다. 여러 머신이 공유 상태에 대해 합의하거나 작업을 올바른 순서로 실행하도록 보장하려면 복잡한 프로토콜과 신중한 설계가 필요합니다.
이러한 과제는 예외적인 경우가 아니라 근본적인 문제입니다. 이러한 문제에도 불구하고 시스템이 올바르고 신뢰할 수 있게 동작하도록 설계하는 것이 바로 분산 시스템 엔지니어링이 해결하려는 핵심 과제입니다.
질문 섹션
1 / 5
이 레슨은 프리미엄 콘텐츠입니다
프리미엄으로 업그레이드하여 흐림 효과를 없애고 전체 내용을 읽어 보세요.