Kafka

 

개요

AWS의 관리형 Kafka 서비스인 MSK 클러스터 운영자를 위한 가이드

 

환경

온프레미스 Kafka Cluster가 아닌 Managed Kafka 클러스터인 MSK를 기준으로 설명합니다.

 

가이드

 


 

클러스터 업그레이드

Amazon MSK 버전 업그레이드와 클러스터 설정 업데이트 기능은 Kafka 모범 사례를 기반으로 하며 클러스터 IO에 Kafka를 계속 사용할 수 있도록 하는 롤링 업데이트 프로세스를 사용합니다. 따라서 설정 파일이 업데이트 되거나 Kafka 버전 업그레이드가 진행되더라도 영향도는 Kafka Client가 받는 영향도는 없습니다. (물론 이 또한 고가용성 설정이나 모범사례에 기반한 설정이 적용되어 있어야 합니다.)

자세한 사항은 Best practices for version upgrades 페이지를 참고합니다.

 


 

브로커 타입

브로커 타입별로 권장 파티션 수가 지정되어 있습니다. 이를 넘을 경우 MSK 클러스터의 버전 업그레이드를 실패하므로 주의하도록 합니다.

예를 들어 t3.small은 브로커당 권장 파티션 수가 300입니다. 각 브로커가 Online Partition으로 330개를 사용하고 있을 경우, 해당 클러스터의 Kafka 버전 업그레이드에 실패합니다.

 

MSK 클러스터의 브로커 당 파티션 개수를 모니터링하는 방법은 Kafka UI를 설치하여 MSK Cluster 정보를 수집하거나, Prometheus + Grafana 등을 통해 수집한 메트릭을 통해서 확인할 수 있습니다.

아래는 Kafka UI에서 확인한 브로커 상태 정보입니다.

Kafka UI 예제

 


 

고가용성 설정

 

브로커 3개 구성인 경우 RF, ISR 설정 예시

default.replication.factor = 3
min.insync.replicas = 2
replica.lag.time.max.ms = 30000

 

브로커 2개 구성인 경우 RF, ISR 설정 예시

default.replication.factor = 2
min.insync.replicas = 1
replica.lag.time.max.ms = 30000

 


 

계층형 스토리지

계층형 스토리지는 사용자가 자주 접근하지 않는 데이터를 자동으로 더 저렴한 스토리지 계층으로 이동시키는 기능을 말합니다. Kafka의 주요 사용 사례 중 하나는 대량의 로그 또는 이벤트 데이터를 저장하고, 이를 실시간으로 분석하는 것입니다. 이러한 데이터 중 일부는 생성 후 단기간에 많이 사용되지만, 시간이 지남에 따라 접근 빈도가 줄어들 수 있습니다.

MSK의 계층형 스토리지 기능을 사용하면, 이러한 Cold 데이터를 자동으로 더 저렴한 스토리지로 이동시켜 비용을 절감할 수 있습니다. 예를 들어, 초기에는 SSD와 같은 고성능 스토리지에 데이터를 저장했다가, 일정 기간이 지나면 자동으로 HDD 같은 저비용 스토리지로 옮겨지게 됩니다. 이는 특히 데이터를 장기간 보관해야 하는 경우 비용 효율적입니다.

이 기능은 비용을 절감하면서도, 필요할 때 빠른 접근이 가능하도록 유지하기 위해 중요합니다. 사용자는 데이터의 저장 위치나 성능에 대해 걱정하지 않고, MSK 서비스가 자동으로 관리해주는 편리함을 누릴 수 있습니다.

 

계층형 스토리지Tiered storage의 사용 조건

MSK 클러스터에서 위 2개 조건이 충족되면 계층형 스토리지Tiered Storage 기능을 사용할 수 있습니다.

 

테라폼 MSK 모듈에서 Tiered Storage 기능을 활성화하려면 storage_mode 값을 LOCAL(default)이 아닌 TIERED로 변경합니다.

#-------------------------
# MSK Cluster
#-------------------------
module "msk_cluster" {
  ...

  name                        = local.name
  kafka_version               = "3.6.0"
  number_of_broker_nodes      = 3
  broker_node_az_distribution = "DEFAULT"

  # Valid values: `null`, `PER_TOPIC_PER_PARTITION`, `PER_BROKER`, `PER_TOPIC_PER_BROKER`
  # https://docs.aws.amazon.com/msk/latest/developerguide/metrics-details.html
  enhanced_monitoring = "PER_TOPIC_PER_PARTITION"

  broker_node_storage_info = {
    ebs_storage_info = {
      volume_size = 500
    }
  }

  # Broker node's storage autoscaling
  storage_mode               = "TIERED"