관리 메뉴

루시와 프로그래밍 이야기

8장 카프카 버전 업그레이드와 확장 본문

스터디/실전 카프카 개발부터 운영까지

8장 카프카 버전 업그레이드와 확장

Lucy_Ko 2022. 7. 5. 11:09
 
운영중인 카프카 클러스터에 미치는 영향을 최소로 줄이면서 버전을 업그레이드하는 과정을 실습
업그레이드 순서와 주의사항

8.1 카프카 버전 업그레이드를 위한 준비
  1. 현재 사용하고 있는 카프카의 버전이 무엇인지 확인하기
    1. 명령어를 이용하는 방법 : /usr/local/kafka/bin/kafka-topics.sh —version -> 2.6.0
    2. 카프카가 설치된 경로에서 jar파일들을 확인하는 방법 : 실습환경에서는 /usr/local/kafka 가 위치이므로 -> ls -l /usr/local/kafka/libs/kafka_*
  2. 차이점 파악 : 업그레이드 하려는 버전을 정하고 카프카의 릴리스 노트 등을 살펴보면서 버전 업그레이드 시 문제가 될 만한 부분은 없는지 확인
    1. 카프카 상위 버전은 클라이언트들의 하위 호환성을 갖고 있으므로 대부분 클라이언트 이슈는 없음
    2. 스칼라 컨슈머, 프로듀서처럼 서비스가 종료된 경우도 있으므로 전체적인 카프카의 릴리즈 노트를 확인해야 함
    3. 메이저 버전 업그레이드 : 1.x/0.x에서 2.x로 업그레이드 -> 다음과 같은 이슈가 있을 수 있음
      1. 메시지의 포맷 변경
      2. 브로커에서의 기본값 변화
      3. 과거에는 지원했던 명령어의 지원 종료
      4. 일부 JMX메트릭의 변화
    4. 마이너 버전 업그레이드 : 2.1에서 2.6로 업그레이드 -> 비교적 용이하게 업그레이드 할 수 있음
    5. *0.1 버전 이하에서 2.0으로 한번에 업그레이드 하지말고, 0.10 이후의 마이너 버전으로 먼저 업그레이드 한 후 다시 상위버전으로 진행하는 것을 원정
      1. 메시지 포맷에 타임스탬프 필드가 추가됨
  3. 업그레이드 방법
    1. 다운타임 가질 수 있는 방법 : 현 카프카 모두 종료 후 최신 버전의 카프카 실행 -> 간단하게 업그레이드 완료
    2. 가질 수 없는 방법 : 브로커 한 대씩 "롤링 업그레이드"
 
 
 
롤링 업그레이드 전략을 활용하여 카프카 서비스 중단없이 버전 업그레이드

 
8.2 주키퍼 의존성이 있는 카프카 롤링 업그레이드 
**토픽삭제 : /usr/local/kafka/bin/kafka-topics.sh —bootstrap-server peter-kafka01.foo.bar:9092 —delete —topic peter-test06
**카프카 종료 : sudo systemctl stop Kafka-server
**(종료가 완료되면) 앤서블을 이용해 카프카 2.1버전을 설치 : ansible-playbook -i hosts kafka2.1.yml
 
카프카 버전이 변경되면서 명령어의 옵션이 변경되거나 삭제되는 경우가 있으므로,
자동화 스크립트 또는 프로그래밍 코드 등에서 작성한 명령어들이 잘 동작하는지를 반드시 확인해야 함
2.1의 경우 —bootstrap-server 사용 X
  • 토픽생성 : /usr/local/kafka/bin/kafka-topics.sh —bootstrap-server peter-kafka01.foo.bar:9092 —create —topic peter-version2-1 —partitions 1 —replication-factor 3
    -> 토픽 생성 실패 및 bootstrap-server옵션 인식 불가 오류 발생 :  카프카 2.1버전에서는 bootstarp-server 옵션 존재 x
    -> 대응책, 주키퍼를 이용하는 옵션 : /usr/local/kafka/bin/kafka-topics.sh —zookeeper peter-zk01.foo.bar —create —topic peter-version2-1 —partitions 1 —replication-factor 3
  • 콘솔 프로듀셔를 이용해 메시지를 전송
    -> /usr/local/kafka/bin/kafka-console-producer.sh —broker-list peter-kafka01.foo.bar:9092 —topic peter-version2-1 
    > Version2-1-message1
    > Version2-1-message2
    > Version2-1-message3

    ->  컨슈머에서 확인 가능 : /usr/local/kafka/bin/
    kafka-console-consumer.sh —broker-list peter-kafka01.foo.bar:9092 —topic peter-version2-1 —from-beginning —group perter-consumer
 
 
8.2.1 최신 버전의 카프카 다운로드와 설정
  • 2.1 -> 2.6으로 kafka 디렉토리 링크 변경 전에
  • 설정파일 복사 : sudo cp kafka_2.12-2.1.0/config/server.properties kafka_2.12-2.6.0/config/server.properties
  • sudo vi kafka_2.12-2.6.0/config/server.properties
    -> 적용하지 않으면 이미 실행중인 2.1 버전 브로커들과의 통신이 불가능
inter.broker.protocol.version=2.1 //브로커 간의 내부 통신은 2.1 버전 기반으로 통신하며
log.message.format.version=2.1 //메시지 포맷도 2.1을 유지한다
 
 
8.2.2 브로커 버전 업그레이드
  • 브로커 버전 업그레이드는 한 대씩 순차적으로 진행
  • Peter-kafka01에 접속한 후 브로커 종료 -> 종료된 브로커가 갖고 있던 파티션의 리더들이 다른 브로커로 변경
  • 카프카 종료 : cd /usr/local // sudo systemctl stop Kafka-server
  • 카프카 심볼릭 링크 2.6으로 변경
sudo rm -rf kafka
sudo ln -sf Kafka_2.12-2.6.0 Kafka
ll
 
  • sudo systemctl start kafka-server
  • server.properties 설정 파일에서 내부 브로커 프로토콜 버전과 메시지 포맷 버전은 모두 2.1 로 설정했으므로, 다른 2.1 버전의 브로커들과 정상적으로 통신 가능
  • 토픽 상세보기 명령어 /usr/local/kafka/bin/kafka-console-topics.sh —bootstrap-server peter-kafka01.foo.bar:9092 —topic peter-version2-1 —describe
    -> 상세보기 확인하니 리플리케이션 정상/ISR 잘 동작
  • 동일하게 2번브로커/3번브로커 업그레이드 진행
    1. 2번 브로커 접속
    2. /usr/local 경로로 이동
    3. 브로커 종료
    4. kafka 링크 삭제
    5. kafka 링크 2.6 버전으로 재생성
    6. 설정 파일 복사 및 옵션 설정
    7. 브로커 시작
  • 완료 된줄 알았지?  8.2.1에서 브로커 프로토콜 버전과 메시지 포맷 버전을 2.1로 낮춰났으니 설정 변경 필요
 
8.2.3 브로커 설정 변경
  • sudo vi kafka_2.12-2.6.0/config/server.properties 를 통해서 설정한 내용 삭제
  • sudo systemctl restart kafka-server
  • 8.2와 같이 이상없는지 메시지 전송 후 컨슈머를 이용해 메시지 가져와봄
 
 
8.3 카프카의 확장
카프카는 이렇게 폭발적으로 사용량이 증가하는 경우를  고려해 안전하고 손쉽게 확장할 수 있도록 디자인 됨
 
 
  • 토픽생성 : /usr/local/kafka/bin/kafka-console-topics.sh —bootstrap-server peter-kafka01.foo.bar:9092 --create --topic peter-scaleout1 --partitions 4 --replication-factor 1
  • 카프카 확장 실습을 위한, 브로커 한 대 더 추가하기 위해 주키퍼 서버 중 하나에 앤서블로 카프카 설치
  • server.properties를 보면 broker.id=4 지정되어있는지 확인
  • 토픽생성 : /usr/local/kafka/bin/kafka-console-topics.sh —bootstrap-server peter-kafka01.foo.bar:9092 --create --topic peter-scaleout2 --partitions 4 --replication-factor 1
    -> 기존 토픽은 브로커를 추가했음에도 파티션들이 분산되지 않고 그대로 유지
    -> 신규 토픽은 브로커마다 고르게 분산
 
 
 
8.3.1 브로커 부하 분산
  • kafka-reassign-partitions.sh 도구 이용하면 파티션 이동 가능
 
Comments