작업 명세의 disconnect 블록

작업 명세의 disconnect 블록 (disconnect block in the job specification)

배치 job -> group -> **disconnect**

disconnect 블록은 네트워크 파티션 발생 시 시스템의 동작을 설명해요. 기본적으로 disconnect 블록이 없으면, 하트비트를 놓친 노드의 할당은 lost로 표시되고 대체돼요.

대체는 노드가 손실되었을 때 발생해요. 노드가 드레인되면 Nomad는 대신 할당을 마이그레이션하고 disconnect 블록을 무시해요. Nomad 에이전트가 할당을 설정하지 못하거나 할당의 태스크가 restart 블록이 허용하는 것보다 더 많이 실패하면, Nomad는 할당을 재스케줄하고 disconnect를 무시해요.

job "docs" {
  group "example" {
    disconnect {
      lost_after = "6h"
      replace = true
      reconcile = "keep_original"
    }
  }

  group "example2" {
    disconnect {
      stop_on_client_after = "12h"
      replace = true
      reconcile = "keep_original"
    }
  }
}

같은 disconnect 블록에서 lost_after와 stop_on_client_after를 둘 다 사용할 수 없다는 점에 유의하세요.

출처: 문서

본문

매개변수 (Parameters)

  • lost_after (string: "") — heartbeat_grace 창에서 하트비트에 실패한 후 Nomad 클라이언트가 할당 재연결을 시도하는 지속 시간을 지정해요. lost_after > 0s인 할당은 재연결되거나 lost_after가 만료될 때까지 unknown 상태로 들어가요. 기본값은 ""이며 이는 할당이 즉시 lost로 표시되는 lost_after "0s"와 동일해요.

자세한 내용은 Lost After 섹션을 참조하세요.

  • replace (bool: true) — Nomad가 연결이 끊긴(즉 unknown) 할당을 다른 노드에 재스케줄된 새 할당으로 대체해야 하는지 지정해요. Nomad는 대체 할당을 재스케줄로 간주하고 작업의 reschedule 블록을 따르지만, 대체할당이 현재 할당과 충돌하지 않도록 하기 위해 배치 시 급변(disconnected) 할당의 replace 설정만을 사용해요. false면 Nomad는 그 위에서 실행 중인 노드가 연결이 끊기거나 다운될 때 할당을 대체하지 않아요.

참고: replace 필드는 lost_after가 사용되고 할당이 unknown 상태일 때의 동작과만 관련 있어요.

nomad alloc stop <alloc ID>를 실행하면 연결 끊김 상태의 할당이 강제로 종료되고 그 대체가 트리거돼요.

  • stop_on_client_after (string: "") — 연결이 끊긴 Nomad 클라이언트가 그 할당을 중지한 후의 지속 시간을 지정해요.

이것이 발생하려면 Nomad 클라이언트 프로세스가 실행 중이어야 해요.

같은 disconnect 블록에서 stop_on_client_after와 lost_after를 함께 사용할 수 없어요.

자세한 내용은 Stop After 섹션을 참조하세요.

  • reconcile (string: "best_score") — 이전에 연결이 끊긴 노드가 연결을 회복했을 때 어느 할당을 유지할지 지정해요. 아래에 설명된 네 가지 가능한 값이 있어요:

    • keep_original: 항상 원래 할당을 유지해요. 이 옵션을 선택할 때, 클라이언트가 연결이 끊긴 동안 충돌했을 수 있음을 명심하세요.
    • keep_replacement: 항상 연결이 끊긴 것을 대체하기 위해 만들어진 할당을 유지해요.
    • best_score: 가장 좋은 점수를 가진 노드에서 실행 중인 할당을 유지해요.
    • longest_running: 가장 오래 연속으로 실행되어 올라와 있는 할당을 유지해요.

예제 (Examples)

다음 예제는 disconnect 블록만 보여줘요. disconnect 블록은 앞서 나열된 배치에서만 유효하다는 것을 기억하세요.

Stop After (Stop After)

이 예제는 stop_on_client_after가 다른 블록과 어떻게 상호작용하는지 보여줘요. first 그룹의 경우 기본 10초 heartbeat_grace 창이 만료되고 90초가 더 지난 후 서버가 할당을 대체해요. 클라이언트는 first-task 태스크에 중지 신호(SIGTERM)를 보내기 전에 90초를 기다려요. 태스크의 kill_timeout 때문에 15초가 더 지난 후 클라이언트가 SIGKILL을 보내요. second 그룹에는 stop_on_client_after가 없으므로, 서버는 heartbeat_grace 10초가 만료된 후 할당을 대체해요. 클라이언트와의 접촉이 얼마나 오래 끊겼든 그룹은 클라이언트에서 중지되지 않아요.

서버의 시계가 서로 밀접하게 동기화되지 않으면, 클라이언트가 할당을 중지하기 전에 서버가 그룹을 대체할 수 있다는 점에 유의하세요. 운영자는 서버 간 클록 드리프트를 가능한 한 작게 유지해야 해요.

또한 이 기능을 사용하는 그룹은 Nomad 서버 클러스터가 실패하면 클라이언트에서 중지된다는 점에 유의하세요. 그 경우 클라이언트는 어떤 서버에도 접촉할 수 없기 때문이에요. 따라서 이 기능을 선택한 그룹은 추가 런타임 종속성과 잠재적 장애 지점에 노출돼요.

group "first" {
  disconnect {
    stop_on_client_after = "90s"
  }

  task "first-task" {
    kill_timeout = "15s"
  }
}

group "second" {

  task "second-task" {
    kill_timeout = "5s"
  }
}

Lost After (Lost After)

기본적으로 하트비트에 실패한 클라이언트에서 실행되는 할당은 "lost"로 표시돼요. 클라이언트가 재연결되면 여전히 정상일 수 있는 할당은 "lost"로 표시되었기 때문에 재시작돼요. 이는 상태 유지(stateful) 태스크나 재시작 시간이 긴 태스크에 문제를 일으킬 수 있어요.

대신 운영자는 이러한 할당이 재시작 없이 재연결되기를 원할 수 있어요. lost_after가 지정되면 Nomad 서버는 하트비트에 실패한 클라이언트를 "down"이 아닌 "disconnected"로 표시하고, 연결이 끊긴 클라이언트의 할당을 "lost"가 아닌 "unknown"으로 표시해요. 이러한 할당은 연결이 끊긴 클라이언트에서 계속 실행될 수 있어요. 대체 할당은 연결이 끊긴 클라이언트가 재연결될 때까지 할당의 replace 설정에 따라 스케줄돼요. 연결이 끊긴 클라이언트가 재연결되면 Nomad는 "unknown" 할당을 그 대체 할당과 비교해 reconcile 설정에 따라 어느 것을 유지할지 결정해요. 클라이언트가 재연결되기 전에 lost_after 지속 시간이 만료되면 할당은 "lost"로 표시돼요. "unknown" 할당을 포함한 클라이언트는 마지막 lost_after 기간이 만료될 때까지 "down"이 아닌 "disconnected"로 전환돼요.

아래 예제 코드에서 이 두 태스크 그룹이 모두 같은 클라이언트에 배치되었고 그 클라이언트가 네트워크 장애를 겪었다면, 두 그룹의 할당 모두 클라이언트의 heartbeat_grace 값인 "2m" 때문에 2분에 "disconnected"로 표시돼요. 네트워크 장애가 8시간 동안 계속되고 클라이언트가 계속 하트비트에 실패하면, 첫 번째 그룹의 lost_after가 12시간이므로 클라이언트는 "disconnected" 상태로 유지돼요. 이 경우 모든 그룹의 lost_after 지속 시간(12시간)을 초과하면 클라이언트 노드는 "down"으로 표시되고 할당은 "lost"로 표시돼요. 클라이언트가 12시간이 지나기 전에 재연결되었다면, 할당은 reconcile에 의해 정의된 전략으로 정상적으로 재연결돼요.

Lost After는 엣지 배포 또는 운영자가 노드 연결성 문제로 인한 온-클라이언트 다운타임을 없애고 싶은 시나리오에 유용해요. 이 설정은 stop_on_client_after와 함께 사용할 수 없어요.

# server_config.hcl

server {
  enabled         = true
  heartbeat_grace = "2m"
}
# jobspec.nomad

group "first" {
  disconnect {
    lost_after = "12h"
    reconcile = "best_score"
  }

  task "first-task" {
    ...
  }
}

group "second" {
  disconnect {
    lost_after = "12h"
    reconcile = "keep_original"
  }

  task "second-task" {
    ...
  }
}

더 알아보기 (Learn more)