인프런 커뮤니티 질문&답변

고래밥님의 프로필 이미지

작성한 질문수

[아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!

ISR(In-Sync-Replicas)와 acks 옵션

min.insync.repllicas, acks옵션, 그리고 리더 파티션 승급

작성

·

43

0

안녕하세요. 강의 잘 듣고 있습니다.

 

아래 상황을 가정하고 질문 드립니다.

 

replication factor : 3

acks옵션 : -1

min.insync.replicas : 2

리더 파티션을 가지고 있던 브로커에서 장애가 발생하였고, 프로듀서는 정상적으로 적재되었다고 응답을 받은 상황이라고 가정하겠습니다.

여기서 리더 파티션으로 승급되는 기준은 acks와 min.insync.replicas옵션에 의해 데이터를 복제받은 파티션일 것 같은데요. 제 생각에 가장 simple하게 승급시키는 기준이 팔로워 파티션 중 offset이 가장 큰 팔로워 파티션을 승급시키는 방법인 것 같은데요. 카프카에서는 어떤 기준으로 팔로워 파티션을 리더로 승급시키는지 궁금합니다.

답변 1

0

데브원영 DVWY님의 프로필 이미지
데브원영 DVWY
지식공유자

안녕하세요!

리더 파티션 1개, 팔로워 파티션 2개가 존재할 때, 팔로워를 승급시키는 기준은 여러가지가 있습니다. ISR에 포함된 팔로워 파티션(브로커)인지, replica가 잘 되고 있는지가 가장 중요할 것 같습니다. 관련 코드는 다음과 같습니다.

object PartitionLeaderElectionAlgorithms {
  def offlinePartitionLeaderElection(assignment: Seq[Int], isr: Seq[Int], liveReplicas: Set[Int], uncleanLeaderElectionEnabled: Boolean, controllerContext: ControllerContext): Option[Int] = {
    assignment.find(id => liveReplicas.contains(id) && isr.contains(id)).orElse {
      if (uncleanLeaderElectionEnabled) {
        val leaderOpt = assignment.find(liveReplicas.contains)
        if (leaderOpt.isDefined)
          controllerContext.stats.uncleanLeaderElectionRate.mark()
        leaderOpt
      } else {
        None
      }
    }
  }
... 생략

상기 코드는 실제 카프카 코드로 오프라인이 발생했을 때 리더를 선정하는 코드로 질문에 대한 답이 될 것 같네요!