ZooKeeper HA 서비스

ZooKeeper HA 서비스

Flink의 ZooKeeper HA 서비스는 고가용성 서비스를 위해 ZooKeeper를 사용합니다.

Flink는 실행 중인 모든 JobManager 인스턴스 간의 *분산 조정(distributed coordination)*을 위해 **ZooKeeper**를 활용합니다. ZooKeeper는 Flink와 별도의 서비스로, 리더 선출과 가벼운 일관성 있는 상태 저장을 통해 매우 신뢰할 수 있는 분산 조정을 제공합니다. ZooKeeper에 대한 자세한 내용은 ZooKeeper's Getting Started Guide를 확인하세요. Flink에는 간단한 ZooKeeper 설치를 부트스트랩하는 스크립트가 포함되어 있습니다.

출처: 문서

본문

구성

HA 클러스터를 시작하려면 다음 구성 키를 설정해야 합니다.

  • high-availability.type (필수): high-availability.type 옵션은 zookeeper로 설정해야 합니다.

    high-availability.type: zookeeper
    
  • high-availability.storageDir (필수): JobManager 메타데이터는 파일 시스템 high-availability.storageDir에 영구 저장되고, ZooKeeper에는 이 상태에 대한 포인터만 저장됩니다.

    high-availability.storageDir: hdfs:///flink/recovery
    

    storageDir은 JobManager 실패 복구에 필요한 모든 메타데이터를 저장합니다.

  • high-availability.zookeeper.quorum (필수): ZooKeeper quorum은 분산 조정 서비스를 제공하는 복제된 ZooKeeper 서버 그룹입니다.

    high-availability.zookeeper.quorum: address1:2181[,...],addressX:2181
    

    addressX:port는 주어진 주소와 포트에서 Flink가 접근할 수 있는 ZooKeeper 서버를 나타냅니다.

  • high-availability.zookeeper.path.root (권장): 모든 클러스터 노드가 배치되는 루트 ZooKeeper 노드입니다.

    high-availability.zookeeper.path.root: /flink
    
  • high-availability.cluster-id (권장): 클러스터에 필요한 모든 조정 데이터가 배치되는 cluster-id ZooKeeper 노드입니다.

    high-availability.cluster-id: /default_ns # important: customize per cluster
    

    중요: YARN, 네이티브 Kubernetes 또는 다른 클러스터 관리자에서 실행할 때 이 값을 수동으로 설정해서는 안 됩니다. 이러한 경우 cluster-id는 자동으로 생성됩니다. 베어 메탈에서 여러 Flink HA 클러스터를 실행하는 경우 각 클러스터에 대해 별도의 cluster-id를 수동으로 설정해야 합니다.

예시 구성

Flink 구성 파일에서 고가용성 모드와 ZooKeeper quorum을 구성합니다.

high-availability.type: zookeeper
high-availability.zookeeper.quorum: localhost:2181
high-availability.zookeeper.path.root: /flink
high-availability.cluster-id: /cluster_one # important: customize per cluster
high-availability.storageDir: hdfs:///flink/recovery

ZooKeeper 보안 구성

Kerberos로 ZooKeeper가 보안 모드로 실행 중인 경우, 필요에 따라 Flink 구성 파일에서 다음 구성을 재정의할 수 있습니다.

# default is "zookeeper". If the ZooKeeper quorum is configured
# with a different service name then it can be supplied here.

zookeeper.sasl.service-name: zookeeper 

# default is "Client". The value needs to match one of the values
# configured in "security.kerberos.login.contexts".   
zookeeper.sasl.login-context-name: Client

Kerberos 보안에 대한 Flink 구성에 대한 자세한 내용은 Flink 구성 페이지의 보안 섹션을 참조하세요. Flink가 Kerberos 기반 보안을 내부적으로 설정하는 방법에 대한 자세한 내용도 확인할 수 있습니다.

고급 구성

ZooKeeper 클라이언트 재시도 구성

ZooKeeper 연결이 실패하거나 중단되면 Flink는 유계 지수 백오프(bounded exponential backoff) 전략으로 연결을 자동으로 재시도합니다. 이 전략은 ZooKeeper 클러스터에 과부하를 주지 않도록 재시도 사이의 대기 시간을 점진적으로 증가시키며(매번 두 배), 최대 대기 시간을 제한하여 합리적으로 빠른 복구를 보장합니다.

일시 중단된 ZooKeeper 연결 허용

기본적으로 Flink의 ZooKeeper 클라이언트는 일시 중단된(suspended) ZooKeeper 연결을 오류로 취급합니다. 즉, 연결이 일시 중단되면 Flink는 모든 컴포넌트의 리더십을 무효화하여 장애 조치(failover)를 트리거합니다.

이 동작은 어떤 경우(예: 불안정한 네트워크 환경)에는 너무 파괴적일 수 있습니다. 더 공격적인 접근을 원한다면 high-availability.zookeeper.client.tolerate-suspended-connections를 통해 일시 중단된 ZooKeeper 연결을 허용하고 끊어진 연결만 오류로 취급할 수 있습니다. 이 기능을 활성화하면 Flink가 일시적인 연결 문제에 더 탄력적이게 되지만 ZooKeeper 타이밍 문제가 발생할 위험도 커집니다.

자세한 내용은 Curator's error handling을 참조하세요.

ZooKeeper 부트스트랩

실행 중인 ZooKeeper 설치가 없다면 Flink와 함께 제공되는 헬퍼 스크립트를 사용할 수 있습니다.

conf/zoo.cfg에 ZooKeeper 구성 템플릿이 있습니다. server.X 항목으로 ZooKeeper를 실행할 호스트를 구성할 수 있으며, X는 각 서버의 고유 ID입니다.

server.X=addressX:peerPort:leaderPort
[...]
server.Y=addressY:peerPort:leaderPort

bin/start-zookeeper-quorum.sh 스크립트는 구성된 각 호스트에서 ZooKeeper 서버를 시작합니다. 시작된 프로세스는 Flink 래퍼를 통해 ZooKeeper 서버를 시작하며, 이 래퍼는 conf/zoo.cfg에서 구성을 읽고 편의를 위해 필요한 일부 구성 값을 설정합니다. 프로덕션 환경에서는 직접 ZooKeeper 설치를 관리하는 것이 권장됩니다.

더 알아보기 (Learn more)