Data Engineering

ELK Stack으로 Nginx 로그 수집하기

이번 글에서는 ELK Stack을 활용해서 애플리케이션의 Nginx 로그를 수집해보는 프로젝트를 실습해보려고 합니다. ELK Stack ElasticSearch(es)는 Elastic Stack의 핵심인 분산 검색, 분석 엔진입니다. 고성능에 스키마 없는 JSON 기반 document로 다양한 데이터에 대한 검색과 분석에 용이합니다. Logstash는 데이터를 수집, 집계하고 원하는 곳에 전송할 수 있도록 하는 도구입니다. 특히 es에 데이터를 로드할 때 편리하고 우수한 성능의 인덱싱을 가능하게 하여 es를 사용한다면 Logstash를 동시에 사용하는 것이 보편적입니다. Kibana는 데이터 시각화 및 탐색 도구입니다. 이 역시 es에 저장된 데이터를 시각화할 때 기본적으로 많이 사용되고 있습니다. 결국..

2024.03.15 게시됨

Data Engineering

Kafka Leader Election에 대한 정리

최근 Confluent에서 업로드한 카프카의 파티션 리더 선출과 관련한 1시간 남짓한 영상을 보게 되었습니다. Using Kafka-Leader-Election to Improve Scalability and Performance 꽤 유익한 내용이었던 것 같아 이번 글에서는 영상의 내용을 요약 정리해보고 다른 레퍼런스를 참고해 공부해 본 내용을 정리해보려고 합니다. (아래에서 설명하는 내용 중 리더 파티션과 브로커를 혼용해서 사용했는데, 리더 브로커가 좀 더 적합한 표현이지만 개별 파티션 관점에서 설명하기 위해 리더 파티션이란 용어를 썼습니다.) 글을 읽기 전에 여기 Stackoverflow 질문을 참고해보면 도움이 될 것 같습니다. 1. Kafka Partition Leader? Partition Le..

2023.11.23 게시됨

Data Engineering

Kafka Consumer의 close(), wakeup() 메서드 들여다보기

0. 카프카 컨슈머의 동작 카프카 컨슈머의 기본적인 동작은 아래 그림과 같이 이루어집니다. 새 컨슈머에서 처음 poll() 메서드를 호출하면 컨슈머는 GroupCoordinator를 찾아서 컨슈머 그룹에 참여(join)하고 파티션을 할당받습니다. 그 이후에는 LinkedQueue 안에 저장된 메시지들이 있다면 해당 메시지들을 가져와서 처리하고, LinkedQueue에 메시지가 없다면 poll() 메서드 안에 정의된 Duration 만큼을 기다리게 됩니다. @Override public ConsumerRecords poll(final Duration timeout) { return poll(time.timer(timeout), true); } 그동안 ConsumerNetworkClient 쓰레드는 브로커로..

2023.07.13 게시됨

Data Engineering

Kafka Producer Message Batching과 몇 가지 성능 튜닝 옵션들

이번 시간에는 카프카 프로듀서의 기본적인 구조와 레코드의 배치(Batch) 전송에 대해 소개합니다. 그리고 레코드의 배치 전송을 통해 얻을 수 있는 이득과 고려해야 할 점, 그리고 이와 관련된 성능 튜닝을 할 수 있는 몇 가지 옵션에 대해 이야기해보겠습니다. 1. Kafka Producer, Record Accumulator 먼저 카프카 프로듀서가 메시지를 전송하는 방식에 대해 간략히 짚어보겠습니다. 기본적으로 카프카 프로듀서는 아래 그림과 같은 구조를 바탕으로 메시지를 전송합니다. 크게 Producer → Serializer → Partitioner → RecordAccumulator → Sender Thread → Broker 의 흐름을 따르는데요. 조금 더 구체적인 이해를 위해 메시지 전송 순서에 ..

2023.07.01 게시됨

Data Engineering

Kafka Consumer, ConsumerGroup 그리고 Rebalancing

이번 글에서는 Kafka에서 중요한 개념 중에 하나인 Consumer Rebalancing에 대해 실습하는 시간을 가져보려고 합니다. 테스트 환경은 AWS Ubuntu EC2에 Kafka Confluent를 설치하고 진행합니다. 실습 환경은 OS나 Kafka / Kafka Confluent에 크게 영향을 받지는 않으니, 카프카가 설치된 각자의 개발 환경에서 실습할 수 있습니다. # 테스트 환경 정보 ubuntu@sunghyeon:~$ hostnamectl Static hostname: sunghyeon Icon name: computer-vm Chassis: vm Machine ID: 3cf5524f3ebb4baba881e9800cd651bc Boot ID: db655d7ad94b4524ae71f3283..

2023.06.11 게시됨

Data Engineering

자주 사용하는 Kafka CLI 정리하기

이번 글에서는 꽤 자주 사용하는데 매 번 찾아봤던 카프카 CLI를 정리해보겠습니다. 모든 명령어는 kafka > bin 경로 안에서 수행되고, SASL 등 인증이 필요한 경우 --command-config 을 명령어에 붙여서 수행합니다. 1. Topic 관련 - Topic 목록 확인 $ ./kafka-topics.sh --bootstrap-server {server-address} --list - 개별 Topic 정보 확인 $ ./kafka-topics.sh --describe --bootstrap-server {server-address} --topic {topic-name} - Topic 생성 $ ./kafka-topics.sh --bootstrap-server {server-address} --re..

2023.02.24 게시됨

Data Engineering

Kafka offset reset을 통한 이벤트 Consuming

0. Kafka Offset 카프카의 가장 큰 구성 요소는 프로듀서(Producer)와 컨슈머(Consumer)입니다. 프로듀서가 토픽에 메시지를 송신하면 토픽은 파티션들에 메시지를 복제하고, 컨슈머는 각 파티션에서 아직 처리하지 않은 메시지를 가져와 소비(Consume)합니다. 이 때, 컨슈머는 자신이 처리한 메시지와 아직 처리하지 않은 메시지를 구분하기 위해 Offset 정보를 사용하는데요. 위 그림에서 하나의 토픽에는 여러 개의 파티션이 존재하며, 컨슈머는 각 파티션에 대해 자신이 처리한 메시지의 위치를 Offset으로 기록합니다. 즉, 파티션 1~5의 Offset은 5, 4, 3, 2, 4가 되겠죠. 그런데 만약 아래와 같은 상황처럼 컨슈머가 자신이 이미 처리한 메시지를 다시 처리해야 하는 상황이..

2023.02.01 게시됨

Data Engineering

파이썬 스크립트로 Kafka Partition Reassign 자동화하기(Kafka URP 대응기)

1. 배경 팀에서 운영하고 있는 서비스들은 카프카를 통해 비동기 이벤트들을 처리하고 있습니다. 그런데 해당 카프카들을 담당하는 Ceph 분산형 스토리지의 불안정성으로 인해 가끔씩 몇 가지 토픽에 대한 파티션들이 복제를 제대로 수행하지 못하는 이슈가 간헐적으로 발생했고, 특히 어느 시점에는 이러한 복제 장애가 지속되어 일일이 누군가 카프카 매니저에서 직접 파티션을 재할당해주는 방식으로 대응해야만 했습니다. 이 과정은 사람이 수동으로 대응해야 한다는 불편함 + 새벽 시간에 장애가 발생하면 대응 자체가 까다롭다는 문제가 있었습니다. 그래서 수동으로 파티션을 재할당해주는 과정 자체를 스크립트화하여 자동으로 URP 장애를 대응할 수 있게 했던 경험을 기록해보려고 합니다. 2. URP URP(Under Replic..

2022.12.14 게시됨

Data Engineering

Docker를 활용한 카프카(Kafka) Cluster 환경 구축

이번 포스팅에서는 Docker 환경에서 Producer, Broker, Consumer가 동작하는 Kafka 환경을 구축해보겠습니다. 클러스터 구축은 단일 브로커로 동작하는 환경과 여러 개의 Kafka 클러스터가 동작하는 환경을 각각 살펴보겠습니다. 먼저 본격적인 실습에 앞서 Kafka 환경을 이해하는 데 필요한 몇 가지 개념을 짚어보겠습니다. 1. Kafka Concepts Kafka는 이벤트 스트리밍을 분산 처리하는 툴로써 이벤트(메시지)를 생산하는 Producer와 이를 처리하는 Consumer사이에서 동작합니다. 이전에는 Producer - Consumer 사이에서 메시지가 직접적으로 왔다갔다 하는 환경이었다면, 이제는 Kafka가 그 사이의 결합도를 낮춰줌으로써 복잡한 애플리케이션 환경을 보다 ..

2022.09.26 게시됨