[Kafka] 시작
Kafka
큰 인프라의 개발환경을 경험하는 개발자가 아니지만, 어찌저찌 Kafka를 구축하는 Project를 경험
하였다.
자료와 정보를 얻기가 정말 힘들었고 혼란도 많았지만.. 나름대로 내용을 간단히 정리
해 보았다.
1. Kafka 소개
1-1. 개요
- LinkedIn 개발자들이 만들었다.
고가용성
,확장성
,고성능
,분산 데이터 스트리밍 플랫폼
- ※ 고가용성(高可用性, HA, High Availability): 시스템이 상당히 오랜 기간 동안 지속적으로 정상 운영이 가능한 성질 (Wiki)
- ※ 확장성(Scale-Out): 장비를 추가해서 확장하여 성능을 향상시키는 방식
Loosely Coupled
,FileSystem
- 구독-발행 모델의 메세지 큐 (Pub-Sub Model Message Queue)
1-2. 요약
- [Producer] ==> (Zookeeper:[Kafka-Sever],[Kafka-Sever]...) ==> [Consumer]
Zookeeper
: '분산 코디네이션 서비스'를 제공하는 오픈소스 프로젝트로서, Kafka는 Zookeeper로 클러스터를 구성한다. 단일 구성시에도 필수.Broker
: Topic(주제) 단위로Message
들을 관리합니다.Topic
(주제): 1개 이상으로 구성된Partition
에 분산되어 Message가 저장되게 하는 논리 단위.Producer
: 특정 Topic에 Message들을Publish
(발행)한다. Message는 각 Partition에 나뉘어 저장된다.Consumer
: Topic을 Message들을Subscribe
(구독)한다. 성공적으로 읽어갈 때마다 Partition 내의Offset
(위치)를 Commit한다. 다시 Topic에 접근할 때는 해당 Offset 정보를 통해 이어서 읽어 갈 수 있다.Consumer Group
: 1개의 Topic에 대응하는 Consumer가 Publish 속도 등에 균형을 맞추기 위해Consumer 확장
기능.Rebalance
: Consumer Group에 Consumer가 추가/삭제될 때, 소유권 이동이 발생하는 현상
Replication
: 장애에 대비하여데이터 유실을 방지
, 지속적인 서비스를 제공하기 위해 구성- Topic 단위로
Replication Factor
를 지정한다. 지정한 수 만큼 Broker에 복제한다. - 내부적으로는 Partition 별로 복제한다.
ISR
(In Sync Replica): Replication Group을 의미. 1개의 Leader와 여러개의 Follower로 구성한다.Leader
:- Leader를 통해서만 읽기/쓰기 작업이 진행된다. 장애가 발생되어도 정상인 Broker가 있다면, 새로운 Leader Broker가 선출된다.
- Leader는 주기적으로 Follower를 감시하고, 일정시간 동안 반응이 없다면 ISR 그룹에서 추방한다.
Follower
:- Leader의 data를 그대로 복제한다.
- Leader의 data와 같은 형상을 유지하기 위해 짧은 주기로 동기화합니다.
- Topic 단위로
2. Kafka 환경
2-1. 필수
- OS:
Linux
/ Windows - JDK:
Kafka 버전별 호환되는 JDK 버전을 확인!
- 대체로
Java8
이 일반적. (2021년 4월 기준) - 2.0.0 부터는 Java7 중단.
- 2.1.0 부터는 Java11 지원.
- ※ Confluent Platform을 사용자 참조: https://docs.confluent.io/platform/current/installation/versions-interoperability.html
- 대체로
2-2. 필요성
Kafka 사용전, 먼저 어떤 Data(Message)를 취급할 것인가를 확인!
- A) 단순 Log Data인가?
- Log성 누적 정보인가?
- B) 식별 Data인가?
- 날짜 Data가 포함된 Message인가?
- 순차적 숫자 Data가 포함된 Message인가?
- C) 변경사항 Data인가?
- 변경 Data가 포함된 Message인가?
2-3. 제품
Web상에서 정보검색시, 혼란스럽지 않도록 알아야 할 몇몇 솔루션 알기.
'Apache Kafka'와 'Confluent Platform으로 구성된 Kafka'의 구성과 설정이 조금은 상이할 수 있기에 유의해야 한다.
2-3-1. Apache Kafka
OpenSource로 개발되고 있다.
- | - |
---|---|
URL | http://kafka.apache.org/ |
Download | https://kafka.apache.org/downloads |
License | APACHE LICENSE, VERSION 2.0 |
Quick Start | local |
2-3-2. Confluent Platform
Apache Kafka를 활용하여, Confluent 사에서 다양한 기능과 솔루션을 제공
하고 있다.
무료 Community License
로도 여러 Connector와 편리한 도구를 제공하고 있다.
- ※ 종류
- Develop License: 클러스터 당 1개의 Broker만 사용하는 전제로 플랫폼의 모든 기능을 사용 가능.
- Trial License: 30일 체험판 기간동안 모든 기능을 사용 가능.
- Enterprise License: 모든 기능 사용 가능.
- Community License: 내장된 Connector와 Confluent Hub의 몇몇 Connector,
REST Proxy
,ksqlDB
,Schema Registry
등을 사용 가능.
2-3-3. Debizium
Apache Kafka에 변경사항만 전송할 수 있도록, DB의 CDC기능
을 이용한 Kafka-Connector(Source) 를 제공하고 있다.
(단, Source DB에 대한 관리권한 등이 없거나 CDC 기능을 사용할 수 없다면 적용이 어려울 수 있다.)
- | - |
---|---|
URL | https://debezium.io/ |
Download | https://debezium.io/releases/ |
License | APACHE LICENSE, VERSION 2.0 |
Quick Start | docker |
- ※ 참고
- CDC(Change Data Capture) 오픈 소스 Debezium 쓸까? 말까?: https://www.sosconhistory.net/soscon2019/content/data/session/Day%202_1730_2.pdf
- Streaming data changes in MySQL into ElasticSearch using Debezium, Kafka, and Confluent JDBC Sink Connector: https://medium.com/dana-engineering/streaming-data-changes-in-mysql-into-elasticsearch-using-debezium-kafka-and-confluent-jdbc-sink-8890ad221ccf
3. Kafka 체험
Kafka 팀에서 제공해주는 친절하고 이해하기 쉬운 예제가 있다.
원문 링크와 함께 개인적으로 간결히 재정리
하였다.
- 예제 - Quick Start
- 원문: http://kafka.apache.org/quickstart
- 환경:
Linux
/ WindowsKafka 2.7.0
Java 8
버전 이상9092
Port- 터미널 4개
- 구성:
- bin/zookeeper-server-start.sh:
- bin/kafka-server-start.sh
- bin/kafkac-topic.sh
- bin/kafkac-console-producer.sh
- bin/kafkac-console-consumer.sh
- ※ Windows에서 실행시 bin/{FILE}.sh이 아니라
bin/windows/{FILE}.bat
를 이용한다. - 예) bin/windows/zookeeper-server-start.bat
3-1. Kafka 환경 설치
Download:
Extract
tar -xzf kafka_2.13-2.7.0.tgz
3-2. Kafka 환경 실행
Run
cd kafka_2.13-2.7.0 bin/zookeeper-server-start.sh config/zookeeper.properties bin/kafka-server-start.sh config/server.properties
- ※ zookeeper와의 의존성을 제거하려는 움직임이 있는 듯 하지만 아직은 실행이 필요하다.
3-3. Kafka에 Topic 생성
Create Topic
bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092
Check Topic
bin/kafka-topics.sh --describe --topic quickstart-events --bootstrap-server localhost:9092
3-4. console-producer와 console-consumer로 data를 Topic에 쓰기/읽기
kafka-console-producer 실행
bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:9092
아무 글이나 입력해 본다.
hello kafka!?
kafka-console-consumer 실행
bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:9092
※
--from-beginning
옵션으로 topic에 기존에 입력되었던 data를 실행과 함께 출력한다.실행과 함께 출력된 Message
hello kafka!?
추가적으로 kafka-console-producer창에 가서 아무 말이나 더 입력해보면, 바로 kafka-console-consumer에 출력되는 것을 볼 수 있다.
3-5. Stop all
다음 순으로 [CTRL
] + [C
]로 종료.
- kafka-console-producer
- kafka-console-consumer
- kafka-server-start
- zookeeper-server-start
3-6. Remove data
FileSystem에 저장된 data까지 지우고 싶다면, 다음 2 경로를 제거한다.
/tmp/kafka-logs
/tmp/zookeeper
예)
rm -rf /tmp/kafka-logs /tmp/zookeeper
※ Windows의 경우 실행한 드라이브의 Root에 생성되어 있다.
C:\\tmp\\kafka-logs
C:\\tmp\\zookeeper
4. Kafka API
Kafka 팀에서 다음 API를 제공해주고 있다.
- INTRODUCTION: http://kafka.apache.org/intro#intro_apis
- API 종류
- Producer API: 여러 topic에 Event Stream을
publish
(쓰기) 처리. - Consumer API: 여러 topic을
subscribe
(읽기)하고 produce된 Event Stream을 처리. - Streams API: transformations(변환), aggregations(집계) 및 joins(병합), windowing, 이벤트 시간 기반 처리 등.. Event Stream을 처리하는
higher-level functions
을 제공. - Connect API: 외부시스템/애플리케이션에서 Event Stream을 읽기/쓰기, Data 가져오기/내보내기. 그러나 Kafka 커뮤니티에서
이미 즉시 사용할 수있는 수백 개의 커넥터를 제공
중.. - Admin API: Topic, Broker 및 Kafka객체를
관리
/검사
.
- Producer API: 여러 topic에 Event Stream을
5. Reference
- CDC(Change Data Capture) 오픈 소스 Debezium 쓸까? 말까?: https://www.sosconhistory.net/soscon2019/content/data/session/Day%202_1730_2.pdf
- Streaming data changes in MySQL into ElasticSearch using Debezium, Kafka, and Confluent JDBC Sink Connector: https://medium.com/dana-engineering/streaming-data-changes-in-mysql-into-elasticsearch-using-debezium-kafka-and-confluent-jdbc-sink-8890ad221ccf
- [Kafka] #1 - 아파치 카프카(Apache Kafka)란 무엇인가?: https://soft.plusblog.co.kr/3
- [Kafka] #2 - 아파치 카프카(Apache Kafka) 설치 및 실행, Quickstart: https://soft.plusblog.co.kr/4
- APACHE KAFKA QUICKSTART: http://kafka.apache.org/quickstart
- Supported Versions and Interoperability: https://docs.confluent.io/platform/current/installation/versions-interoperability.html
- 내부 데이터 파이프라인에 Kafka Streams 적용하기: https://engineering.linecorp.com/ko/blog/applying-kafka-streams-for-internal-message-delivery-pipeline/
- [Kafka 101] 카프카 메시지와 토픽과 파티션 (Kafka Message, Topic and Partition): https://always-kimkim.tistory.com/entry/kafka101-message-topic-partition
- kafka 설정을 사용한 문제해결: https://saramin.github.io/2019-09-17-kafka/
- [번역] 카프카 컨슈머 소개: 새 아파치 카프카 0.9 컨슈머 클라이언트 시작하기: https://free-strings.blogspot.com/2016/05/09.html
- [카프카(Kafka) 어플리케이션 제작 ] #2. 컨슈머: https://team-platform.tistory.com/37
- Kafka 이해하기 - 카프카의 구성요소, 동작원리, Exactly-delivery-once 모델 차용: https://medium.com/@umanking/%EC%B9%B4%ED%94%84%EC%B9%B4%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%9D%B4%EC%95%BC%EA%B8%B0-%ED%95%98%EA%B8%B0%EC%A0%84%EC%97%90-%EB%A8%BC%EC%A0%80-data%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%9D%B4%EC%95%BC%EA%B8%B0%ED%95%B4%EB%B3%B4%EC%9E%90-d2e3ca2f3c2
- Kafka Replication (복제): https://goodgid.github.io/Kafka-Replication/
- [Kafka] Zookeeper: 분산 애플리케이션을 관리하는 코디네이션 시스템: https://ooeunz.tistory.com/113
- [kafka][용어정리] ISR : In Sync Replica: https://log-laboratory.tistory.com/234?category=1109284