Cloud 스케줄러로 Compute Engine에서 안정적인 태스크 일정 예약

Compute Engine 인스턴스 네트워크와 같은 분산 시스템에서는 자동 확장 또는 네트워크 파티션 나누기로 인해 개별 인스턴스를 사용하지 못하게 될 수 있으므로 태스크 일정을 안정적으로 예약하기가 어렵습니다.

일정 예약에 Cloud 스케줄러를, 분산 메시징에 Cloud Pub/Sub를 사용하면 Compute Engine 인스턴스 전체에서 태스크 일정을 안정적으로 예약할 수 있는 애플리케이션을 빌드할 수 있습니다. 다른 제품 또는 클라우드에서 복잡한 워크플로를 예약하고 조정하려면 Cloud Composer 사용을 고려해 보세요.

3부로 구성된 이 문서에는 다음 내용이 포함되어 있습니다.

Compute Engine에서 태스크 일정을 안정적으로 예약하는 방법

크론은 Unix 시스템에서 반복 태스크 일정을 예약하는 표준 도구입니다. 구축하는 시스템이 복잡해지고 분산되면 크론을 실행하는 단일 컴퓨터가 심각한 장애 지점이 될 수 있습니다. 인스턴스가 자동 확장으로 인해 중지되거나 네트워크 세그먼트가 통신해야 하는 시스템에서 분할될 수 있습니다.

Cloud 스케줄러는 이벤트를 예약할 수 있는 완전 관리형 엔터프라이즈급 서비스를 제공합니다. 작업을 예약하고 나면 Cloud 스케줄러에서 구성된 이벤트 핸들러(App Engine 서비스, HTTP 엔드포인트 또는 Cloud Pub/Sub 구독)를 호출합니다.

Cloud 스케줄러 이벤트에 대한 응답으로 Compute Engine 인스턴스에서 태스크를 실행하려면 이벤트를 해당 인스턴스로 릴레이해야 합니다. 이를 위해서는 Compute Engine 인스턴스에서 실행되는 HTTP 엔드포인트를 호출하거나, 또는 Cloud Pub/Sub를 사용하여 Cloud 스케줄러에서 Compute Engine 인스턴스로 메시지를 전달하는 방법이 있습니다. 본 샘플은 두 번째 설계 패턴을 보여줍니다.

다음 다이어그램은 이 설계 패턴의 아키텍처 개요를 보여줍니다.

아키텍처 개요 다이어그램

본 구현에서는 Cloud 스케줄러에서 이벤트 일정을 예약하고 Cloud Pub/Sub를 사용하여 Compute Engine 인스턴스로 이벤트를 전송합니다.

Compute Engine 인스턴스의 유틸리티 서비스는 Cloud Pub/Sub 주제를 구독하고 해당 주제에서 가져온 이벤트에 대한 응답으로 크론 작업을 실행합니다. 이 유틸리티는 표준 스크립트를 실행하므로 본 샘플에서 사용하기 위해 현재 크론 스크립트를 수정할 필요가 없습니다.

Cloud Pub/Sub를 사용하여 Compute Engine에서 명령어를 실행 중인 로직과 태스크 일정 예약 로직을 분리하면 Cloud 스케줄러 구성을 업데이트하지 않고 크론 스크립트를 업데이트할 수 있습니다. 또한 Compute Engine 인스턴스에서 유틸리티 서비스를 업데이트하지 않고도 태스크 일정을 변경할 수 있습니다.

할당량

크론 작업은 보통 수가 적으며 시간, 주 또는 일별 일정으로 실행되므로 대부분의 경우 이 설계 패턴은 분당 수십 건의 요청 및 일별 수천 건의 요청을 허용하는 Cloud 스케줄러 할당량을 초과하지 않습니다. 그러나 할당량을 초과하는 경우, 애플리케이션 코드에서의 태스크 타이밍 직접 관리와 같은 다른 애플리케이션 패턴을 사용하는 것이 좋습니다.

비용

다른 애플리케이션에 해당 리소스를 사용하지 않는 경우 GCP 무료 등급을 사용하여 비용 부담 없이 이 설계 패턴의 샘플을 구현해 볼 수 있습니다. 프로젝트의 다른 애플리케이션에서 무료 할당량을 사용하는 경우 Compute Engine, Cloud 스케줄러, Cloud Pub/Sub 리소스의 총 사용량을 기준으로 비용이 결정됩니다.

Cloud 스케줄러의 가격 책정 기준은 예약된 작업 수입니다. Compute Engine의 가격은 사용되는 인스턴스의 유형 및 기간에 따라 결정됩니다. Cloud Pub/Sub의 가격은 전송된 데이터 양에 따라 결정됩니다.

예를 들어 다음 섹션에서 1시간 동안 샘플 구현을 실행한 다음 GCP 리소스를 삭제하면 비용은 약 1센트가 됩니다. 가격 계산기를 통해 본 샘플 예상 비용의 세부 내역을 확인하고 실제로 원하는 작업의 비용을 계산해 볼 수 있습니다.

설계 패턴의 샘플 구현

이 설계 패턴의 샘플 구현인 샘플: Compute Engine에서 안정적인 태스크 일정 예약은 GitHub에서 사용할 수 있습니다.

샘플은 두 부분으로 구성되어 있습니다.

  • Cloud 스케줄러 및 Cloud Pub/Sub를 구성하는 안내

  • Compute Engine에서 실행되는 유틸리티. 이 유틸리티는 Cloud Pub/Sub 주제를 모니터링합니다. 유틸리티가 새 메시지를 감지하면 서버에서 해당 명령어를 로컬로 실행합니다.

샘플에 포함된 readme 파일에는 샘플에 대한 자세한 설명과 GCP에서 샘플 코드를 실행하는 방법이 나와 있습니다.

일정에 따라 인스턴스를 시작 및 중지하는 구체적인 사례는 Cloud 스케줄러로 Compute 인스턴스 예약을 참조하세요.

설계 패턴 및 샘플을 기반으로 구축

샘플은 Cloud 스케줄러를 사용하여 Compute Engine에서 안정적인 일정 예약 솔루션을 구현하는 하나의 예를 보여줍니다. Compute Engine 인스턴스에서 명령어를 실행하는 로직과 일정 예약 로직을 분리하는 설계 패턴은 일정 예약 로직을 업데이트하지 않아도 태스크 위치 및 실행을 변경할 수 있어 유용합니다.

다음 다이어그램은 이 샘플에서의 메시지 흐름을 보여줍니다. 특정 주제를 구독하는 인스턴스를 지정하여 크론 작업을 단일 인스턴스에서 실행할지 또는 여러 인스턴스에서 실행할지 제어할 수 있습니다.

상세한 아키텍처 다이어그램

이 아키텍처의 또 다른 장점은 크론 작업이 인스턴스로 라우팅되는 방식을 제어할 수 있다는 것입니다.

Cloud Pub/Sub 주제 A 및 C에 설명된 대로 서로 다른 크론 메시지를 다른 서버 세트로 보낼 수 있습니다. 주제 A의 태스크는 단일 구독자에게 전송되지만 몇몇 서버는 주제 C를 구독합니다. 이 전략을 사용하여 웹 서버에서 명령어 한 세트를 실행하고 다른 서버에서 또 다른 세트를 실행할 수 있습니다.

여러 서버 중 하나에서 명령어를 실행할 수도 있습니다. 주제 B가 여기에 해당되며, 이 경우 여러 서버가 한 주제를 공유합니다. 주제 B에 게시된 메시지는 해당 메시지를 요청하는 첫 번째 서버에 의해 처리되며 관련 명령어는 해당 서버에서만 실행됩니다. 이 접근 방식은 한 서버에서만 실행해야 하는 야간 데이터 분석을 수행할 때 사용할 수 있습니다.

다음 단계

샘플을 수정하여 자체 애플리케이션의 모델로 사용할 수 있습니다. 다음과 같이 시작하세요.

  • Cloud 스케줄러 구성을 업데이트하여 자체 크론 메시지를 지정합니다. 크론 작업 생성 및 구성의 설명에 따라 크론 작업을 직접 업데이트할 수 있습니다.

  • test_executor.py를 업데이트하여 logger_sample_task.py 대신 실제 스크립트를 실행하거나 자체 Executor 유틸리티를 작성합니다.

  • Compute Engine에서 유틸리티를 수동으로 시작하고 포그라운드 프로세스로 실행하는 대신 systemd 또는 Supervisor와 같은 시스템 또는 타사 도구를 통해 데몬으로 자동 시작할 수 있습니다.

  • Cloud 스케줄러나 Cloud Pub/Sub가 항상 '한 번만' 전송된다고 보장할 수 없습니다. 드물긴 하지만 중복 메시지가 전송되기도 합니다. 특정 태스크가 두 번 이상 실행되는 것을 원치 않을 경우에는 Zookeeper와 같은 일관된 분산형 잠금 도구를 사용하여 태스크가 단일 인스턴스에서 한 번만 실행되도록 합니다.

  • 태스크 일정을 예약할 때는 크론 권장사항을 따르고 다음 태스크가 실행되기 전에 처리가 완료될 수 있도록 충분한 간격을 두고 태스크 일정을 예약합니다.

  • 모든 태스크에 Compute Engine 인스턴스를 꼭 실행할 필요가 있는지 생각해보세요. 아니라면 Pub/Sub 메시지에 대한 응답으로 Cloud Functions를 트리거하는 방법도 있습니다. Cloud Functions는 Cloud API를 호출할 수는 있지만 셸 스크립트를 직접 실행하지는 못합니다. 셸 스크립트를 실행해야 하면 Compute Engine API를 호출하여 임시 Compute Engine 인스턴스를 생성해 스크립트를 실행할 수 있습니다. 이러한 인스턴스는 태스크가 완료되면 자동으로 종료됩니다. 이를 통해 최소한의 비용으로 이벤트 시간 직후 유연하게 태스크를 완료할 수 있습니다.

다른 Google Cloud Platform 기능을 직접 사용해 보려면 가이드를 살펴보세요.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...