Menu

문서정보

목차

소개

SaaS와 PaaS 분야(이하 SaaS로 통일)에 관심을 가지고 있다. SaaS인프라는 두 개 이상의 컴퓨터 시스템으로 구성된 클러스터링 환경에서 작동을 한다. CPU, Memory, Disk와 같은 자원을 마치 하나의 컴퓨터인 것 처럼 통합한 후, 유저가 요청 할 때 적당한 크기의 자원을 할당해서 애플리케이션을 실행한다.

이를 위해서
  1. 자원을 통합
  2. 모니터링
  3. 애플리케이션을 위한 자원의 할당
  4. 애플리케이션의 실행
  5. 애플리케이션의 라이프사이클 관리
등의 작업을 수행 할 수 있는 "분산 컴퓨터 관리 시스템"의 개발이 필요하다.

보편성

분산 운영체제

앞서 분산 컴퓨터 관리 시스템의 기본 사양을 살펴봤는데, 이들 기능은 "컴퓨터 운영체제"에서 이미 구현하고 있는 것들이다. 단지 "단일 로컬 컴퓨터를 운영하는지", "네트워크로 분리된 다수의 컴퓨터를 운영하는지"에 차이가 있을 뿐이다. 이런 이유로 최근에는 분산 컴퓨터 관리 시스템의 개발 모델로 분산 운영체제가 주목을 받고 있다. MesOS는 가장 유명한 분산 운영체제 중 하나다.

분산 운영체제 모델이 일반 운영체제 모델을 모방하고 있기 때문에, 먼저 일반 운영체제의 특징을 살펴볼 필요가 있다.

운영체제의 핵심은 커널 인데, 이들은 각 컴퓨터(이하 노드)가 가지고 있는 메모리, 디스크, 네트워크, CPU와 같은 하드웨어 자원을 관리하고 운용하기 위한 기능들을 가지고 있다. 핵심 기능은 자원 할당, 관리, 프로세스의 실행, 통신, 입력과 출력 데이터의 관리와 처리 등이다. 이러한 기능들은 분산 운영체제도 그대로 구현이 되야 하는데, 특히 프로세스간 통신이 가장 중요하다. 분산 컴퓨팅 환경에서 프로세스간 통신은 네트워크를 통해서 이루어져야 하는데, 프로세스를 식별하고 찾는 등에 있어서 기존 IPC와는 큰 차이가 있어서 면밀하게 설계가 필요하다.

시스템 관리

분산된 노드들에는 시스템 상태를 관리하는 소프트웨어가 실행된다. 이 소프트웨어는 시스템 소프트웨어로 커널과는 상관없이 작동한다. 프로세스와 자원, 상태(안정성), 보안 등을 관리한다. 모든 분산 노드들에는 시스템 관리 소프트웨어들이 설치가 된다. 그리고 이들 소프트웨어들이 생산하는 정보들은 분산 운영체제의 커널에 해당하는 소프트웨어로 전송된다.

분산 커널에도 시스템 관리를 위한 소프트웨어가 설치된다. 이 소프트웨어는 전체 노드들을 통합관리하기 위한 기능이 추가 된다. 즉 관리 중인 노드들이 응답을 하는지, 자원은 충분한지, 안정적으로 작동하는지 등의 관리 정보를 수집하고 정책에 따라서 자원을 할당하거나 클러스터에서 제외하는 등의 작업을 한다.

복잡도 관리

분산 운영체제는 수천개의 노드를 관리 할 수 있다는 것을 가정해야 한다. 10개의 노드를 관리하는 것과 1000개의 노드를 관리하는 소프트웨어는 전혀 다른 수준의 기술을 필요로 한다. 일반적으로 복잡도는 규모가 늘어나면 급격하게 증가하는 경향이 있다. 따라서 아름답고 멋진 구현으로 복잡도를 높이는 것 보다는 단순하고 필요한 기능의 구현으로 복잡도를 낮추는 방향으로 설계를 해야 한다.

예를 들어 모놀리틱 모델 보다는 MSA(Micro service architecture)모델을 선택을 하는게 좋을 것이다. 그리고 하나의 거대한 도메인으로 관리하는 대신 여러개의 분산된 도메인으로(혹은 zone 이라고 부르기도 한다.) 노드들을 분산 배치해서, 복잡도가 일정 수준을 넘지 않도록 하는 등의 설계상의 고민이 필요하다.

개발역시 가능한 단순하고 유지보수가 쉬운 언어를 선택하는게 좋다. 성능보다 개발편의성, 유지/보수/배포 편의성, 생산성을 보장하는 단순한 언어를 선택하는걸 권장한다. GoLang과 같은 단순한 언어는 성능과 생산성 모두를 위한 좋은 선택이 될 수 있다.

주요 디자인 고려 사항들

투명성

투명성(Transparency) 혹은 단일 시스템 이미지(single-system image)라고 부르기도 한다. 하드웨어나 운영체제와 같은 세부 정보와 관계없이 응용 프로그램을 배포하고 실행 할 수 있는 소프트웨어 환경을 의미한다. 예를 들어 SaaS 애플리케이션의 경우, 애플리케이션 사용자는 하드웨어가 어떠한지 운영체제가 리눅스인지 윈도우즈인지 상관 없이 실행이 가능하다. 분산 운영 시스템은 하드웨어와 운영체제를 추상화한 고수준의 운영체제 이어야 한다.

아래의 도메인에 대한 투명성을 지원해야 한다.

IPC

IPC는 프로세스와 스레드간의 데이터 통신을 위해서 사용한다. 하지만 애초에 로컬 프로세스간의 통신을 위한 IPC를 분산 시스템에서 구현할 필요가 있을지에 대한 고민은 필요하다. 굳이 구현할 수는 있겠으나 분산 시스템에서는 네트워크 통신을 이용하면 충분 할 것 같다. 엄밀한 의미의 분산 운영체제의 기능을 만족하려면 필요 할 수도 있겠으나 실제 현장에서 엄밀한 의미의 분산 운영체제가 필요 할 것 같지는 않다.

프로세스 관리

분산된 노드에 프로세스를 효율적으로 배치 할 수 있어야 한다. 시그널 매커니즘도 제공해야 하는데, 프로세스에 대한 실행, 종료, 중단, 재개, 마이그레이션 등의 기능을 제공해야 한다. 프로세스들은 네트워크로 연결되기 때문에, 포트 할당과 해제 등의 네트워크 기능까지 포함해야 한다.

분산 된 프로세스를 찾기 위한 Discovery매커니즘도 제공해야 한다. 단일 운영체제의 경우 PID를 이용하지만 분산 운영체제에는 사용 할 수 없다. 대신 DNS와 같은 네임 서비스등을 제공해야 한다. 분산 된 프로세스를 통합하기 위한 로드밸런서도 기능중의 하나로 제공 해야한다. 프로세스를 스케쥴링 하기 위한 알고리즘을 준비해야 하는데, 서비스 특성에 따라 알고리즘을 달리 할 수 있어야 한다.

자원 관리

프로세스관리를 위해서는 메모리, 파일, 디바이스, 네트워크, CPU에 대한 자원을 관리 해야 한다. 분산 운영체제는 전체 노드에 대해서 이들 자원 정보를 수집하고, 이를 기반으로 스케쥴링 알고리즘을 수행한다.

신뢰성(Reliability)

분산 운영체제는 여러 개의 노드를 관리하게 된다. 시스템이 복잡해지며 오류가 발생할 가능성도 높아진다. 따라서 높은 수준의 안정성과 오류 예방 및 복구 서비스를 제공해야 한다. 오류는 시스템의 올바른 작동을 방해하는 물리적 또는 논리적 결함이다. 시스템이 안정적으로 작동하기 위해서 빠르게 장애를 찾고, 장애가 전체 시스템에 영향을 미치기 전에 빠르게 복구 해야 한다. 또한 전체 시스템을 구성하는 몇 개 노드에 문제가 생기고 복구가 지연되더라도 안정적으로 작동 할 수 있도록 즉 장애에 대한 내성을 가질 수 있도록 설계 해야 한다.

성능

처리량(throughput), 응답시간, 단위 시간당 작업 완료율 등에 대한 성능을 정량화 해야 한다. 분산 운영체제의 성능은 병령처리(네트워크)와 스토리지가 가장 큰 영향을 미친다. 분산 운영체제의 성능 튜닝에 있어서 중요한 점은 단일 성능에서의 최고를 지향하는 게 아니다라는 점이다.

동기화

Concurrent 프로세스들간의 협업을 위한 동기화 매커니즘을 제공해야 한다. 동기화가 제대로 이루어지지 않을 경우 원자성, 일관성, 격리 실패, 작업 실패, 교착상태, 직렬화 실패 등 여러 가지 장애가 생길 수 있다.

분산 운영체제의 목적에 따라서 동기화를 외부 애플리케이션에 맡길 수도 있다.

Flexibility

다양한 하드웨어 커널에 대응 할 수 있어야 한다.

분산 운영체제의 구현

분산 운영체제 구현 참고