Back-End/Kafka

[Kafka] Local 환경에 Kafka Cluster 구성하기 (Windows 환경)

유자맛바나나 2021. 8. 17. 04:21

 

0. Local 카프카 구성

  • 학습을 위해 한 개의 Machine에 세 개의 Kafka Broker를 띄우고, Zookeeper는 1개만 띄운다.
  • 세 개의 Kafka Broker를 띄우기 위해 브로커의 포트를 9092, 9093, 9094 로 설정하여 실행한다

 

1. server.properties 작성

  • 세 개의 브로커를 띄우기 위해 server.properties를 세 개 만든다
    • server.properties를 복사해 server1.properties 생성
    • server.properties를 복사해 server2.properties 생성
  • 각각의 server.properties의 broker.id, listener, log.dirs를 위와 같이 설정한다
$ vi config/zookeeper-server-start.sh

*참고 : [Kafka] Kafka Broker 설정(server.properties) 꼼꼼히 들여다보기

 

 

2. Zookeeper 실행

1. 새로운 터미널 실행

2. 카프카 폴더로 이동

3. 주키퍼 실행

$ ./zookeeper-server-start.bat ./config/zookeeper.properties

(마지막에 &를 붙이면 Backgorund 실행)

 

3. Kafka 실행

1. 새로운 터미널 실행

2. 카프카 폴더로 이동

3. Broker#0 실행

$ ./bin/windows/kafka-server-start.bat ./config/server.properties

 

4. Broker#1 실행

$ ./bin/windows/kafka-server-start.bat ./config/server1.properties

 

5. Broker#2 실행

$ ./bin/windows/kafka-server-start.bat ./config/server2.properties

 

4. Topic 생성하기

1. 새로운 터미널 실행

2. 카프카 폴더로 이동

3. 토픽 생성

$ ./bin/windows/kafka-topics.bat --create --topic topic2 --bootstrap-server localhost:9093 --partitions 3 --replication-factor 2
  • --bootstrap-server : 세 개의 브로커 중 아무거나 설정해도 된다. 즉, 9092, 9093, 9094 세 개의 포트 중 무엇을 사용해도 무방하다. 브로커들은 클러스터로 구성되어 있고, Zookeeper가 관리하고 있기 때문에 어떤 브로커에게 토픽 생성을 요청해도 브로커 클러스터에 의해 관리된다. 심지어 localhost:9092,localhost:9093,localhost:9094로 연달아 작성해도 가능하다.
  • --partitions 3 : 파티션 3개 생성
  • --replication-factor 2 : 원본 외 1 개의 복사본 생성

 

4. 토픽 상태 확인 

$ ./bin/windows/kafka-topics.bat --describe --topic topic2 --bootstrap-server localhost:9093
  • --bootstrap-server : 토픽 생성할 때와 마찬가지로 어떤 브로커를 선택해도 무방함

 

5. Console Producer로 Topic에 메시지 발행해보기

1. 새로운 터미널 실행

2. 카프카 폴더로 이동

3. Topic으로 메시지 보내는 Producer 실행

$ ./bin/windows/kafka-console-producer.bat --topic topic2 --bootstrap-server localhost:9092,localhost:9093,localhost:9094
  • --bootstrap-server : 프로듀서는 보통 종료되지 않고 항상 동작하므로 특정 브로커가 죽었을 때를 대비해 세 개의 브로커를 전부 나열해 지정한다.

4. 메시지 발행

> First Message
> Second Message

 

6. Console Consumer로 Topic에서 메시지 읽기

1. 새로운 터미널 실행

2. 카프카 폴더로 이동

3. Topic에서 메시지 받는 Consumer 실행

$ ./bin/windows/kafka-console-consumer.bat --topic topic2 --from-beginning --bootstrap-server localhost:9092,localhost:9093,localhost:9094
  • --bootstrap-server : 프로듀서와 마찬가지로 세 개의 브로커를 전부 지정한다

4. from-beginning 옵션을 사용했으므로, 컨슈머를 실행시키 전 프로듀서가 발행한 메시지까지 전부 읽어온다.

5. 프로듀서 터미널에서 추가로 메시지를 입력하면 컨슈머 터미널에 읽어온 메시지가 표시된다.

 

7. 장애 상황 시 서비스 동작 확인

1. 새로운 터미널 실행

2. 장애 상황 만들기 : Broker#2 Shutdown

  • Broker#2가 실행중인 터미널을 찾아 종료 시킨다(Ctrl + C)

3. Consumer에 Warning Message 확인 (→ Windows 환경에선 Warning Message 가 안나오는듯..)

  • Connection to node 2 (localhost/127.0.0.1:9094) could not be established. Broker may not be avaliable.
    → Broker#2 가 장애 상황인 것 같다고 알림

4. 토픽 상태 확인

$ ./bin/windows/kafka-topics.sh --describe --topic topic2 --bootstrap-server localhost:9092

  • Partition 1번의 Leader는 원래 2번 Broker였다. 하지만 Leader: 0에서 알 수 있듯이 0번 브로커로 리더가 변경됨.
  • ISR도 2번이 없어짐

5. Producer로 메시지를 발행 해보면 브로커 1개가 장애인 상황에서도 Consumer가 정상적으로 메시지를 수신하는 것을 볼 수 있음

6. 장애상황 해소 : Broker#2 재실행

$ bin/kafka-server-start.sh config/server2.properties&

 

7. 토픽 상태 재확인

$ ./bin/windows/kafka-topics.sh --describe --topic topic2 --bootstrap-server localhost:9092
  • 파티션 1번의 리더는 그대로 0번 브로커이지만, ISR에는 2번 브로커가 다시 추가되었음

8. Producer로 메시지를 재발행 한다

9. 토픽 상태 재확인

$ ./bin/windows/kafka-topics.sh --describe --topic topic2 --bootstrap-server localhost:9092
  • 파티션 1번의 리더 브로커가 2번으로 변경된다. Zookeeper가 파티션 리더를 각 브로커에 고르게 분산시키기 때문이다.