일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 오버로딩
- 하이브리드접근법
- 캐시의 작동 원리
- 스프링시큐리티
- jwt토큰
- n8n
- 엘라스틱서치
- 자바
- 헥사고날아키텍처
- XSS
- 한화시스템부트캠프
- 프로토콜역할
- Kafka
- JPA
- springboot
- selenium
- Java
- 메소드
- N+1문제
- STOMP
- 부트캠프
- nplus1
- 프로세스와스레드의차이
- 오블완
- 자동화워크플로우
- 티스토리챌린지
- kafka배포
- QA
- 테스트케이스
- 자료구조
- Today
- Total
아쿠의 개발 일지
[DevOps] Kubernetes로 채팅을 위한 Kafka와 Zookeeper 배포하기 본문
다음 사진은 채팅 기능에 Kafka 기술을 적용한 것입니다.
Kafka를 도입한 이유로는,
확장성 및 신뢰성: STOMP 기반의 세션 관리는 단일 서버 환경에서는 한계가 있었습니다.
다중 서버 환경에서 메시지 손실과 확장성 문제를 해결하기 위해 Kafka를 도입하였습니다.
Kafka는 사용자가 다른 서버에 접속해도 메시지를 안정적으로 전달받을 수 있도록 해줍니다.
세션 관리: 여러 서버를 운영하는 환경에서 Kafka를 통해 서버 간 세션을 관리하여, 메시지의 일관성과 신뢰성을 보장하였습니다.
적용 예시로는,
Kafka의 Pub-Sub 모델을 활용하여 동일한 토픽을 구독한 클라이언트들에게 안정적으로 메시지를 전송하고, 여러 서버 간의 세션 관리 문제를 해결하였습니다.
이제 이러한 기능을 K8S에서 배포를 해보려고 합니다.
그 전에, Kafka와 Zookeeper 배포의 필요성에 대해서 알아보도록 하겠습니다.
(1) Kafka 배포 이유
Kafka는 분산 스트리밍 플랫폼으로, 주로 대용량 데이터의 실시간 전송과 처리에 사용됩니다. 기업에서는 실시간 데이터 처리, 로그 수집, 이벤트 처리, 메시징 시스템 등을 위해 Kafka를 사용합니다.
- 메시징 시스템: Kafka는 메시지를 토픽에 게시(publish)하고, 이를 구독(subscribe)하는 시스템을 제공합니다. 이로써 비동기식 메시징을 통해 시스템 간의 데이터 전송을 효율적으로 처리할 수 있습니다.
- 실시간 데이터 처리: 실시간 로그 수집 및 데이터 스트리밍에서 중요한 역할을 합니다.
- 분산 처리: Kafka는 분산 환경에서 수많은 프로듀서와 컨슈머가 데이터를 전송하고 수신하는 데 필요한 기능을 제공합니다. 이를 통해 시스템의 확장성과 내구성을 보장합니다.
- 장애 내성: 여러 브로커에 데이터가 복제되어 장애 발생 시에도 데이터 손실을 방지하고 안정적인 서비스 운영이 가능합니다.
(2) Zookeeper 배포 이유
Zookeeper는 Kafka와 같은 분산 시스템에서 노드 간의 협업과 상태 관리를 담당하는 중앙 집중형 서비스입니다. Kafka는 Zookeeper를 사용하여 클러스터를 관리하고, 브로커들의 상태를 동기화하며, 분산 처리의 일관성을 유지합니다.
- 클러스터 관리: Zookeeper는 Kafka 클러스터의 메타데이터를 관리하고, 각 Kafka 브로커의 상태를 모니터링합니다. 이를 통해 브로커 간의 일관성을 유지할 수 있습니다.
- 리더 선출: Kafka는 Zookeeper를 통해 리더 선출을 수행하여, 데이터의 일관성과 처리 순서를 보장합니다.
- 분산 락 관리: Kafka에서는 데이터를 처리하는 동안 여러 프로세스가 동시에 작업을 수행할 때 충돌을 방지해야 합니다. Zookeeper는 이를 위해 분산 락을 제공합니다.
(3) Kafka와 Zookeeper 배포 방법
1. Zookeeper 배포
apiVersion: apps/v1
kind: Deployment
metadata:
name: zookeeper-deployment
labels:
app: zookeeper
spec:
replicas: 1 # Zookeeper 인스턴스 수
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
spec:
containers:
- name: zookeeper
image: zookeeper:3.8.0
ports:
- containerPort: 2181 # Zookeeper 클라이언트 포트
env:
- name: ALLOW_ANONYMOUS_LOGIN
value: "yes" # 익명 로그인 허용 (기본 설정)
- name: ZOOKEEPER_CLIENT_PORT
value: "2181" # Zookeeper 클라이언트 연결 포트
- name: ZOOKEEPER_SERVER_ID
value: "1" # Zookeeper 서버 ID
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper-service
labels:
app: zookeeper
spec:
ports:
- port: 2181
targetPort: 2181
selector:
app: zookeeper
2. Kafka 배포
apiVersion: apps/v1
kind: Deployment
metadata:
name: kafka-deployment
labels:
app: kafka
spec:
replicas: 1 # Kafka 브로커의 수 (하나의 브로커로 설정)
selector:
matchLabels:
app: kafka
template:
metadata:
labels:
app: kafka
spec:
containers:
- name: kafka
image: confluentinc/cp-kafka:7.4.6
ports:
- containerPort: 9092 # Kafka 브로커 포트
env:
- name: KAFKA_BROKER_ID
value: "1" # Kafka 브로커의 ID
- name: KAFKA_ZOOKEEPER_CONNECT
value: "zookeeper-service:2181" # Zookeeper 서비스와 연결
- name: KAFKA_ADVERTISED_LISTENERS
value: "PLAINTEXT://kafka-service:9092" # Kafka의 광고 주소
- name: KAFKA_LISTENERS
value: "PLAINTEXT://0.0.0.0:9092" # 모든 인터페이스에서 수신 대기
- name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
value: "PLAINTEXT:PLAINTEXT" # 보안 프로토콜 설정
- name: KAFKA_INTER_BROKER_LISTENER_NAME
value: "PLAINTEXT" # 브로커 간 통신에 사용할 리스너 이름
- name: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR
value: "1" # 카프카 토픽 오프셋 복제 계수
- name: KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS
value: "0" # 초기 리밸런스 지연 시간
---
apiVersion: v1
kind: Service
metadata:
name: kafka-service
labels:
app: kafka
spec:
ports:
- port: 9092 # Kafka 브로커가 클라이언트에게 노출될 포트
selector:
app: kafka
배포 후에 정상적으로 두 개가 연결되는지 확인해야 합니다.
Kafka 로그에서 Zookeeper의 연결 상태를 확인하고, 연결 문제가 발생하면 Zookeeper 서비스나 설정을 점검해야 합니다.
또한 Kafka 클러스터가 정상적으로 배포 되었다면, 필요한 토픽을 생성하고 해당 토픽에 데이터가 정상적으로 게시되고 있는지 확인합니다.
잘 실행됐는지 알기 위해 Pod 이벤트를 확인 해 보았습니다.
Kafka와 Zookeeper 배포는 분산 시스템을 구축할 때 매우 중요한 작업입니다.
Kafka는 실시간 메시징, 이벤트 스트리밍, 대규모 데이터 처리 등에 활용되고 있으며, Zookeeper는 이러한 분산 시스템에서 클러스터 관리와 데이터 일관성을 보장하는 역할을 합니다.
다들 확장성과 안정성을 제공하는 중요한 부분을 꼭 챙기시길 바라겠습니다. 감사합니다 !
'Programming > Java' 카테고리의 다른 글
[SpringBoot] 멀티쓰레드 환경에서의 동시성 제어 (Synchronized vs Lock vs Atomic) (0) | 2025.02.10 |
---|---|
[SpringBoot] S3 파일 업로드와 최적화 방법 (1) | 2025.01.31 |
[N8N] AI와 N8N (0) | 2025.01.06 |
[Java] 객체지향의 핵심 개념 & Spring Boot란? (0) | 2024.12.29 |
[ElasticSearch] 엘라스틱 서치 도입 (2) | 2024.11.27 |