아키텍처

아키텍처 (Architecture)

이 페이지는 Nomad 아키텍처에 대한 개념 정보를 제공해요. 리전(region), 서버, 클라이언트가 어떻게 상호작용하는지, 그리고 Nomad 클러스터가 어떻게 데이터를 복제하고 워크로드를 실행하는지 알아봐요.

출처: 문서

본문

Nomad는 많은 서로 다른 구성 요소를 가진 복잡한 시스템이에요. Nomad의 사용자와 개발자가 작동 방식을 이해하는 데 도움을 주기 위해, 이 페이지에서는 시스템 아키텍처를 문서화해요.

여기서 다루는 일부 용어에 대한 자세한 내용은 용어집(glossary)을 참고해요.

고급 주제! 이 페이지는 Nomad의 기술적 세부 사항을 다루고 있어요. 이 내용을 이해하지 않아도 Nomad를 효과적으로 사용할 수 있어요. 이 세부 사항은 소스 코드를 직접 뒤지지 않고도 배우고 싶은 사람들을 위해 문서화된 것이에요.

높은 수준의 개요 (High-Level Overview)

단일 리전만 본다면 높은 수준에서 Nomad는 다음과 같이 보여요.

각 리전 내에는 클라이언트와 서버가 있어요. 서버는 사용자로부터 작업을 받아들이고, 클라이언트를 관리하며, 태스크 배치를 계산하는 역할을 담당해요. 각 리전은 여러 데이터 센터의 클라이언트를 가질 수 있으므로, 소수의 서버로 매우 큰 클러스터를 처리할 수 있어요.

가용성이나 확장성을 위해 여러 리전을 실행해야 하는 경우도 있어요. Nomad는 여러 리전을 단일 클러스터로 페더레이션하는 것을 지원해요. 높은 수준에서 이 설정은 다음과 같이 보여요.

리전은 서로 완전히 독립적이며 작업, 클라이언트, 상태를 공유하지 않아요. 이들은 가십 프로토콜을 사용해 느슨하게 결합되어 있어, 사용자가 어떤 리전에든 작업을 제출하거나 어떤 리전의 상태를 투명하게 질의할 수 있어요. 요청은 처리를 위해 적절한 서버로 전달되고 결과가 반환돼요. 데이터는 리전 간에 복제되지 않아요.

각 리전의 서버는 모두 단일 합의 그룹(consensus group)의 일부예요. 이는 서버들이 함께 협력해 추가적인 임무를 가진 단일 리더를 선출한다는 뜻이에요. 리더는 모든 질의와 트랜잭션을 처리하는 책임을 가져요. Nomad는 낙관적 동시성(optimistically concurrent) 방식으로, 모든 서버가 병렬로 스케줄링 결정에 참여해요. 리더는 이 작업을 안전하게 수행하고 클라이언트가 과잉 할당되지 않도록 하기 위한 추가 조정을 제공해요.

각 리전은 서버를 3개 또는 5개 운영하는 것이 권장돼요. 이는 장애 시 가용성과 성능 사이의 균형을 이룬 것으로, 서버가 추가될수록 합의가 점점 느려지기 때문이에요. 그러나 리전당 클라이언트 수에는 제한이 없어요.

클라이언트는 자체 리전 서버와 통신하도록 구성되며, 원격 프로시저 호출(RPC)을 사용해 등록, 하트비트를 통한 활성 신호, 새 할당 대기, 할당 상태 업데이트를 수행해요. 클라이언트는 사용 가능한 리소스, 속성, 설치된 드라이버를 제공하기 위해 서버에 등록해요. 서버는 이 정보를 스케줄링 결정에 사용하고, 작업을 클라이언트에 할당하기 위한 할당을 생성해요.

사용자는 Nomad CLI나 API를 사용해 작업을 서버에 제출해요. 작업은 원하는 상태를 나타내며 실행해야 할 태스크 집합을 제공해요. 서버는 태스크 스케줄링을 담당하는데, 이는 작업이 지정한 모든 제약 조건을 충족하면서 리소스 활용을 극대화하도록 각 태스크의 최적 배치를 찾는 방식으로 이루어져요. 리소스 활용은 빈 패킹(bin packing)으로 극대화되는데, 스케줄링이 특정 차원을 고갈시키지 않으면서 머신의 모든 리소스를 사용하려고 시도해요. 작업 제약 조건은 애플리케이션이 적절한 환경에서 실행되도록 보장하는 데 사용할 수 있어요. 제약 조건은 아키텍처나 GPU 가용성 같은 하드웨어 기능, 운영체제나 커널 버전 같은 소프트웨어 기능에 기반한 기술적 요구 사항일 수도 있고, PCI 컴플라이언스 워크로드가 적절한 서버에서 실행되도록 보장하는 것 같은 비즈니스 제약 조건일 수도 있어요.

심층 탐구 (Getting in Depth)

지금까지 Nomad 아키텍처에 대한 간략한 높은 수준의 개요를 살펴봤어요. 각 하위 시스템에는 더 많은 세부 사항이 있어요. 합의 프로토콜, 가십 프로토콜, 스케줄러 설계가 모두 더 자세히 문서화되어 있어요.

다른 세부 사항은 코드를 참조하거나, GitHub에 이슈를 열거나, 커뮤니티 포럼에서 질문하세요.

더 알아보기 (Learn more)