Kafka(카프카) Partition(파티션)의 개념 및 동작 원리를 알아보자
📌 서론
이번 포스트에서는 Kafka의 핵심 구성 요소 중 하나인 '파티션'에 대해 집중적으로 살펴볼 예정이다. 파티션은 Kafka에서 데이터를 효율적으로 처리하는 데 필수적인 역할을 한다. 각각의 파티션은 독립적인 데이터 스트림을 형성하며, 이를 통해 메시지가 병렬로 처리될 수 있다. 이러한 병렬 처리는 Kafka의 성능을 극대화하는 핵심 요인이다. 이번 포스트에서는 파티션의 기본 개념부터 시작하여, 파티션의 복제, 순서 보장과 같은 고급 개념까지 깊이 있게 다룰 예정이다.
로컬 kafka 설정은 다음 포스트를 보고 하면 된다!
1. Kafka의 Partition: 개념 및 작동 원리
Kafka에서 파티션의 역할
- Apache Kafka에서 파티션(partition)은 데이터 처리를 효율적으로 하기 위한 핵심 요소다. 파티션은 큐를 나눠서 병렬 처리를 가능하게 하는 기본 단위이며, Kafka의 각 토픽(topic)은 하나 이상의 파티션으로 나눠져 있다. 이를 통해 메시지가 병렬로 처리될 수 있게 된다.
- 파티션은 순서를 보장하는 로그 구조를 가지고 있다. 이 구조 덕분에 각 메시지는 파티션 내에서 고유한 오프셋(offset) 값을 가지게 되고, 이 오프셋을 통해 메시지의 위치를 정확하게 식별할 수 있다.
📌 순서를 보장하는 로그 구조란?
Kafka의 파티션은 기본적으로 로그 파일처럼 작동한다. 이 로그 구조에서 각 메시지는 순차적으로 저장되며, 각 메시지에는 고유한 오프셋 값이 할당된다. 이 오프셋은 메시지의 위치를 나타내며, Kafka 시스템 내에서 메시지를 정확히 식별하는 데 사용된다. Kafka 파티션의 로그 구조를 좀 더 이해하기 쉽게 설명하기 위해 아래와 같이 예시를 들어볼 수 있다.
파티션 로그의 구조 이해하기
- 오프셋 0부터 시작: Kafka에서는 파티션의 각 메시지에 0부터 시작하는 순차적인 오프셋 번호를 할당한다.
- 메시지 추가 시 오프셋 증가: 새 메시지가 파티션에 추가될 때마다, 그 메시지에는 마지막 메시지의 오프셋에 1을 더한 값이 할당된다. 예를 들어, 'Message A' 다음에 'Message B'가 저장되면, 'Message B'에는 오프셋 1이 할당된다.
- 순서 보장: 이 로그 구조 덕분에 파티션 내의 메시지는 항상 순차적으로 저장되며, 각 메시지의 순서는 그 오프셋 값으로 보장된다.
| Offset | Message |
|--------|-------------|
| 0 | Message A |
| 1 | Message B |
| 2 | Message C |
| 3 | Message D |
| 4 | Message E |
📌 잠깐! 순서 보장이 왜 중요한가요?
메시지의 순서가 보장되므로, 컨슈머는 데이터를 정확한 순서대로 처리할 수 있다. 이는 시계열 데이터, 트랜잭션 기록 등 순서가 중요한 데이터의 처리에 매우 중요하다. 또한 특정 메시지에 문제가 발생했을 때, 그 메시지의 오프셋을 통해 정확하게 위치를 식별하고 문제를 분석할 수 있다.
파티션의 장점 파악하기
- 병렬 처리: 다양한 컨슈머(consumer)가 서로 다른 파티션에서 데이터를 동시에 읽을 수 있다. 이는 처리 속도를 크게 향상시킨다.
- 순서 보장: 하나의 파티션 내에서는 메시지의 순서가 보장되어, 순차적인 데이터 처리가 필요할 때 유용하다.
- 확장성: 파티션을 여러 노드에 분산시켜 저장할 수 있어서, 시스템의 확장성을 높일 수 있다.
2. 파티션 복제를 통한 Kafka의 고가용성 메커니즘
Kafka의 파티션 복제 개념과 ISR
- Kafka 클러스터는 여러 브로커(Broker)로 구성되어 있다. 이 클러스터 내에서, 각 파티션은 하나 이상의 브로커에 복제된다.
- 예를 들어, 하나의 토픽에 대한 파티션 1이 Broker 1에 주 저장소로 있으면, 이 파티션의 복제본은 Broker 2와 Broker 3에도 존재할 수 있다. 이는 파티션의 데이터가 클러스터 내 여러 브로커에 분산되어 저장되어 있음을 의미한다.
📌 잠깐! 파티션 복제와 브로커 내부 복제의 차이
Kafka 파티션 복제는 클러스터 내의 다른 브로커들 사이에서 이루어지는 복제를 말한다. 각 브로커는 네트워크를 통해 서로 소통하며, 파티션의 데이터를 복제하고 동기화한다. 반면에, 브로커 내부에서 발생하는 복제는 Kafka의 표준 작동 방식이 아니다. Kafka에서는 각 파티션의 복제본을 서로 다른 브로커에 분산하여 저장해야 한다.
결론적으로, Kafka의 고가용성은 클러스터 내의 여러 브로커 간에 파티션 데이터를 복제함으로써 이루어지며, 이는 브로커 내부에서 이루어지는 복제와는 다른 개념이다.
리더와 팔로워
- 리더(Leader): 각 파티션에는 한 개의 리더가 존재하며, 모든 읽기와 쓰기 연산은 이 리더를 통해 이루어진다.
- 팔로워(Follower): 리더를 제외한 나머지 복제본은 팔로워로, 이들은 리더의 데이터를 복제하여 시스템의 가용성을 높인다. 만약 리더에 장애가 발생했을 때 새로운 리더로 승격될 수 있다.
데이터 손실 방지 및 서비스 연속성
- 만약 한 브로커가 실패하면, 다른 브로커에서 해당 파티션의 복제본을 사용하여 데이터 손실을 방지하고 서비스 연속성을 유지한다.
ISR(In-Sync Replicas)
- ISR은 리더와 동기화된 상태인 팔로워의 집합을 의미한다. 이는 리더에 장애가 발생했을 때, 새로운 리더로 승격될 수 있는 팔로워들의 그룹이다.
- 동기화 상태 유지: ISR 내의 팔로워들은 리더와 동일한 데이터 상태를 유지한다. 이것은 Kafka 시스템 내에서 데이터의 일관성을 보장하는 데 핵심적인 역할을 한다.
- 리더 장애 시 새 리더 선출: 리더에 문제가 발생하면, ISR에 속한 팔로워 중 하나가 새로운 리더로 승격될 수 있다. 이는 데이터의 무손실과 서비스의 연속성을 보장한다.
- Kafka에서의 ISR은 리더-팔로워 아키텍처의 중요한 부분으로, 클러스터의 높은 가용성과 데이터 일관성을 유지하는 데 필수적이다. ISR 내의 팔로워들은 리더의 정확한 복제본을 유지하며, 필요한 경우 새로운 리더로의 전환을 가능하게 한다.
3. Kafka 파티션의 분산 구조
분산 저장
- Kafka에서는 하나의 토픽이 여러 파티션으로 나뉘어 저장된다. 이 파티션들은 클러스터 내의 서로 다른 브로커들에 분산되어 저장될 수 있다. 예를 들어, 'Topic 1'이라는 토픽이 있을 때, 이 토픽의 'Partition 1'은 'Broker 1'에, 'Partition 2'는 'Broker 2'에 저장될 수 있다.
병렬 처리의 향상
- 각 브로커가 다른 파티션을 관리함으로써, 여러 컨슈머가 동시에 다른 브로커의 파티션에서 데이터를 읽거나 쓸 수 있다. 이는 전체 시스템의 쓰기/읽기 성능을 향상시킨다.
- 예를 들어, 'Consumer A'는 'Broker 1'의 'Partition 1'에서 데이터를 읽고, 동시에 'Consumer B'는 'Broker 2'의 'Partition 2'에서 데이터를 읽을 수 있다.
📌 결론
이러한 분산 처리 방식은 Kafka 클러스터가 더 많은 데이터를 더 빠르게 처리할 수 있게 만든다. 각 브로커는 자신의 파티션에서 독립적으로 작업을 수행하기 때문에, 전체 시스템의 부하가 분산되고 처리 능력이 증가한다.
4. 파티션 내 순서 보장 매커니즘 이해하기
Kafka 파티션 내 메시지 순서 보장 예시
- Kafka에서 각 파티션은 독립적인 메시지 스트림을 유지한다. 이 스트림 내에서 메시지는 추가되는 순서대로 정렬된다. 아래는 이 개념을 구체화한 예시다. Kafka 클러스터에는 여러 브로커가 있으며, 각 브로커는 하나 이상의 파티션을 관리한다고 가정한다.
메시지 순서 처리
- Partition 1에는 다음과 같은 메시지들이 순서대로 도착한다: Msg1, Msg2, Msg3, Msg4, Msg5, Msg6. 그리고 Partition 2에도 독립적으로 메시지가 도착한다: Msg1, Msg2, Msg3, Msg4, Msg5, Msg6.
순서 보장
Partition 1에서의 메시지 순서는 다음과 같이 보장된다.
- Msg1 -> Msg2 -> Msg3 -> Msg4 -> Msg5 -> Msg6
Partition 2에서도 동일한 순서로 메시지가 저장되고 처리된다.
- Msg1 -> Msg2 -> Msg3 -> Msg4 -> Msg5 -> Msg6
- 이 예시에서, 각 파티션은 메시지가 도착하는 순서대로 저장하고, 이 순서대로 메시지를 처리한다. 이는 Kafka가 시계열 데이터나 순서가 중요한 로그 데이터를 처리하는 데 적합하다는 것을 의미한다. 예를 들어, 'Msg1'이 거래의 시작을 나타내고, 'Msg6'이 거래의 종료를 나타낸다고 할 때, Kafka는 이러한 이벤트들을 정확한 순서대로 처리하고 저장할 수 있다.
📌 잠깐! 그럼 만약 메시지가 비순차적으로 도착했을 때는 어떻게 될까?
이번에는 메시지가 비순차적으로 프로듀서에 의해 Kafka 파티션에 보내진다고 가정해 보자. 예를 들어, 순서대로 'Msg1', 'Msg2', 'Msg3'가 아닌 'Msg2', 'Msg5', 'Msg1' 순으로 메시지가 발송된다.
Kafka 파티션의 동작
Kafka는 메시지를 받은 순서대로 파티션에 저장한다. 따라서, 파티션 내의 메시지 순서는 다음과 같이 된다.
- [Msg2 -> Msg5 -> Msg1]
Kafka는 이 메시지들을 저장된 순서대로 처리한다.
즉, 'Msg2'가 먼저 처리되고, 그다음 'Msg5', 그다음으로 'Msg1'이 처리된다. 이렇게 처리가 된 결과는 다음과 같다.
- [Msg2 -> Msg5 -> Msg1 -> Msg4 -> Msg5 -> Msg6]
순서 보장의 의미
- Kafka에서 "순서 보장"이란 메시지가 파티션에 저장된 순서대로 처리된다는 것을 의미한다. 이는 프로듀서가 메시지를 보낸 순서가 중요함을 의미한다. 만약 메시지가 비순차적으로 보내진다면, 그 순서대로 Kafka가 처리하게 된다.
- 따라서, 프로듀서 측에서 메시지 발송 순서를 관리하는 것이 중요하다. 특히 시계열 데이터나 트랜잭션 순서가 중요한 경우, 올바른 순서로 메시지를 보내야 한다.
📌 결론
Kafka의 파티션에서 메시지 순서 보장은 메시지가 저장된 순서대로 처리된다는 것을 의미한다. 프로듀서가 메시지를 보낸 순서가 파티션 내에서의 처리 순서를 결정한다. 따라서, 메시지가 비순차적으로 보내진 경우, Kafka는 그 순서대로 메시지를 저장하고 처리한다.
5. Kafka 파티션의 주의점
1. 키 선택의 중요성
- 프로듀서가 데이터를 파티션에 할당할 때 사용하는 키의 선택은 중요하다. 잘못된 키 선택은 데이터 분산의 불균형을 초래하고, 특정 브로커에 부하를 집중시킬 수 있다. 해결방법은 키의 해시 분포가 균일하도록 키 선택 전략을 명확하게 정의하는 것이다.
📌 잠깐! Kafka는 왜 키를 잘 선택해야 하나요?
Kafka에서 키 선택의 중요성을 이해하기 위해서는 Kafka가 데이터를 어떻게 분산 저장하는지 이해해야 한다. Kafka는 키를 기반으로 메시지를 파티션에 할당한다. 이 과정에서 키의 해시값을 사용하여 각 메시지가 어느 파티션에 저장될지 결정한다. 적절한 키 선택은 데이터가 클러스터의 모든 파티션에 균등하게 분산되도록 한다.
Kafka 키 및 파티션 분산 시나리오
#!/bin/bash
# Kafka Key and Partition Distribution Scenario
echo "Kafka Key and Partition Distribution Scenario"
echo "------------------------------------------------"
# 균형 잡힌 분산
echo "Balanced Distribution:"
echo "| Broker 1 | Broker 2 | Broker 3 |"
echo "|---------------|----------------|---------------|"
echo "| Partition 1 | Partition 2 | Partition 3 |"
echo "| Key1, Key4 | Key2, Key5 | Key3, Key6 |"
echo "------------------------------------------------"
# 불균형한 분산
echo "Imbalanced Distribution:"
echo "| Broker 1 | Broker 2 | Broker 3 |"
echo "|-------------------|----------------|-----------|"
echo "| Partition 1, 2 | Partition 3 | |"
echo "| Key1, Key2, Key3 | Key4, Key5 | Key6 |"
echo "------------------------------------------------"
균형 잡힌 분산
- Kafka 클러스터에서, 각 브로커는 하나 이상의 파티션을 관리한다. 이때, 각 파티션에 할당되는 키의 분산이 중요하다. 각 브로커가 관리하는 파티션에 키들이 고르게 할당된다. 이는 키의 해시값이 파티션 간에 균등하게 분포되어 있다는 것을 의미한다.
예시상황 설명
- Broker 1의 Partition 1에는 Key1과 Key4가 할당된다.
- Broker 2의 Partition 2에는 Key2와 Key5가 할당된다.
- Broker 3의 Partition 3에는 Key3과 Key6이 할당된다.
- 이렇게 하면 각 파티션에 데이터가 균등하게 분산되어 전체 클러스터의 부하가 균형을 이룬다. 결론적으로 클러스터의 모든 브로커가 효율적으로 활용되며, 시스템의 전체적인 성능과 안정성이 향상된다.
불균형한 분산
- Kafka에서 특정 파티션에 키들이 집중되는 경우, 불균형한 분산이 발생한다. 특정 파티션에 키들이 과도하게 집중되어, 다른 파티션은 충분히 활용되지 않아 성능에 문제가 생긴다.
예시상황 설명
- Broker 1이 Partition 1과 Partition 2를 관리하며 Key1, Key2, Key3를 할당받는다.
- Broker 2는 Partition 3만 관리하며 Key4, Key5를 할당받는다.
- Broker 3에는 Key6 만 할당되거나 아예 키가 없을 수 있다.
- 이 경우, Broker 1에 과부하가 걸리고 Broker 2와 Broker 3는 충분히 활용되지 않는다. 결과적으로 클러스터의 전체적인 효율성이 떨어지며, 특정 브로커에 부하가 집중되어 시스템의 안정성에 문제가 발생할 수 있다.
📌 결론
Kafka에서 키 선택은 클러스터의 전체적인 성능과 안정성에 중대한 영향을 미친다. 균형 잡힌 키 분산은 각 파티션과 브로커의 효율적인 활용을 보장하고, 불균형한 분산은 클러스터의 성능 저하와 안정성 문제를 야기할 수 있다. 따라서, Kafka를 사용할 때는 키 분산 전략을 신중하게 고려해야 한다.
2. 컨슈머 그룹 관리
- 하나의 컨슈머 그룹 내에서 컨슈머의 수는 파티션 수를 초과할 수 없다. 이를 초과하면 일부 컨슈머는 데이터를 처리하지 못해 리소스가 비효율적으로 사용될 수 있다. 이를 방지하기 위해 파티션 수와 컨슈머 수를 균형 있게 맞추는 것이 중요하다.
3. 파티션 재배치의 복잡성
- 파티션 수를 늘리는 것은 쉽지만, 줄이는 것은 복잡하고 위험할 수 있다. 따라서 초기 설계 단계에서 파티션 수를 신중하게 결정하는 것이 중요하다. 초기에 보수적으로 파티션 수를 설정하고, 시스템이 성장함에 따라 필요에 따라 조정하는 것이 좋은 접근 방법이다.
카프카 프로듀서와 컨슈머의 동작을 이해해 보자👇🏻👇🏻
'유용한 개발지식 > Apache Kafka' 카테고리의 다른 글
Kafka(카프카)의 고가용성 및 대규모 데이터 처리방법 (5) | 2023.12.27 |
---|---|
Kafka(카프카) Producer(프로듀서)와 Consumer(컨슈머)의 동작 원리와 고가용성 (1) | 2023.12.27 |
Kafka(카프카) 클러스터와 브로커의 동작 이해하기 (1) | 2023.12.27 |
Kafka(카프카)의 기본 구조 이해하기 (클러스터, 브로커, 토픽, 파티션, 세그먼트) (1) | 2023.12.27 |
Kafka(카프카)란 무엇인가 (2) | 2023.12.27 |