2

우리는 Spring을 사용하여 단일 노드와 잘 작동하는 예약 된 작업을 실행합니다. 우리는 N 노드의 클러스터에서 이러한 예약 된 작업을 실행하여 작업이 한 시점에서 한 노드 씩 실행되도록합니다. 이것은 엔터프라이즈 사용 사례를위한 것이며 최대 10 ~ 20 개의 노드를 기대할 수 있습니다.zookeeper를 사용하는 클러스터의 예약 된 작업

  1. 사용 석영 클러스터에서 예약 된 작업을 실행하기위한 인기있는 선택이 될 것 같다

    나는 다양한 옵션으로 보았다. 단점 : 피하고자하는 데이터베이스 종속성.
  2. 사육사를 사용하고 항상 리더/마스터 노드에서만 예약 된 작업을 실행하십시오. 단점 : 작업 실행로드가 배포되지 않음
  3. zookeeper를 사용하고 모든 노드에서 예약 된 작업을 호출하도록하십시오. 그러나 작업이 실행되기 전에 실행이 완료되면 분산 잠금 및 릴리스를 확보해야합니다. 단점 : 응용 프로그램에 과부하가 발생하여 시스템 시계가 드리프트되는 경우 문제가 될 수있는 모든 노드의 시스템 시계가 동기화되어 있어야합니다.
  4. zookeeper를 사용하여 마스터 노드가 일정에 따라 작업을 계속 생성하고 임의의 작업자에게 할당하도록합니다. 이전 예약 된 작업이 아직 수행되지 않은 경우 새 작업이 할당되지 않습니다. 단점 : 너무 복잡해 보입니다.

사육사 앙상블 노드가 NTP를 사용하여 동기화 된 시스템 클럭으로 별도의 클러스터에서 실행된다고 가정하면 안전한 해결책 인 것으로 보이는 # 3을 사용하는 경향이 있습니다. 또한 시스템 클록이 동기화되면 모든 노드가 작업을 실행하기 위해 잠금을 획득 할 수있는 기회가 동일하다는 가정하에 있습니다.
편집 : 좀 더 생각한 후에는 시스템 클럭이 예약 된 작업이 단지 사육사 클러스터 노드가 아닌 노드간에 동기화되어야하므로 안전한 솔루션이 아닐 수도 있습니다. 작업이 실행되고있는 노드가 GC 일시 중지 및 기타 이유로 과부하가 걸릴 수 있고 시계가 동기화되지 않을 가능성이 있기 때문에 안전하지 않다는 말입니다. 하지만 다시 이것은 분산 시스템의 표준 문제라고 생각합니다.

각 옵션에 대한 이해가 정확한지 조언 해주세요. 또는이 문제를 해결하기 위해 나열된 옵션보다 나은 접근 방법이있을 수 있습니다.

+0

FYI - Curator/ZooKeeper 용 분산 작업 스케줄러를 작성했습니다. https://github.com/NirmataOSS/workflow – Randgalt

답변

0

글쎄, # 3과 같이 개선 할 수 있습니다.

동물원 제공 watchers. 즉 주어진 ZNode (예 : 경로 /some/path)에서 감시자를 설정할 수 있습니다. 클러스터의 모든 노드가 동일한 Znode를보고 있습니다. 노드가 생각 할 때마다 (예정 또는 어떤 방법으로) 지금

  1. 먼저 (모든 노드가 시청) /some/path 아래 PERSISTENT_SEQUENTIAL 자식 노드를 생성, 예약 된 작업을 실행해야합니다. 또한 원하는 노드의 데이터를 설정할 수 있습니다. 실행될 작업에 대한 세부 정보를 지정하는json 문자열 일 수 있습니다. 새 ZNode 경로는 /some/path/prefix_<sequence-number>처럼 보입니다.
  2. 그런 다음 클러스터의 모든 노드에 생성 된 자식 노드에 대한 알림이 전송됩니다. 그런 다음 새로 생성 된 ZNode의 데이터를 가져 와서 작업을 디코딩합니다.
  3. 이제 각 노드는 분산 잠금을 얻으려고합니다. 그것을 먼저 습득 한자는 그것을 실행할 수 있습니다. 일단 실행되면 해당 노드는보고해야합니다 (이름이 success/some/path/prefix_<sequence-number> 아래에 새로운 ZNode를 작성하여 작업이 실행되었다고 가정). 그런 다음 잠금 장치를 해제하십시오.
  4. 분산 잠금을 획득하기 전에 노드가 작업을 실행하려고 할 때마다 ZNode에 이미 success 자식 노드가 있는지 확인해야합니다.

이 디자인은 주어진 ZNode 아래에 이름이 success 인 자식 노드를 확인하여 작업을 시작하도록 알리는 작업을 두 번 실행하지 않도록합니다.

위의 디자인을 엔터프라이즈 솔루션에 사용했습니다. 실제로 분산 된 명령 프레임 워크를 위해 ;-)

+0

나는 이것이 작동 할 것이라고 생각하지만 모든 노드가 작업을 받고 잠금을 실행하기 위해 경합한다는 것을 제외하면 나열된 # 4와 비슷하게 보입니다. # 4에서도 watcher를 사용하지만 [link] (https://github.com/fpj/zookeeper-book-example/blob/master/src/main/java/org/apache/zookeeper)에 설명 된 마스터 작업자 접근 방식을 사용합니다. /book/curator/CuratorMasterSelector.java) 하나의 임의 작업자 만 작업을 가져오고 분산 잠금이 필요 없기 때문에 더 좋은 옵션 인 것 같습니다. – vkorimilli

+0

그러나 # 4의 경우 결함이나 단점이있을 경우 입력 사항을 확인하려고했기 때문에 복잡성 요인 이외의 누락이있을 수 있습니다. – vkorimilli

+0

이 경우 마스터 및 슬레이브의 복잡성에 대해 걱정할 필요가 없습니다. 단지 그들이 자물쇠를 놓고 경쟁하게하고 그 일을하십시오. –

0

Zookeeper 또는 Etcd는이 사용 사례를위한 최상의 도구가 아닙니다.

환경에 akka를 사용할 수 있으면 akka 클러스터 + 가장 작은 편지함 라우터 또는 원하는 클러스터 라우터를 사용하는 것이 더 쉬울 것입니다. 그런 다음 스케줄 작업을 클러스터의 ActorRef로 푸시하십시오. 설정하기 쉽고, 클러스터를 사용하여 클러스터에서 수천 개의 노드를 설정할 수 있습니다 (프로토콜 cassandra와 유목민을 사용합니다).

Scalecube도 SWIM을 사용하여 쉽게 다시 할 수 있습니다.