개발은 재밌어야 한다
article thumbnail
반응형

아파치 카프카의 주요 구성 요소는 주키퍼라고 하는 상위에 있는것과 아래의 카프카 클러스터로 구성되어 있습니다.

 

카프카 클러스터 내에는 여러개의 브로커들로 구성되어 있습니다.

카프카 브로커는 토픽과 파티션을 유지 및 관리를 해주는 소프트웨어

카프라 브로커란? 

  • 카프카 서버라고 부르기도 함
  • 토픽 내의 파티션들을 분산, 유지 및 관리
  • 각각의 브로커들은 ID로 식별됨 (단, ID는 숫자)
  • 토픽의 일부 파티션들을 포함 → 토픽 데이터의 일부분을 갖을 뿐 데이터 전체를 갖고 있지 않음
  • 카프카 클러스터 : 여러개의 브로커들로 구성됨
  • 클라이언트는 특정 브로커에 연결하면 전체 클러스터에 연결됨
  • 최소 3대 이상의 브로커를 하나의 클러스로 구성해야함 → 이왕이면 안정성을 위해서 4대 이상을 권장함

 

파티션도 번호를 가지고 있고 브로커도 숫자를 가지고 있는데 → 브로커 ID와 파티션 ID는 서로 아무런 관계가 없음

  • 토픽을 구성하는 파티션들은 겹치지 않게 여러 브로커 상에 분산됨
  • 토픽 생성시 카프카가 자동으로 토픽을 구성하는 전체 파티션들을 모든 브로커에게 할당해주고 분배해 줌

 

클라이언트가 브로커에 접속을 할 때 어떻게 접속을 하는가? → 부트스트랩 서버라고 하는 파라미터를 가지고 접속을 함

여기서 부트스트랩을 카프카가 가지고 있는 전체 브로커들을 부트스트랩 서버라고 부르기도 한다.

 

카프카 클라이언트 (프로듀서/ 컨슈머)가 특정 하나의 브로커에 접속을 하면 

전체 내가 원하는 카프카의 브로커와 토픽으로 자동으로 연결할 수 있게 된다.

그렇지만 아래 처럼 하나의 브로커에만 연결하게 되면 브로커 101이 죽어버리면 안되기 때문에 장애를 대비하기 위해 브로커의 전체 리스트들을 ,를 통해서 리스트로 사용한다.

 

 

주키퍼 

  • 카프카의 브로커들을 관리해주는 소프트웨어
  • 주키퍼는 변경사항에 대해 카프카에 알림 ex) 토픽을 생성하거나 제거, 브로커 추가하거나 제거
  • 주키퍼 없이는 카프카는 동작할 수 없다. but 주키퍼를 없애는 작업들이 진행 중에 있다. (kip[kafka improvement proposal] : 카프카에서 주키퍼를 제거한 버전)
  • 주키퍼는 홀수의 서버로 동작하게 되어있다. 최소는 3대이상의 서버로, 큰 규모는 권장 5대
  • 주키퍼에는 리더와 팔로워같은 개념들이 있다.

주키퍼 아키텍쳐

가운데에 있는 2번 서버는 리더의 역할, 양쪽의 1,3은 팔로워 역할한다. 리더에서 데이터를 가져와서 동기화 하는 방식이다.

주키퍼는 분산형 configuration 정보들을 리더가 가지고 있고 팔로워들이 그 정보들을 복제해서 가지고 있는 형태이다.

분산 작업을 제어하기 위한 트리 형태의 데이터 저장소를 가지고 있다.

아래와 같이 주키퍼가 3대 이상으로 이루어져 있는 형태를 주키퍼 앙상블(Zookeeper Ensemble)이라고 한다.

주키퍼는 3대 혹은 5대 이상의 홀수로 구성하는데, 그 이유는 Quorum 기반 알고리즘으로 이루어져 있기 때문이다.

 

여기서 쿼럼은 다른말로 "정족수"라고 번역이 되는데, 어떤 의사 결정을 하는 합의체(주키퍼 앙상블)이 뭔가에 대한 의사를 체결하기 위한 최소한의 인원수를 뜻한다. (과반수 이상이 필요한것) 

그 이유는 분산 코디네이션 환경에서 예상치 못한 장애가 발생하더라도 분산 시스템의 일관성을 유지시키기 위해서 사용한다.

예시) 앙상블이 주키퍼 서버 3대로 구성이 되어 있다면 쿼럼은 2 (과반수 이상)이 되기 때문에 주키퍼 장비가 1대가 장애가 생겨도 정상 동작

앙상블이 주키퍼 서버 5대로 구성이 되어 있다면 쿼럼은 3 (과반수 이상)이 되기 때문에 주키퍼 장비가 2대가 장애가 생겨도 정상 동작

 

즉,  홀수로 주키퍼 서버로 구성하는 이유는 3대를 쓰나 4대를 쓰나 과반수 이상이 되는것은 한대로 동일하기 때문에 홀수개의 서버로 구성한다.

 

 

정리

반응형
profile

개발은 재밌어야 한다

@ghyeong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!