Kafka 구성 튜닝


Red Hat Streams for Apache Kafka 2.8

Kafka 구성 속성을 사용하여 데이터 스트리밍 최적화

초록

Kafka 구성 속성을 사용하여 Kafka 브로커, 생산자 및 소비자의 작업을 미세 조정합니다.

머리말

Red Hat 문서에 관한 피드백 제공

문서 개선을 위한 의견에 감사드립니다.

개선 사항을 제안하려면 Jira 문제를 열고 제안된 변경 사항을 설명합니다. 귀하의 요청을 신속하게 처리할 수 있도록 가능한 한 자세한 정보를 제공하십시오.

사전 요구 사항

  • Red Hat 고객 포털 계정이 있어야 합니다. 이 계정을 사용하면 Red Hat Jira Software 인스턴스에 로그인할 수 있습니다.
    계정이 없는 경우 계정을 생성하라는 메시지가 표시됩니다.

프로세스

  1. 다음: 생성 문제를 클릭합니다.
  2. 요약 텍스트 상자에 문제에 대한 간략한 설명을 입력합니다.
  3. 설명 텍스트 상자에 다음 정보를 입력합니다.

    • 문제를 발견한 페이지의 URL입니다.
    • 문제에 대한 자세한 설명입니다.
      다른 필드에 있는 정보는 기본값에 따라 그대로 둘 수 있습니다.
  4. 보고자 이름을 추가합니다.
  5. 생성 을 클릭하여 Jira 문제를 문서 팀에 제출합니다.

피드백을 제공하기 위해 시간을 내어 주셔서 감사합니다.

1장. Kafka 튜닝 개요

Kafka 배포의 성능을 미세 조정하려면 특정 요구 사항에 따라 다양한 구성 속성을 최적화해야 합니다. 이 섹션에서는 Kafka 브로커, 생산자 및 소비자에 사용할 수 있는 일반적인 구성 옵션을 소개합니다.

Kafka가 작동하려면 최소 구성 세트가 필요하지만 Kafka 속성은 광범위한 조정을 허용합니다. 구성 속성을 통해 대기 시간, 처리량 및 전체 효율성을 개선하여 Kafka 배포가 애플리케이션의 요구 사항을 충족하도록 할 수 있습니다.

효과적인 튜닝을 위해 체계적인 접근 방식을 사용하십시오. 먼저 관련 메트릭을 분석하여 잠재적인 병목 현상 또는 개선을 위한 영역을 파악합니다. 구성 매개 변수를 반복적으로 조정하고 성능 지표에 미치는 영향을 모니터링한 다음 적절하게 설정을 조정합니다.

Apache Kafka 구성 속성에 대한 자세한 내용은 Apache Kafka 설명서 를 참조하십시오.

참고

여기에 제공된 지침은 Kafka 배포 튜닝을 위한 시작점을 제공합니다. 최적의 구성을 찾는 것은 워크로드, 인프라 및 성능 목표와 같은 요소에 따라 달라집니다.

1.1. 속성 및 값 매핑

구성 속성을 지정하는 방법은 배포 유형에 따라 다릅니다. OCP에 Apache Kafka 용 Streams를 배포한 경우 Kafka 리소스를 사용하여 config config 속성을 통해 Kafka 브로커에 대한 구성을 추가할 수 있습니다. RHEL에서 Apache Kafka용 Streams를 사용하면 속성 파일에 구성을 환경 변수로 추가합니다.

사용자 정의 리소스에 구성 속성을 추가할 때 콜론(':')을 사용하여 속성과 값을 매핑합니다.

사용자 정의 리소스의 구성 예

num.partitions:1
Copy to Clipboard Toggle word wrap

속성을 환경 변수로 추가하면 등호('=')를 사용하여 속성과 값을 매핑합니다.

환경 변수로 구성 예

num.partitions=1
Copy to Clipboard Toggle word wrap

참고

이 가이드의 일부 예제에서는 OpenShift에서 Apache Kafka용 Streams에 대한 리소스 구성을 구체적으로 표시할 수 있습니다. 그러나 제공되는 속성은 RHEL에서 Apache Kafka에 Streams를 사용할 때 환경 변수와 동일하게 적용할 수 있습니다.

1.2. 튜닝에 도움이 되는 툴

Kafka 튜닝에 도움이 되는 툴은 다음과 같습니다.

  • cruise Control은 클러스터 재조정을 평가하고 구현하는 데 사용할 수 있는 최적화 제안을 생성합니다.
  • Kafka 정적 할당량 플러그인에서 브로커에 제한을 설정
  • Rack 구성은 랙에 브로커 파티션을 분배하고 소비자가 가장 가까운 복제본에서 데이터를 가져올 수 있도록 합니다.

2장. 관리형 브로커 구성

OpenShift에 Apache Kafka용 Streams를 배포할 때 Kafka 사용자 정의 리소스의 config 속성을 통해 브로커 구성을 지정합니다. 그러나 특정 브로커 구성 옵션은 Apache Kafka용 Streams에서 직접 관리합니다.

따라서 OpenShift에서 Apache Kafka용 Streams를 사용하는 경우 다음 옵션을 구성할 수 없습니다.

  • Kafka 브로커의 ID를 지정하는 broker.id
  • 로그 데이터의 log.dirs 디렉터리
  • Kafka를 Zoo Cryostat와 연결하기 위한 Zookeeper .connect 구성
  • Kafka 클러스터를 클라이언트에 노출하는 리스너
  • 사용자가 실행하는 작업을 허용하거나 거부하는 권한 부여 메커니즘
  • Kafka에 액세스해야 하는 사용자의 ID를 증명하기 위한 인증 메커니즘

브로커 ID는 0(영)에서 시작하여 브로커 복제본 수에 해당합니다. 로그 디렉터리는 Kafka 사용자 정의 리소스의 spec.kafka.storage 구성에 따라 /var/lib/kafka/data/kafka-logIDX 에 마운트됩니다. IDX 는 Kafka 브로커 Pod 인덱스입니다.

제외 목록은 KafkaClusterSpec 스키마 참조를 참조하십시오.

이러한 제외는 RHEL에서 Apache Kafka에 Streams를 사용할 때 적용되지 않습니다. 이 경우 기본 브로커 구성에 이러한 속성을 추가하여 브로커를 식별하고 보안 액세스 권한을 제공해야 합니다.

RHEL에서 Apache Kafka에 대한 스트림 브로커 구성의 예

# ...
broker.id = 1
log.dirs = /var/lib/kafka
zookeeper.connect = zoo1.my-domain.com:2181,zoo2.my-domain.com:2181,zoo3.my-domain.com:2181
listeners = internal-1://:9092
authorizer.class.name = kafka.security.auth.SimpleAclAuthorizer
ssl.truststore.location = /path/to/truststore.jks
ssl.truststore.password = 123456
ssl.client.auth = required
# ...
Copy to Clipboard Toggle word wrap

3장. Kafka 브로커 구성 튜닝

구성 속성을 사용하여 Kafka 브로커의 성능을 최적화합니다. Apache Kafka용 Streams에서 직접 관리하는 속성을 제외하고 표준 Kafka 브로커 구성 옵션을 사용할 수 있습니다.

3.1. 기본 브로커 구성

일반적인 브로커 구성에는 주제, 스레드 및 로그와 관련된 속성 설정이 포함됩니다.

기본 브로커 구성 속성

# ...
num.partitions=1
default.replication.factor=3
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
num.network.threads=3
num.io.threads=8
num.recovery.threads.per.data.dir=1
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
group.initial.rebalance.delay.ms=0
zookeeper.connection.timeout.ms=6000
# ...
Copy to Clipboard Toggle word wrap

3.2. 고가용성을 위한 주제 복제

기본 주제 속성은 주제가 자동으로 생성되는 경우를 포함하여 이러한 속성을 명시적으로 설정하지 않고 생성된 항목에 적용되는 파티션 수와 복제 요소를 설정합니다.

# ...
num.partitions=1
auto.create.topics.enable=false
default.replication.factor=3
min.insync.replicas=2
replica.fetch.max.bytes=1048576
# ...
Copy to Clipboard Toggle word wrap

고가용성 환경의 경우 복제 요소를 주제의 경우 3 이상으로 늘리고 복제 요인보다 1 미만으로 필요한 최소 in-sync 복제본 수를 설정하는 것이 좋습니다.

auto.create.topics.enable 속성은 아직 존재하지 않는 항목이 생산자와 소비자에 의해 필요할 때 자동으로 생성되도록 기본적으로 활성화됩니다. 자동 주제 생성을 사용하는 경우 num.partitions 를 사용하여 주제의 기본 파티션 수를 설정할 수 있습니다. 그러나 일반적으로 이 속성은 명시적 주제 생성을 통해 주제를 통해 더 많은 제어가 제공되도록 비활성화되어 있습니다.

데이터 지속성 의 경우 주제 구성에 min.insync.replicas 를 설정하고 생산자 구성에서 acks=all 을 사용하여 메시지 전달을 설정해야 합니다.

리더 파티션을 복제하는 각 후속자가 가져온 메시지의 최대 크기(바이트)를 설정하려면 replica.fetch.max.bytes 를 사용합니다. 평균 메시지 크기 및 처리량에 따라 이 값을 변경합니다. 읽기/쓰기 버퍼링에 필요한 총 메모리 할당을 고려할 때 사용 가능한 메모리는 모든 구현자를 곱할 때 최대 복제 메시지 크기를 수용할 수 있어야 합니다.

항목을 삭제할 수 있도록 delete.topic.enable 속성은 기본적으로 활성화됩니다. 프로덕션 환경에서는 실수로 주제 삭제를 방지하기 위해 이 속성을 비활성화하여 데이터가 손실됩니다. 그러나 일시적으로 활성화한 후 주제를 삭제한 다음 다시 비활성화할 수 있습니다.

참고

OpenShift에서 Apache Kafka용 Streams를 실행하는 경우 Topic Operator는 operator 스타일 주제 관리를 제공할 수 있습니다. KafkaTopic 리소스를 사용하여 주제를 생성할 수 있습니다. KafkaTopic 리소스를 사용하여 생성한 주제의 경우 복제 요소는 spec.replicas 를 사용하여 설정됩니다. delete.topic.enable 이 활성화된 경우 KafkaTopic 리소스를 사용하여 주제를 삭제할 수도 있습니다.

# ...
auto.create.topics.enable=false
delete.topic.enable=true
# ...
Copy to Clipboard Toggle word wrap

3.3. 트랜잭션 및 커밋에 대한 내부 주제 설정

트랜잭션을 사용하여 생산자의 파티션에 대한 atomic 쓰기를 활성화하는 경우 트랜잭션 상태는 내부 __ Cryostat_state 항목에 저장됩니다. 기본적으로 브로커는 이 항목의 복제 요소 3과 최소 2개의 동기화 복제본으로 구성됩니다. 즉, Kafka 클러스터에 최소 3개의 브로커가 필요합니다.

# ...
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2
# ...
Copy to Clipboard Toggle word wrap

마찬가지로 소비자 상태를 저장하는 내부 __consumer_offsets 주제에는 파티션 수 및 복제 요인에 대한 기본 설정이 있습니다.

# ...
offsets.topic.num.partitions=50
offsets.topic.replication.factor=3
# ...
Copy to Clipboard Toggle word wrap

프로덕션 환경에서 이러한 설정을 줄이지 마십시오. 프로덕션 환경에서 설정을 늘릴 수 있습니다. 예외적으로 단일broker 테스트 환경에서 설정을 줄일 수 있습니다.

3.4. I/O 스레드를 늘림으로써 요청 처리 처리량 개선

네트워크 스레드는 클라이언트 애플리케이션에서 요청을 생성하고 가져오는 등 Kafka 클러스터에 대한 요청을 처리합니다. 요청 생성은 요청 큐에 배치됩니다. 응답은 응답 큐에 배치됩니다.

리스너당 네트워크 스레드 수는 복제 요소 및 Kafka 클러스터와 상호 작용하는 클라이언트 생산자 및 소비자의 활동 수준을 반영해야 합니다. 요청이 많은 경우 스레드 수를 늘릴 수 있습니다. 시간 스레드의 양을 사용하여 스레드를 추가할 시기를 결정합니다.

혼잡을 줄이고 요청 트래픽을 규제하기 위해 요청 큐에 허용되는 요청 수를 제한할 수 있습니다. 요청 큐가 가득 차면 들어오는 모든 트래픽이 차단됩니다.

I/O 스레드는 요청 대기열에서 요청을 가져와 처리합니다. 스레드를 추가하면 처리량이 향상될 수 있지만 CPU 코어 및 디스크 대역폭의 수는 실용적인 상한을 부과합니다. 최소한 I/O 스레드 수는 스토리지 볼륨 수와 같아야 합니다.

# ...
num.network.threads=3 
1

queued.max.requests=500 
2

num.io.threads=8 
3

num.recovery.threads.per.data.dir=4 
4

# ...
Copy to Clipboard Toggle word wrap
1
Kafka 클러스터의 네트워크 스레드 수입니다.
2
요청 큐에 허용되는 요청 수입니다.
3
Kafka 브로커의 I/O 스레드 수입니다.
4
시작 시 로그 로드 및 종료 시 플러시에 사용되는 스레드 수입니다. 최소 코어 수의 값으로 설정해 보십시오.

모든 브로커의 스레드 풀에 대한 구성 업데이트는 클러스터 수준에서 동적으로 발생할 수 있습니다. 이러한 업데이트는 현재 크기의 절반과 현재 크기의 두 배 사이로 제한됩니다.

작은 정보

다음 Kafka 브로커 메트릭은 필요한 스레드 수를 처리하는 데 도움이 될 수 있습니다.

  • Kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent 는 네트워크 스레드가 백분율로 유휴 상태인 평균 메트릭을 제공합니다.
  • Kafka .server:type=KafkaRequestHandlerPool,name=RequestHandlerAvgIdlePercent 는 I/O 스레드가 백분율로 유휴 상태인 평균 시간에 대한 메트릭을 제공합니다.

유휴 시간이 0%인 경우 모든 리소스가 사용 중이므로 더 많은 스레드를 추가하는 것이 유용할 수 있습니다. 유휴 시간이 30% 미만이면 성능이 저하되기 시작할 수 있습니다.

디스크 수로 인해 스레드가 느리거나 제한되는 경우 처리량을 개선하기 위해 네트워크 요청의 버퍼 크기를 늘릴 수 있습니다.

# ...
replica.socket.receive.buffer.bytes=65536
# ...
Copy to Clipboard Toggle word wrap

또한 수신할 수 있는 최대 바이트 수를 늘립니다.

# ...
socket.request.max.bytes=104857600
# ...
Copy to Clipboard Toggle word wrap

3.5. 대기 시간이 긴 연결에 대한 대역폭 증가

Kafka는 데이터 센터 연결과 같이 Kafka에서 클라이언트로의 대기 시간이 긴 연결을 통해 합리적인 처리량을 달성하기 위해 데이터를 배치합니다. 그러나 대기 시간이 길면 메시지를 보내고 받기 위한 버퍼 크기를 늘릴 수 있습니다.

# ...
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
# ...
Copy to Clipboard Toggle word wrap

대역폭 지연 제품 계산을 사용하여 버퍼의 최적 크기를 추정할 수 있습니다. 이 계산은 라운드트립 지연 (초 단위)과 링크의 최대 대역폭을 곱하여 최대 처리량을 유지하기 위해 버퍼의 크기를 추정할 수 있습니다.

3.6. 삭제 및 컴팩트 정책을 사용하여 Kafka 로그 관리

Kafka는 메시지 데이터를 저장하기 위해 로그를 사용합니다. 로그는 일련의 세그먼트로 구성되며, 여기서 각 세그먼트는 오프셋 기반 및 타임스탬프 기반 인덱스와 연결됩니다. 새 메시지는 활성 세그먼트에 기록되며 이후에 수정되지 않습니다. 소비자의 가져오기 요청을 제공할 때 세그먼트를 읽습니다. 주기적으로 활성 세그먼트는 읽기 전용으로 롤백 되고 이를 대체하기 위해 새 활성 세그먼트가 생성됩니다. 브로커당 주제 파티션당 하나의 활성 세그먼트만 있습니다. 이전 세그먼트는 삭제할 수 있을 때까지 유지됩니다.

브로커 수준의 구성은 로그 세그먼트의 최대 크기(바이트)와 활성 세그먼트가 롤아웃되기 전의 시간(밀리초)을 결정합니다.

# ...
log.segment.bytes=1073741824
log.roll.ms=604800000
# ...
Copy to Clipboard Toggle word wrap

이러한 설정은 segment.bytessegment.ms 를 사용하여 주제 수준에서 재정의할 수 있습니다. 이러한 값을 낮추거나 올리는 선택은 세그먼트 삭제 정책에 따라 다릅니다. 크기가 클수록 활성 세그먼트에 더 많은 메시지가 포함되어 있으며 덜 자주 롤백됩니다. 또한 세그먼트는 덜 자주 삭제할 수 있습니다.

Kafka에서 로그 정리 정책은 로그 데이터를 관리하는 방법을 결정합니다. 대부분의 경우 삭제 정리 정책을 지정하고 컴팩트 정리 정책에서 사용하는 로그 정리를 활성화하는 클러스터 수준에서 기본 구성을 변경할 필요가 없습니다.

# ...
log.cleanup.policy=delete
log.cleaner.enable=true
# ...
Copy to Clipboard Toggle word wrap
정리 정책 삭제
삭제 정리 정책은 모든 주제의 기본 클러스터 전체 정책입니다. 정책은 특정 주제 수준 정책이 구성되지 않은 항목에 적용됩니다. Kafka는 시간 기반 또는 크기 기반 로그 보존 제한을 기반으로 이전 세그먼트를 제거합니다.
컴팩트 정리 정책
컴팩트한 정리 정책은 일반적으로 주제 수준 정책(cleanup.policy=compact)으로 구성됩니다. Kafka의 로그 정리는 특정 항목에 압축 기능을 적용하여 주제의 키에 대한 최신 값만 유지합니다. 두 정책을 모두 사용하도록 주제를 구성할 수도 있습니다(cleanup.policy=compact,delete).

삭제 정책에 대한 보존 제한 설정

정리 정책은 데이터 보존을 사용하여 로그를 관리하는 데 해당합니다. 이 정책은 데이터가 영구적으로 유지될 필요가 없을 때 적합합니다. 시간 기반 또는 크기 기반 로그 보존 및 정리 정책을 설정하여 로그를 바인딩된 상태로 유지할 수 있습니다.

로그 보존 정책이 적용되면 보존 제한에 도달하면 비활성 로그 세그먼트가 제거됩니다. 이전 세그먼트를 삭제하면 디스크 용량이 초과되는 것을 방지할 수 있습니다.

시간 기반 로그 보존의 경우 시간, 분 또는 밀리초에 따라 보존 기간을 설정합니다.

# ...
log.retention.ms=1680000
# ...
Copy to Clipboard Toggle word wrap

보존 기간은 메시지가 세그먼트에 추가된 시간을 기반으로 합니다. Kafka는 세그먼트 내에서 최신 메시지의 타임스탬프를 사용하여 해당 세그먼트가 만료되었는지 확인합니다. 밀리초 단위 구성의 우선 순위는 분보다 우선하며, 이는 몇 시간보다 우선 순위가 높습니다. 분 및 밀리초 구성은 기본적으로 null이지만 세 가지 옵션은 유지하려는 데이터에 대한 상당한 수준의 제어를 제공합니다. 동적으로 업데이트할 수 있는 세 가지 속성 중 하나만이므로 기본 설정을 밀리초 구성에 제공해야 합니다.

log.retention.ms 가 -1로 설정된 경우 로그 보존에 시간 제한이 적용되지 않으며 모든 로그가 유지됩니다. 그러나 이 설정은 일반적으로 수정하기 어려운 전체 디스크에 문제가 발생할 수 있으므로 권장되지 않습니다.

크기 기반 로그 보존의 경우 최소 로그 크기(바이트)를 지정합니다.

# ...
log.retention.bytes=1073741824
# ...
Copy to Clipboard Toggle word wrap

즉 Kafka는 항상 지정된 양의 로그 데이터를 사용할 수 있도록 합니다.

예를 들어 log.retention.bytes 를 1000으로 설정하고 log.segment.bytes 를 300으로 설정하면 Kafka는 4 세그먼트와 활성 세그먼트를 유지하면서 최소 1000바이트를 사용할 수 있습니다. 활성 세그먼트가 가득 차고 새 세그먼트가 생성되면 가장 오래된 세그먼트가 삭제됩니다. 이 시점에서 디스크의 크기는 지정된 1000바이트를 초과할 수 있으며, 잠재적으로 1200 및 1500바이트( 인덱스 파일 제외)를 초과할 수 있습니다.

로그 크기를 사용할 때 발생할 수 있는 문제는 시간 메시지가 세그먼트에 추가되었음을 고려하지 않는다는 것입니다. 정리 정책에 시간 기반 및 크기 기반 로그 보존을 사용하여 필요한 균형을 얻을 수 있습니다. 먼저 도달한 임계값 중 정리를 트리거하는 것은 무엇입니까.

세그먼트 파일이 시스템에서 삭제되기 전에 시간 지연을 추가하려면 모든 주제의 브로커 수준에서 log.segment.delete.delay.ms 를 사용할 수 있습니다.

# ...
log.segment.delete.delay.ms=60000
# ...
Copy to Clipboard Toggle word wrap

또는 주제 수준에서 file.delete.delay.ms 를 구성합니다.

로그에서 정리를 확인하는 빈도를 밀리초 단위로 설정합니다.

# ...
log.retention.check.interval.ms=300000
# ...
Copy to Clipboard Toggle word wrap

로그 보존 설정과 관련된 로그 보존 확인 간격을 조정합니다. 보존 크기가 작으면 더 자주 점검해야 할 수 있습니다. 정리 빈도는 디스크 공간을 관리하기에 충분하지만 브로커의 성능에 영향을 미치지 않는 경우가 많습니다.

컴팩트 정책을 사용하여 최신 메시지 유지

cleanup.policy=compact 를 설정하여 항목에 대한 로그 압축을 활성화하면 Kafka는 로그 정리기를 백그라운드 스레드로 사용하여 압축을 수행합니다. 컴팩트 정책을 사용하면 각 메시지 키의 최신 메시지가 유지되어 이전 버전의 레코드가 효과적으로 정리됩니다. 이 정책은 메시지 값을 변경할 수 있고 최신 업데이트를 유지해야 할 때 적합합니다.

정리 정책이 로그 압축으로 설정된 경우 로그 헤드 가 표준 Kafka 로그로 작동하며 새 메시지에 대한 쓰기가 순서대로 추가됩니다. 로그 정리기가 작동하는 컴팩트한 로그의 tail 에서 동일한 키가 있는 다른 레코드가 나중에 로그에서 발생하는 경우 레코드가 삭제됩니다. null 값이 있는 메시지도 삭제됩니다. 압축 기능을 사용하려면 Kafka에서 각 키의 최신 메시지가 유지되도록 보장하지만 전체 압축된 로그에 중복이 포함되지 않도록 보장하므로 관련 메시지를 식별하는 키가 있어야 합니다.

그림 3.1. 압축하기 전에 오프셋 위치가 있는 키 값 쓰기를 표시하는 로그

Kafka 압축은 메시지를 식별하기 위해 특정 메시지 키에 대해 로그 이름에 존재하는 최신 메시지(가장 높은 오프셋을 가진)를 유지하여 결국 동일한 키가 있는 이전 메시지를 삭제합니다. 최신 상태의 메시지는 항상 사용할 수 있으며 로그 정리기가 실행될 때 특정 메시지의 최신 레코드가 결국 제거됩니다. 메시지를 다시 이전 상태로 복원할 수 있습니다. 레코드는 주변 레코드가 삭제되는 경우에도 원래 오프셋을 유지합니다. 결과적으로 tail은 연속적이지 않은 오프셋을 가질 수 있습니다. tail에서 더 이상 사용할 수 없는 오프셋을 사용하면 다음 상위 오프셋이 있는 레코드가 검색됩니다.

그림 3.2. 압축 후 로그

적절한 경우 압축 프로세스에 지연을 추가할 수 있습니다.

# ...
log.cleaner.delete.retention.ms=86400000
# ...
Copy to Clipboard Toggle word wrap

삭제된 데이터 보존 기간은 데이터가 삭제되기 전에 데이터가 손실되었음을 알리는 시간을 제공합니다.

특정 키와 관련된 모든 메시지를 삭제하려면 생산자가 tombstone 메시지를 보낼 수 있습니다. tombstone에는 null 값이 있으며 해당 키에 대한 해당 메시지가 삭제되었음을 사용자에게 알리는 마커 역할을 합니다. 잠시 후 tombstone 마커만 유지됩니다. 새 메시지가 계속 들어오면, 마커는 log.cleaner.delete.retention.ms 에 지정된 기간 동안 유지되어 사용자가 삭제를 인식할 수 있는 충분한 시간을 허용합니다.

정리할 로그가 없는 경우 대기 상태에 더 많은 시간을 배치하도록 시간(밀리초)을 설정할 수도 있습니다.

# ...
log.cleaner.backoff.ms=15000
# ...
Copy to Clipboard Toggle word wrap

결합된 컴팩트 및 삭제 정책 사용

컴팩트한 정책만 선택하면 로그가 임의로 커질 수 있습니다. 이러한 경우 항목에 대한 정리 정책을 설정하여 로그를 압축하고 삭제할 수 있습니다. Kafka는 로그 압축 기능을 적용하여 이전 버전의 레코드를 제거하고 각 키의 최신 버전만 유지합니다. Kafka는 지정된 시간 기반 또는 크기 기반 로그 보존 설정을 기반으로 레코드를 삭제합니다.

예를 들어 다음 다이어그램에서는 특정 메시지 키에 대한 최신 메시지(가장 높은 오프셋 포함)만 압축 지점까지 유지됩니다. 보존 지점까지 레코드가 남아 있으면 삭제됩니다. 이 경우 압축 프로세스는 중복을 모두 제거합니다.

그림 3.3. 로그 보존 지점 및 압축 지점

3.7. 압축의 효율적인 디스크 사용률 관리

Kafka의 주제 로그를 처리하기 위해 컴팩트 정책 및 로그 정리기를 사용하는 경우 메모리 할당을 최적화하는 것이 좋습니다.

deduplication 속성(dedupe.buffer.size)을 사용하여 메모리 할당을 미세 조정할 수 있으며 이는 모든 로그 정리 스레드에서 정리 작업에 할당된 총 메모리를 결정합니다. 또한 buffer.load.factor 속성을 통해 백분율을 정의하여 최대 메모리 사용량 제한을 설정할 수 있습니다.

# ...
log.cleaner.dedupe.buffer.size=134217728
log.cleaner.io.buffer.load.factor=0.9
# ...
Copy to Clipboard Toggle word wrap

각 로그 항목은 정확히 24바이트를 사용하므로 버퍼가 단일 실행에서 처리할 수 있는 로그 항목 수를 확인하고 그에 따라 설정을 조정할 수 있습니다.

가능한 경우 로그 정리 시간을 줄이려는 경우 로그 정리 스레드 수를 늘리는 것이 좋습니다.

# ...
log.cleaner.threads=8
# ...
Copy to Clipboard Toggle word wrap

100% 디스크 대역폭 사용량에 문제가 발생하면 로그 정리 I/O를 제한하여 작업을 수행하는 디스크 기능에 따라 읽기/쓰기 작업의 합계가 지정된 이중 값보다 작도록 할 수 있습니다.

# ...
log.cleaner.io.max.bytes.per.second=1.7976931348623157E308
# ...
Copy to Clipboard Toggle word wrap

3.8. 메시지 데이터의 로그 플러시 제어

일반적으로 명시적 플러시 임계값을 설정하지 않고 운영 체제가 기본 설정을 사용하여 백그라운드 플러시를 수행하도록 하는 것이 좋습니다. 실패한 브로커는 동기화된 복제본에서 복구할 수 있으므로 파티션 복제를 사용하면 단일 디스크에 쓰기보다 데이터 지속성이 향상됩니다.

로그 플러시 속성은 캐시된 메시지 데이터의 주기적인 쓰기를 디스크에 제어합니다. 스케줄러는 로그 캐시의 검사 빈도를 밀리초 단위로 지정합니다.

# ...
log.flush.scheduler.interval.ms=2000
# ...
Copy to Clipboard Toggle word wrap

메시지가 메모리에 보관되는 최대 시간과 디스크에 쓰기 전에 로그의 최대 메시지 수에 따라 플러시 빈도를 제어할 수 있습니다.

# ...
log.flush.interval.ms=50000
log.flush.interval.messages=100000
# ...
Copy to Clipboard Toggle word wrap

플러시 간 대기에는 플러시를 수행하기 전에 검사를 수행하는 시간과 지정된 간격이 포함됩니다. 플러시 빈도를 늘리면 처리량에 영향을 미칠 수 있습니다.

애플리케이션 플러시 관리를 사용하는 경우 더 빠른 디스크를 사용하는 경우 플러시 임계값을 낮추는 것이 적합할 수 있습니다.

3.9. 가용성에 대한 파티션 재조정

내결함성을 위해 브로커 간에 파티션을 복제할 수 있습니다. 지정된 파티션의 경우 하나의 브로커가 리더로 선택되고 모든 생성 요청을 처리합니다(로그에 쓰기). 다른 브로커의 파티션 팀은 리더가 실패할 경우 데이터 안정성을 위해 파티션 리더의 파티션 데이터를 복제합니다.

보통은 구성을 통해 Kafka 클러스터가 여러 데이터센터에 걸쳐 있을 때 소비자가 가장 가까운 복제본에서 메시지를 사용할 수 있지만 소비자는 일반적으로 클라이언트에 서비스를 제공하지 않습니다. 차선은 파티션 리더의 메시지를 복제하고 리더가 실패할 경우 복구를 허용하기 위해서만 작동합니다. 복구에는 동기화 내 후속 조치가 필요합니다. 조각화는 리더에게 페치 요청을 보내 동기화 상태를 유지하며, 이 리더에게 메시지를 순서대로 반환합니다. 팔로워는 리더에서 가장 최근에 커밋된 메시지와 함께 배치된 경우 동기화된 것으로 간주됩니다. 리더는 후속자가 요청한 마지막 오프셋을 확인하여 이를 확인합니다. 예기치 않은 리더 선택이 허용되지 않는 한 현재 리더가 실패해야 하는 리더로서 일반적으로 동기화되지 않은 후속 조치를 취할 수 없습니다.

후속 작업이 동기화되지 않은 것으로 간주되기 전에 지연 시간을 조정할 수 있습니다.

# ...
replica.lag.time.max.ms=30000
# ...
Copy to Clipboard Toggle word wrap

지연 시간이 동기화된 모든 복제본에 메시지를 복제하는 시간과 생산자가 승인을 기다려야 하는 기간을 지정합니다. 후속 프로그램이 가져오기 요청을 작성하고 지정된 지연 시간 내에 최신 메시지를 catch하지 못하면 동기화 내 복제본에서 제거됩니다. 실패한 복제본을 더 빨리 감지할 수 있는 지연 시간을 줄일 수 있지만 이렇게 하면 불필요하게 동기화되지 않는 자국 수를 늘릴 수 있습니다. 올바른 지연 시간 값은 네트워크 대기 시간과 브로커 디스크 대역폭에 따라 다릅니다.

리더 파티션을 더 이상 사용할 수 없는 경우 동기화 중인 복제본 중 하나가 새 리더로 선택됩니다. 파티션의 복제본 목록의 첫 번째 브로커를 선호하는 리더라고 합니다. 기본적으로 Kafka는 리더 배포 주기에 따라 자동 파티션 리더 재조정에 대해 활성화됩니다. 즉 Kafka에서 기본 리더가 현재 리더인지 확인합니다. 리밸런스를 사용하면 브로커와 브로커 간에 리더가 균등하게 분배되지 않습니다.

Apache Kafka용 Cruise Control for Streams를 사용하여 클러스터 전체에서 부하를 균등하게 조정하는 브로커에 대한 복제본 할당을 파악할 수 있습니다. 그 계산은 리더와 팔로워가 경험하는 다양한 부하를 고려합니다. 나머지 브로커는 주요 추가 파티션의 추가 작업을 받기 때문에 실패한 리더는 Kafka 클러스터의 균형에 영향을 미칩니다.

Cruise Control이 실제로 균형을 맞추려면 기본 리더가 파티션을 이끌 필요가 있습니다. Kafka는 기본 리더가 사용되도록 자동으로 확인할 수 있으며 필요한 경우 현재 리더를 변경할 수 있습니다. 이렇게 하면 클러스터가 Cruise Control에서 찾은 균형 있는 상태로 유지됩니다.

리밸런스 검사의 빈도(초)와 리밸런스가 트리거되기 전에 브로커에 허용되는 최대 불균형 비율을 제어할 수 있습니다.

#...
auto.leader.rebalance.enable=true
leader.imbalance.check.interval.seconds=300
leader.imbalance.per.broker.percentage=10
#...
Copy to Clipboard Toggle word wrap

브로커의 백분율 리더 불균형은 브로커가 현재 리더인 현재 파티션 수와 기본 리더인 파티션 수 간의 비율입니다. 백분율을 0으로 설정하여 선호되는 리더가 항상 동기화 중이라고 가정하도록 할 수 있습니다.

리밸런스에 대한 재조정에 더 많은 제어가 필요한 경우 자동 리밸런스를 비활성화할 수 있습니다. 그런 다음 kafka-leader-election.sh 명령줄 도구를 사용하여 리밸런스를 트리거할 시기를 선택할 수 있습니다.

참고

Apache Kafka용 Streams와 함께 제공되는 Grafana 대시보드는 활성 리더가 없는 비복제 파티션 및 파티션에 대한 지표를 보여줍니다.

3.10. 불명확한 리더 선택

동기화되지 않은 복제본의 리더는 데이터 손실을 보장하므로 정리된 것으로 간주됩니다. 이 작업은 기본적으로 수행됩니다. 그러나 리더십을 위해 동기화되지 않은 복제본이 없으면 어떻게 됩니까? ISR(In-sync) 복제본에는 리더 디스크가 사라진 경우에만 리더가 포함되어 있을 수 있습니다. 최소 동기화 내 복제본 수를 설정하지 않고 하드 드라이브가 실패할 때 파티션 리더와 동기화되는 팔로워가 없는 경우 데이터가 이미 손실됩니다. 그뿐만 아니라 동기화 되지 않은 자국이 없기 때문에 새로운 리더를 선택할 수 없습니다.

Kafka에서 리더 실패를 처리하는 방법을 구성할 수 있습니다.

# ...
unclean.leader.election.enable=false
# ...
Copy to Clipboard Toggle word wrap

불명확한 리더 선택은 기본적으로 비활성화되어 있습니다. 즉, 동기화되지 않은 복제본이 리더가 될 수 없습니다. 명확한 리더 선택을 통해 이전 리더가 손실되었을 때 다른 브로커가 ISR에 없는 경우 Kafka는 메시지를 쓰거나 읽을 수 있기 전에 해당 리더가 다시 온라인 상태가 될 때까지 기다립니다. 비정형 리더 선택이란 동기화되지 않은 복제본이 리더가 될 수 있지만 메시지를 손실할 위험이 있습니다. 고객의 요구 사항이 가용성 또는 지속성을 선호하는지 여부에 따라 선택할 수 있습니다.

주제 수준에서 특정 주제의 기본 구성을 재정의할 수 있습니다. 데이터 손실 위험을 감수할 수 없는 경우 기본 구성을 그대로 둡니다.

3.11. 불필요한 소비자 그룹 재조정 방지

새 소비자 그룹에 가입하는 소비자의 경우 지연을 추가하여 브로커에 불필요한 재조정을 피할 수 있습니다.

# ...
group.initial.rebalance.delay.ms=3000
# ...
Copy to Clipboard Toggle word wrap

지연은 코디네이터가 멤버가 참여할 때까지 대기하는 시간입니다. 지연이 길어질수록 모든 멤버가 제 시간에 참여하고 재조정을 피할 가능성이 높습니다. 그러나 지연은 기간이 종료될 때까지 그룹이 소비되지 않도록합니다.

4장. Kafka 소비자 구성 튜닝

구성 속성을 사용하여 Kafka 소비자의 성능을 최적화합니다. 소비자를 튜닝할 때 주요 우려 사항은 수집된 데이터 양으로 효율적으로 처리되도록 하는 것입니다. 생산자 튜닝과 마찬가지로 소비자가 예상대로 작동할 때까지 점진적으로 변경할 준비가 되어 있어야 합니다.

소비자를 튜닝할 때 성능 및 동작에 크게 영향을 미치므로 다음 측면을 신중하게 고려하십시오.

스케일링
소비자 그룹은 여러 소비자에 부하를 분산하여 메시지 병렬 처리를 활성화하여 확장성 및 처리량을 향상시킬 수 있습니다. 항목 파티션의 수에 따라 하나의 파티션은 소비자 그룹의 한 사용자에게만 할당할 수 있으므로 달성할 수 있는 최대 병렬 처리 수준이 결정됩니다.
메시지 순서
주제 내의 절대 순서가 중요한 경우 단일 파티션 주제를 사용합니다. 소비자는 브로커에 커밋된 것과 동일한 순서로 단일 파티션의 메시지를 관찰합니다. 즉 Kafka는 단일 파티션의 메시지에 대한 순서만 보장합니다. 사용자와 같은 개별 엔티티와 관련된 이벤트의 메시지 순서를 유지할 수도 있습니다. 새 엔터티가 생성되면 해당 엔터티 전용 항목을 새로 만들 수 있습니다. 메시지 키로 사용자 ID와 같은 고유 ID를 사용하고 동일한 키가 있는 모든 메시지를 주제 내의 단일 파티션으로 라우팅할 수 있습니다.
오프셋 재설정 정책
적절한 오프셋 정책을 설정하면 소비자가 원하는 시작 지점의 메시지를 사용하고 그에 따라 메시지 처리를 처리합니다. 기본 Kafka 재설정 값은 파티션 끝에 시작되는 latest 이므로 소비자의 동작 및 파티션 상태에 따라 일부 메시지가 누락될 수 있습니다. auto.offset.reset 을 가장 빨리 설정하면 새 group.id 로 연결할 때 로그 시작부터 모든 메시지가 검색됩니다.
액세스 보안
Kafka에 대한 보안 액세스를 관리하도록 사용자 계정을 설정하여 인증, 암호화 및 권한 부여에 대한 보안 조치를 구현합니다.

4.1. 기본 소비자 구성

모든 소비자에 연결 및 역직렬러 속성이 필요합니다. 일반적으로 추적을 위해 클라이언트 ID를 추가하는 것이 좋습니다.

후속 구성과 관계없이 소비자 구성에서 다음을 수행합니다.

  • 소비자는 지정된 오프셋에서 메시지를 가져오고 메시지를 건너뛰거나 다시 읽도록 오프셋이 변경되지 않는 한 순서대로 메시지를 사용합니다.
  • 오프셋이 클러스터의 다른 브로커로 전송될 수 있기 때문에 Kafka에 오프셋을 커밋하는 경우에도 브로커가 응답을 처리했는지 여부를 알 수 없습니다.

기본 소비자 구성 속성

# ...
bootstrap.servers=localhost:9092 
1

key.deserializer=org.apache.kafka.common.serialization.StringDeserializer  
2

value.deserializer=org.apache.kafka.common.serialization.StringDeserializer  
3

client.id=my-client 
4

group.id=my-group-id 
5

# ...
Copy to Clipboard Toggle word wrap

1
(필수) Kafka 브로커의 host:port 부트스트랩 서버 주소를 사용하여 Kafka 클러스터에 연결하도록 소비자를 Tells합니다. 소비자는 주소를 사용하여 클러스터의 모든 브로커를 검색하고 연결합니다. 서버가 다운된 경우 쉼표로 구분된 목록을 사용하여 두 개 또는 세 개의 주소를 지정하지만 클러스터의 모든 브로커 목록을 제공할 필요는 없습니다. 로드 밸런서 서비스를 사용하여 Kafka 클러스터를 노출하는 경우 로드 밸런서에서 가용성을 처리하므로 서비스의 주소만 있으면 됩니다.
2
(필수) Kafka 브로커에서 가져온 바이트를 메시지 키로 변환하는 Deserializer입니다.
3
(필수) Kafka 브로커에서 가져온 바이트를 메시지 값으로 변환하는 Deserializer입니다.
4
(선택 사항) 요청 소스를 식별하기 위해 로그 및 메트릭에 사용되는 클라이언트의 논리 이름입니다. id는 또한 처리 시간 할당량을 기반으로 소비자를 차단하는 데 사용할 수 있습니다.
5
(조건) 소비자가 소비자 그룹에 가입하려면 그룹 ID가 필요합니다.

4.2. 소비자 그룹을 사용하여 데이터 사용량 확장

소비자 그룹은 지정된 주제에서 하나 이상의 생산자가 생성한 일반적으로 대규모 데이터 스트림을 공유합니다. 소비자는 group.id 속성을 사용하여 그룹화되므로 메시지를 멤버에 분산할 수 있습니다. 그룹의 소비자 중 한 명이 리더를 선택하고 그룹의 사용자에게 파티션을 할당하는 방법을 결정합니다. 각 파티션은 단일 소비자에만 할당할 수 있습니다.

파티션만큼 많은 소비자가 없는 경우 동일한 group.id 를 사용하여 더 많은 소비자 인스턴스를 추가하여 데이터 소비를 확장할 수 있습니다. 파티션이 있는 것보다 더 많은 소비자를 그룹에 추가하면 처리량은 도움이 되지 않지만 대기 상태의 소비자가 작동을 중지해야 함을 의미합니다. 더 적은 소비자로 처리량 목표를 달성할 수 있는 경우 리소스를 절약할 수 있습니다.

동일한 소비자 그룹 내의 소비자는 오프셋 커밋과 하트비트를 동일한 브로커에 보냅니다. 소비자는 하트비트를 Kafka 브로커로 전송하여 소비자 그룹 내의 활동을 나타냅니다. 따라서 그룹의 소비자 수가 많을수록 브로커에 요청이 로드됩니다.

# ...
group.id=my-group-id 
1

# ...
Copy to Clipboard Toggle word wrap
1
그룹 ID를 사용하여 소비자 그룹에 소비자를 추가합니다.

4.3. 올바른 파티션 할당 전략 선택

Kafka 주제 파티션이 그룹의 소비자 인스턴스에 배포되는 방식을 결정하는 적절한 파티션 할당 전략을 선택합니다.

파티션 전략은 다음 클래스에서 지원합니다.

  • org.apache.kafka.clients.consumer.RangeAssignor
  • org.apache.kafka.clients.consumer.RoundRobinAssignor
  • org.apache.kafka.clients.consumer.StickyAssignor
  • org.apache.kafka.clients.consumer.CooperativeStickyAssignor

partition.assignment.strategy 소비자 구성 속성을 사용하여 클래스를 지정합니다. 범위 할당 전략은 각 사용자에게 파티션 범위를 할당하고 관련 데이터를 함께 처리하려는 경우 유용합니다.

또는 소비자 간 동일한 파티션 배포를 위해 라운드 로빈 할당 전략을 선택합니다. 이는 병렬 처리가 필요한 처리량이 높은 시나리오에 적합합니다.

보다 안정적인 파티션 할당을 위해 고정협업 고정 전략을 고려하십시오. 고정 전략에서는 가능한 경우 리밸런스 중에 할당된 파티션을 유지 관리하는 것을 목표로 합니다. 소비자가 이전에 특정 파티션을 할당한 경우 고정 전략의 우선 순위는 리밸런스 후 동일한 파티션이 있는 동일한 파티션을 유지하는 반면, 실제로 다른 소비자로 이동하는 파티션만 취소 및 재할당합니다. 파티션 할당을 그대로 두면 파티션 조작에 대한 오버헤드가 줄어듭니다. 또한 협업 고정 전략에서는 협업 재조정을 지원하므로 다시 할당되지 않은 파티션에서 중단 없이 소비할 수 있습니다.

사용 가능한 전략이 데이터에 적합하지 않은 경우 특정 요구 사항에 맞게 사용자 정의 전략을 생성할 수 있습니다.

4.4. 메시지 순서 확인

Kafka 브로커는 브로커에 주제, 파티션 및 오프셋 위치 목록에서 메시지를 전송하도록 요청하는 소비자의 가져오기 요청을 받습니다.

소비자는 브로커에 커밋된 것과 동일한 순서로 단일 파티션의 메시지를 관찰합니다. 즉 Kafka는 단일 파티션의 메시지에 대한 순서 보장합니다. 반대로, 소비자가 여러 파티션의 메시지를 사용하는 경우 소비자가 관찰한 여러 파티션의 메시지 순서가 전송된 순서를 반영하지 않습니다.

한 주제에서 메시지 순서를 엄격하게 지정하려면 소비자당 하나의 파티션을 사용합니다.

4.5. 처리량 및 대기 시간을 위해 소비자 최적화

클라이언트 애플리케이션이 KafkaConsumer.poll() 을 호출할 때 반환된 메시지 수를 제어합니다.

fetch.max.wait.msfetch.min.bytes 속성을 사용하여 Kafka 브로커에서 소비자가 가져온 최소 데이터 양을 늘립니다. 시간 기반 일괄 처리는 fetch.max.wait.ms 를 사용하여 구성되며 크기 기반 일괄 처리는 fetch.min.bytes 를 사용하여 구성됩니다.

소비자 또는 브로커의 CPU 사용률이 높으면 소비자의 요청이 너무 많기 때문일 수 있습니다. 더 적은 요청 및 메시지가 더 큰 배치로 전달되도록 fetch.max.wait.msfetch.min.bytes 속성을 더 높게 조정할 수 있습니다. 높은 조정을 통해 처리량은 약간의 대기 시간으로 개선됩니다. 또한 생성되는 데이터 양이 낮은 경우 더 높게 조정할 수도 있습니다.

예를 들어 fetch.max.wait.ms 를 500ms로 설정하고 fetch.min.bytes 를 16384바이트로 설정하면 Kafka에서 소비자로부터 가져오기 요청을 수신하면 두 임계값 중 첫 번째에 도달할 때 응답합니다.

반대로 fetch.max.wait.msfetch.min.bytes 속성을 더 낮게 조정하여 엔드 투 엔드 대기 시간을 개선할 수 있습니다.

# ...
fetch.max.wait.ms=500 
1

fetch.min.bytes=16384 
2

# ...
Copy to Clipboard Toggle word wrap
1
브로커가 가져오기 요청을 완료하기 전에 대기하는 최대 시간(밀리초)입니다. 기본값은 500 밀리초입니다.
2
최소 배치 크기(바이트)가 사용되는 경우 최소에 도달하면 요청이 전송되거나, 메시지가 fetch.max.wait.ms 보다 오래 대기되었습니다(더 빨리 발생함). 지연을 추가하면 일괄 처리를 통해 일괄 처리로 일괄 처리까지 메시지를 누적할 수 있습니다.

가져오기 요청 크기를 늘려 대기 시간 단축

fetch.max.bytesmax.partition.fetch.bytes 속성을 사용하여 Kafka 브로커에서 소비자가 가져온 최대 데이터 양을 늘립니다.

fetch.max.bytes 속성은 브로커에서 한 번에 가져온 데이터 양에 최대 제한을 바이트 단위로 설정합니다.

max.partition.fetch.bytes 는 각 파티션에 대해 반환되는 데이터의 양에 대한 최대 제한을 바이트 단위로 설정합니다. 이 제한은 항상 브로커에 설정된 바이트 수 또는 max.message.bytes 의 주제 구성보다 커야 합니다.

클라이언트가 사용할 수 있는 최대 메모리 양은 대략적으로 다음과 같이 계산됩니다.

NUMBER-OF-BROKERS * fetch.max.bytes and NUMBER-OF-PARTITIONS * max.partition.fetch.bytes
Copy to Clipboard Toggle word wrap

메모리 사용량이 이를 수용할 수 있는 경우 이 두 속성의 값을 늘릴 수 있습니다. 각 요청에서 더 많은 데이터를 허용하면 가져오기 요청이 줄어들기 때문에 대기 시간이 향상됩니다.

# ...
fetch.max.bytes=52428800 
1

max.partition.fetch.bytes=1048576 
2

# ...
Copy to Clipboard Toggle word wrap
1
가져오기 요청에 대해 반환되는 최대 데이터 양(바이트)입니다.
2
각 파티션에 대해 반환되는 최대 데이터 양(바이트)입니다.

4.6. 오프셋을 커밋할 때 데이터 손실 또는 중복 방지

Kafka 자동 커밋 메커니즘을 사용하면 소비자가 메시지의 오프셋을 자동으로 커밋할 수 있습니다. 활성화하면 소비자는 5000ms 간격으로 브로커 폴링에서 수신된 오프셋을 커밋합니다.

자동 커밋 메커니즘은 편리하지만 데이터 손실 및 복제 위험이 발생합니다. 소비자가 여러 메시지를 가져와서 변환했지만 자동 커밋을 수행할 때 시스템이 소비자 버퍼에서 처리된 메시지와 함께 충돌하면 해당 데이터가 손실됩니다. 메시지를 처리한 후 시스템이 충돌하지만 자동 커밋을 수행하기 전에 시스템의 재조정 후 다른 소비자 인스턴스에서 데이터가 복제됩니다.

자동 커밋은 브로커의 다음 폴링 전에 모든 메시지가 처리되거나 소비자가 닫히기 전에 모든 메시지가 처리되는 경우에만 데이터 손실을 방지할 수 있습니다.

데이터 손실 또는 복제 가능성을 최소화하기 위해 enable.auto.commitfalse 로 설정하고 클라이언트 애플리케이션을 개발하여 오프셋을 더 많이 제어할 수 있습니다. 또는 auto.commit.interval.ms 를 사용하여 커밋 간 간격을 줄일 수 있습니다.

# ...
enable.auto.commit=false 
1

# ...
Copy to Clipboard Toggle word wrap
1
커밋 오프셋을 더 많이 제어하려면 자동 커밋이 false로 설정됩니다.

enable.auto.commitfalse 로 설정하면 모든 처리가 수행되고 메시지가 사용된 후 오프셋을 커밋할 수 있습니다. 예를 들어 Kafka commitSynccommitAsync 커밋 API를 호출하도록 애플리케이션을 설정할 수 있습니다.

commitSync API는 폴링에서 반환된 메시지 배치의 오프셋을 커밋합니다. 일괄 처리의 모든 메시지 처리를 완료하면 API를 호출합니다. commitSync API를 사용하는 경우 배치의 마지막 오프셋이 커밋될 때까지 애플리케이션은 새 메시지를 폴링하지 않습니다. 처리량에 부정적인 영향을 미치는 경우 더 자주 커밋하거나 commitAsync API를 사용할 수 있습니다. commitAsync API는 브로커가 커밋 요청에 응답할 때까지 기다리지 않지만 재조정 시 더 많은 중복을 생성할 위험이 있습니다. 일반적인 접근 방식은 애플리케이션에서 커밋 API를 모두 결합한 후 소비자를 종료하거나 재조정하기 전에 사용된 commitSync API를 결합하여 최종 커밋이 성공했는지 확인하는 것입니다.

4.6.1. 트랜잭션 메시지 제어

트랜잭션 ID를 사용하고 생산자 측에서 멱등(enable.idempotence=true)을 활성화하여 정확하게 제공되도록 하는 것이 좋습니다. 소비자 측에서 isolation.level 속성을 사용하여 소비자가 트랜잭션 메시지를 읽는 방법을 제어할 수 있습니다.

isolation.level 속성에는 다음 두 가지 유효한 값이 있습니다.

  • read_committed
  • read_uncommitted (기본값)

read_committed 를 사용하여 커밋된 트랜잭션 메시지만 소비자가 읽도록 합니다. 그러나 이로 인해 소비자가 브로커에서 트랜잭션 결과를 기록하는 트랜잭션 마커를 작성할 때까지 메시지를 반환할 수 없기 때문에 엔드 투 엔드 대기 시간이 증가합니다(커밋 또는 중단됨).

# ...
enable.auto.commit=false
isolation.level=read_committed 
1

# ...
Copy to Clipboard Toggle word wrap
1
사용자가 커밋한 메시지만 읽도록 read_committed 로 설정합니다.

4.7. 데이터 손실을 방지하기 위해 실패에서 복구

소비자 그룹 내에서 오류가 발생하는 경우 Kafka는 효과적인 감지 및 복구를 위해 설계된 리밸런스 프로토콜을 제공합니다. 이러한 실패의 잠재적 영향을 최소화하기 위해 하나의 주요 전략은 max.poll.records 속성을 조정하여 시스템 안정성과 효율적인 처리의 균형을 유지하는 것입니다. 이 속성은 소비자가 단일 폴링에서 가져올 수 있는 최대 레코드 수를 결정합니다. fine-tuning max.poll.records 는 제어된 소비률을 유지하는데 도움이 되어 소비자 자신이나 Kafka 브로커를 저해하지 못하도록 합니다.

Kafka는 session.timeout.msheartbeat.interval.ms 와 같은 고급 구성 속성을 제공합니다. 이러한 설정은 일반적으로 보다 특수한 사용 사례를 위해 예약되어 있으며 표준 시나리오에서 조정이 필요하지 않을 수 있습니다.

session.timeout.ms 속성은 소비자가 소비자 그룹 내에서 활성화되어 있음을 나타내기 위해 Kafka 브로커에 하트비트를 보내지 않고 소비자가 이동할 수 있는 최대 시간을 지정합니다. 소비자가 세션 시간 제한 내에서 하트비트를 전송하지 못하면 비활성 상태로 간주됩니다. 비활성으로 표시된 소비자는 주제의 파티션 재조정을 트리거합니다. session.timeout.ms 속성 값을 너무 낮게 설정하면 false-positive 결과가 발생할 수 있지만 너무 높게 설정하면 실패로 인한 복구가 지연될 수 있습니다.

heartbeat.interval.ms 속성은 소비자가 Kafka 브로커에 하트비트를 보내는 빈도를 결정합니다. 연속 하트비트 간의 더 짧은 간격을 통해 소비자 오류를 더 빠르게 감지할 수 있습니다. 하트비트 간격은 세션 시간 초과보다 일반적으로 3 일까지 작아야 합니다. 하트비트 간격을 줄이면 우발적인 재조정 가능성이 줄어들지만 더 자주 하트비트는 브로커 리소스에 대한 오버헤드를 늘립니다.

4.8. 오프셋 정책 관리

auto.offset.reset 속성을 사용하여 오프셋이 커밋되지 않은 경우 소비자가 작동하는 방식을 제어하거나 커밋된 오프셋이 더 이상 유효하지 않거나 삭제되지 않습니다.

소비자 애플리케이션을 처음 배포하고 기존 주제에서 메시지를 읽습니다. group.id 가 처음 사용되므로 __consumer_offsets 항목에 이 애플리케이션에 대한 오프셋 정보가 포함되어 있지 않습니다. 새 애플리케이션은 로그 시작부터 모든 기존 메시지 처리를 시작하거나 새 메시지만 처리할 수 있습니다. 기본 재설정 값은 파티션 끝에 시작되는 latest 이므로 일부 메시지가 누락됨을 의미합니다. 데이터 손실을 피하되 처리 양을 늘리려면 auto.offset.reset가장 빨리 설정하여 파티션 시작 부분에 시작합니다.

또한 브로커에 대해 구성된 오프셋 보존 기간(offsets.retention.minutes)이 종료될 때 메시지가 손실되지 않도록 가장 초기 옵션을 사용하는 것이 좋습니다. 소비자 그룹 또는 독립 실행형 소비자가 비활성 상태이고 보존 기간 동안 오프셋이 없는 경우 이전에 커밋된 오프셋은 __consumer_offsets 에서 삭제됩니다.

# ...
heartbeat.interval.ms=3000 
1

session.timeout.ms=45000 
2

auto.offset.reset=earliest 
3

# ...
Copy to Clipboard Toggle word wrap
1
예상되는 리밸런스에 따라 하트비트 간격을 더 낮게 조정합니다.
2
시간 제한이 만료되기 전에 Kafka 브로커에서 하트비트를 수신하지 않으면 소비자가 소비자 그룹에서 제거되고 재조정이 시작됩니다. 브로커 구성에 group.min.session.timeout.msgroup.max.session.timeout.ms 가 있는 경우 세션 시간 초과 값은 해당 범위 내에 있어야 합니다.
3
파티션 시작으로 돌아가려면 가장 빨리 설정하고 오프셋이 커밋되지 않은 경우 데이터 손실을 방지합니다.

단일 가져오기 요청에서 반환된 데이터 양이 크면 소비자가 처리하기 전에 시간 초과가 발생할 수 있습니다. 이 경우 max.partition.fetch.bytes 를 낮추거나 session.timeout.ms 를 늘릴 수 있습니다.

4.9. 리밸런스의 영향을 최소화

그룹의 활성 소비자 간 파티션 재조정은 다음을 수행하는 데 걸리는 시간입니다.

  • 사용자가 오프셋을 커밋
  • 구성할 새 소비자 그룹입니다.
  • 그룹 구성원에 파티션을 할당하는 그룹 리더
  • 그룹의 소비자가 할당을 수신하고 가져오기 시작합니다.

리밸런싱 프로세스는 특히 소비자 그룹 클러스터를 롤링 재시작하는 동안 반복적으로 발생하는 경우 서비스의 다운타임을 증가시킬 수 있습니다.

이 경우 그룹 내의 각 소비자 인스턴스에 고유 식별자(group.instance.id)를 할당하여 정적 멤버십 을 도입할 수 있습니다. 정적 멤버십에서는 세션 시간 초과 후 다시 시작하는 동안 소비자 인스턴스를 인식할 수 있도록 지속성을 사용합니다. 결과적으로 소비자는 주제 파티션의 할당을 유지 관리하여 실패하거나 다시 시작한 후 불필요한 재조정을 줄일 수 있습니다.

또한 max.poll.interval.ms 구성을 조정하면 긴 처리 작업으로 인한 재조정을 방지할 수 있으므로 새 메시지에 대한 폴링 간 최대 간격을 지정할 수 있습니다. max.poll.records 속성을 사용하여 각 폴링 중에 소비자 버퍼에서 반환된 레코드 수를 제한합니다. 레코드 수를 줄이면 소비자가 더 적은 메시지를 더 효율적으로 처리할 수 있습니다. 메시지 처리가 불가피한 경우 이러한 작업을 작업자 스레드 풀로 오프로드하는 것이 좋습니다. 이러한 병렬 처리 접근 방식은 대량의 레코드가 있는 소비자의 혼란으로 인한 지연 및 잠재적 재조정을 방지합니다.

# ...
group.instance.id=UNIQUE-ID 
1

max.poll.interval.ms=300000 
2

max.poll.records=500 
3

# ...
Copy to Clipboard Toggle word wrap
1
고유한 인스턴스 ID를 사용하면 새 소비자 인스턴스가 주제 파티션의 동일한 할당을 받을 수 있습니다.
2
소비자가 메시지를 계속 처리하고 있는지 확인하려면 간격을 설정합니다.
3
소비자에서 반환된 처리된 레코드 수를 설정합니다.

5장. Kafka 생산자 구성 튜닝

구성 속성을 사용하여 Kafka 생산자의 성능을 최적화합니다. 표준 Kafka 생산자 구성 옵션을 사용할 수 있습니다. 처리량을 극대화하도록 구성을 조정하면 대기 시간이 증가하거나 그 반대의 경우도 발생할 수 있습니다. 필요한 균형을 유지하기 위해 생산자 구성을 실험하고 튜닝해야 합니다.

생산자를 구성할 때 성능 및 동작에 크게 영향을 미치므로 다음 측면을 신중하게 고려하십시오.

압축
네트워크를 통해 전송되기 전에 메시지를 압축하면 네트워크 대역폭을 보존하고 디스크 스토리지 요구 사항을 줄일 수 있지만 압축 및 압축 해제 프로세스로 인해 CPU 사용률이 증가할 수 있습니다.
일괄 처리
생산자가 메시지를 전송할 때 배치 크기 및 시간 간격을 조정하면 처리량 및 대기 시간에 영향을 줄 수 있습니다.
파티셔닝
Kafka 클러스터의 파티셔닝 전략은 병렬 처리 및 로드 밸런싱을 통해 생산자를 지원할 수 있으므로 생산자가 여러 파티션에 동시에 쓸 수 있으며 각 파티션은 동일한 메시지 공유를 수신합니다. 다른 전략에는 내결함성을 위한 복제 주제가 포함될 수 있습니다.
액세스 보안
Kafka에 대한 보안 액세스를 관리하도록 사용자 계정을 설정하여 인증, 암호화 및 권한 부여에 대한 보안 조치를 구현합니다.

5.1. 기본 생산자 구성

모든 생산자에 연결 및 serializer 속성이 필요합니다. 일반적으로 추적을 위해 클라이언트 ID를 추가하고 생산자에 압축을 사용하여 요청의 배치 크기를 줄이는 것이 좋습니다.

기본 생산자 구성에서 다음을 수행합니다.

  • 파티션의 메시지 순서가 보장되지 않습니다.
  • 브로커에 도달하는 메시지에 대한 승인은 지속성을 보장하지 않습니다.

기본 생산자 구성 속성

# ...
bootstrap.servers=localhost:9092 
1

key.serializer=org.apache.kafka.common.serialization.StringSerializer 
2

value.serializer=org.apache.kafka.common.serialization.StringSerializer 
3

client.id=my-client 
4

compression.type=gzip 
5

# ...
Copy to Clipboard Toggle word wrap

1
(필수) Kafka 브로커의 host:port 부트스트랩 서버 주소를 사용하여 Kafka 클러스터에 연결하도록 생산자를 Tells합니다. 생산자는 주소를 사용하여 클러스터의 모든 브로커를 검색하고 연결합니다. 서버가 다운된 경우 쉼표로 구분된 목록을 사용하여 두 개 또는 세 개의 주소를 지정하지만 클러스터의 모든 브로커 목록을 제공할 필요는 없습니다.
2
(필수) 각 메시지의 키를 브로커로 보내기 전에 바이트로 변환하는 Serializer.
3
(필수) 각 메시지의 값을 브로커로 보내기 전에 바이트로 변환하는 Serializer.
4
(선택 사항) 요청 소스를 식별하기 위해 로그 및 메트릭에 사용되는 클라이언트의 논리 이름입니다.
5
(선택 사항) 전송된 메시지를 압축하고 압축 형식으로 저장한 다음 소비자에 도달할 때 압축을 풉니다. 압축은 처리량을 개선하고 스토리지의 부하를 줄이는 데 유용하지만 압축 또는 압축 해제 비용이 금지될 수 있는 짧은 대기 시간 애플리케이션에는 적합하지 않을 수 있습니다.

5.2. 데이터 지속성

메시지 전달 확인은 메시지가 손실될 가능성을 최소화합니다. 기본적으로 승인은 acks 속성이 acks=all 로 설정된 상태에서 활성화됩니다. 생산자가 브로커의 승인을 기다리고 메시지 전송에 잠재적인 지연을 처리하려면 delivery.timeout.ms 속성을 사용할 수 있습니다.

메시지 전달 승인

# ...
acks=all 
1

delivery.timeout.ms=120000 
2

# ...
Copy to Clipboard Toggle word wrap

1
ACKS=all 은 메시지 요청이 성공적으로 수신되었음을 확인하기 전에 리더 복제본이 특정 수의 팔로워에게 메시지를 복제하도록 강제 적용합니다.
2
전체 전송 요청을 대기하는 최대 시간(밀리초)입니다. 값을 MAX_LONG 로 설정하여 무제한 재시도 횟수를 Kafka에 위임할 수 있습니다. 기본값은 120000 또는 2분입니다.

acks=all 설정은 전달의 가장 강력한 보증을 제공하지만 생산자가 메시지를 전송하고 승인을 수신하는 사이에 대기 시간이 증가합니다. 이러한 강력한 보장이 필요하지 않은 경우 acks=0 또는 acks=1 설정은 전달 보장을 제공하지 않거나 리더 복제본에서 레코드를 로그에 기록한 확인만 제공합니다.

acks=all 에서는 모든 in-sync 복제본이 메시지 전달을 승인할 때까지 기다립니다. 주제의 min.insync.replicas 구성은 필요한 최소 동기화 복제본 승인을 설정합니다. 감사의 수에는 리더와 자국인의 수가 포함됩니다.

일반적인 시작점은 다음 구성을 사용하는 것입니다.

  • 생산자 구성:

    • ACKS=all (기본값)
  • 주제 복제에 대한 브로커 구성:

    • default.replication.factor=3 (기본값 = 1)
    • min.insync.replicas=2 (default = 1)

주제를 만들 때 기본 복제 요소를 재정의할 수 있습니다. 주제 구성의 주제 수준에서 min.insync.replicas 를 덮어쓸 수도 있습니다.

Apache Kafka의 스트림은 Kafka의 다중 노드 배포에 대한 구성 파일 예제에서 이 구성을 사용합니다.

다음 표에서는 리더 복제본을 복제하는 팔로워의 가용성에 따라 이 구성이 작동하는 방식을 설명합니다.

Expand
표 5.1. follower 가용성
사용 가능한 채널 및 동기화감사 인사생산자가 메시지를 보낼 수 있습니까?

2

리더는 두 가지 후속 승인을 기다립니다.

제공됨

1

리더는 1개의 후속 승인을 기다리고 있습니다.

제공됨

0

리더는 예외를 발생시킵니다.

없음

3의 주제 복제 요소는 하나의 리더 복제본과 두 명의 유망을 만듭니다. 이 구성에서 단일 팔로워를 사용할 수 없는 경우 프로듀서가 계속될 수 있습니다. 동기화 내 복제본에서 실패한 브로커를 제거하거나 새 리더를 생성하는 동안 일부 지연이 발생할 수 있습니다. 두 번째 팔로워도 사용할 수 없는 경우 메시지 전송이 성공하지 못합니다. 성공적인 메시지 전달을 승인하는 대신 리더는 오류(충분하지 않은 복제본)를 생산자에 보냅니다. 생산자는 동등한 예외를 생성합니다. 재시도 구성을 사용하면 생산자가 실패한 메시지 요청을 다시 보낼 수 있습니다.

참고

시스템이 실패하면 버퍼에 의도하지 않은 데이터가 손실될 위험이 있습니다.

5.3. 주문 배송

멱등 생산자는 메시지가 정확히 한 번 전송되므로 중복을 방지합니다. ID 및 순서 번호는 실패 시에도 전달 순서를 보장하기 위해 메시지에 할당됩니다. 데이터 일관성을 위해 acks=all 을 사용하는 경우 idempotency를 사용하는 것이 좋습니다. 기본적으로 생산자에 대해 멱등이 활성화됩니다. idempotency가 활성화된 경우 메시지 순서를 유지하기 위해 동시 진행 중인 요청 수를 최대 5개로 설정할 수 있습니다.

idempotency로 주문된 제공

# ...
enable.idempotence=true 
1

max.in.flight.requests.per.connection=5 
2

acks=all 
3

retries=2147483647 
4

# ...
Copy to Clipboard Toggle word wrap

1
idempotent 생산자를 활성화하려면 true 로 설정합니다.
2
idempotent delivery를 사용하면 메시지 순서 보장을 계속 제공하는 동안 진행 중인 요청 수가 1보다 클 수 있습니다. 기본값은 5 in-flight 요청입니다.
3
acksall 로 설정합니다.
4
실패한 메시지 요청을 다시 전송하려는 시도 횟수를 설정합니다.

acks=all 을 사용하지 않고 성능 비용 때문에 idempotency를 비활성화하도록 선택하는 경우 순서를 유지하기 위해 in-flight(알림되지 않음) 요청 수를 1로 설정합니다. 그렇지 않으면 Message-B 가 이미 브로커에 기록된 후에만 Message-A 가 성공하지 못하는 상황이 발생할 수 있습니다.

idempotency 없이 주문된 제공

# ...
enable.idempotence=false 
1

max.in.flight.requests.per.connection=1 
2

retries=2147483647
# ...
Copy to Clipboard Toggle word wrap

1
idempotent 생산자를 비활성화하려면 false 로 설정합니다.
2
진행 중인 요청 수를 정확히 1 로 설정합니다.

5.4. 신뢰성 보장

멱등은 단일 파티션에 정확히 한 번 쓰는 데 유용합니다. 멱등과 함께 사용되는 트랜잭션은 여러 파티션에 정확히 한 번의 쓰기를 허용합니다.

트랜잭션을 사용하면 동일한 트랜잭션 ID를 사용하는 메시지가 한 번 생성되고 모두 해당 로그에 성공적으로 기록되거나 중 하나가 표시되지 않습니다.

# ...
enable.idempotence=true
max.in.flight.requests.per.connection=5
acks=all
retries=2147483647
transactional.id=UNIQUE-ID 
1

transaction.timeout.ms=900000 
2

# ...
Copy to Clipboard Toggle word wrap
1
고유한 트랜잭션 ID를 지정합니다.
2
시간 초과 오류가 반환되기 전에 허용되는 최대 트랜잭션 시간을 밀리초 단위로 설정합니다. 기본값은 900000 또는 15분입니다.

transactional.id 를 선택하는 것은 트랜잭션 보장이 유지되는 순서대로 중요합니다. 각 트랜잭션 ID는 고유한 주제 파티션 집합에 사용해야 합니다. 예를 들어, 이는 주제 파티션 이름의 외부 매핑을 트랜잭션 ID에 연결하거나 충돌을 방지하는 함수를 사용하여 주제 파티션 이름에서 트랜잭션 ID를 계산하여 수행할 수 있습니다.

5.5. 처리량 및 대기 시간을 위해 생산자 최적화

일반적으로 시스템의 요구 사항은 지정된 대기 시간 내의 메시지 비율에 대한 특정 처리량 대상을 충족하기 위한 것입니다. 예를 들어 초당 500,000개의 메시지를 대상으로 하는 메시지 중 95%가 2초 이내에 승인됩니다.

생산자의 메시징 의미 체계(메시지 순서 및 지속성)는 애플리케이션의 요구 사항에 따라 정의됩니다. 예를 들어 애플리케이션에서 제공하는 중요한 속성이나 보장을 손상시키지 않고 acks=0 또는 acks=1 을 사용할 수 있는 옵션이 없을 수 있습니다.

브로커 재시작은 높은 백분위 통계에 큰 영향을 미칩니다. 예를 들어 오랜 기간 동안 99번째 백분위 대기 시간이 브로커 재시작에 대한 동작으로 지배됩니다. 이는 벤치마크를 설계하거나 벤치마킹에서 성능 번호를 프로덕션에서 볼 수 있는 성능 수와 비교할 때 고려해야 합니다.

Kafka는 목표에 따라 처리량 및 대기 시간을 위해 생산자 성능 튜닝을 위한 다양한 구성 매개변수와 기술을 제공합니다.

메시지 일괄 처리(linger.msbatch.size)
메시지 일괄 처리는 동일한 브로커로 향하는 더 많은 메시지가 전송되어 단일 생성 요청에 일괄 처리할 수 있기를 바랍니다. 일괄 처리는 처리량이 증가하기 위해 대기 시간이 길기 때문에 지연 시간이 길어집니다.Batching is a compromise between higher latency in return for higher throughput. 시간 기반 일괄 처리는 linger.ms 를 사용하여 구성되며 크기 기반 일괄 처리는 batch.size 를 사용하여 구성됩니다.
압축(compression.type)
메시지 압축은 생산자에 대기 시간을 추가하지만(메시지 압축에 사용된 CPU 시간) 요청(및 잠재적으로 디스크 쓰기)을 줄여 처리량을 높일 수 있습니다. 압축 여부, 사용할 최상의 압축은 전송되는 메시지에 따라 달라집니다. KafkaProducer.send() 를 호출하는 스레드에서 압축이 수행되므로 이 방법의 대기 시간이 애플리케이션에 중요한 경우 더 많은 스레드 사용을 고려해야 합니다.
pipelining (max.in.flight.requests.per.connection)
pipelining은 이전 요청에 대한 응답이 수신되기 전에 더 많은 요청을 보내는 것을 의미합니다. 일반적으로 파이프라이닝은 더 나은 처리량을 의미하며, 이로 인해 더 심각한 일괄 처리와 같은 다른 효과의 경우 처리량에 대한 영향을 대응하기 시작합니다.

대기 시간 단축

애플리케이션이 KafkaProducer.send() 메서드를 호출할 때 메시지는 전송되기 전에 일련의 작업이 수행됩니다.

  • 인터셉션: 메시지는 구성된 인터셉터에서 처리합니다.
  • 직렬화: 메시지는 적절한 형식으로 직렬화됩니다.
  • 파티션 할당: 각 메시지는 특정 파티션에 할당됩니다.
  • 압축: 메시지는 네트워크 대역폭을 보존하도록 압축됩니다.
  • 일괄 처리: 압축된 메시지가 파티션별 큐의 배치에 추가됩니다.

이러한 작업 중에 send() 메서드는 일시적으로 차단됩니다. buffer.memory 가 가득 거나 메타데이터를 사용할 수 없는 경우에도 차단된 상태로 유지됩니다.

배치는 다음 중 하나가 발생할 때까지 큐에 유지됩니다.

  • 배치가 가득 차 있습니다 ( batch.size에 따라 ).
  • linger.ms 에 의해 도입된 지연이 통과되었습니다.
  • 발신자는 다른 파티션에 대한 배치를 동일한 브로커로 디스패치할 준비가 되어 이 배치를 포함할 수 있습니다.
  • 프로듀서가 플러드되거나 닫히고 있습니다.

latency에 대한 send() 차단의 영향을 최소화하려면 일괄 처리 및 버퍼링 구성을 최적화합니다. linger.msbatch.size 속성을 사용하여 처리량이 높은 단일 생성 요청에 더 많은 메시지를 배치합니다.

# ...
linger.ms=100 
1

batch.size=16384 
2

buffer.memory=33554432 
3

# ...
Copy to Clipboard Toggle word wrap
1
linger.ms 속성은 지연을 밀리초 단위로 추가하여 더 큰 메시지 배치를 누적하여 요청으로 보냅니다. 기본값은 0입니다.
2
바이트 단위로 최대 batch.size 를 사용하면 최대값에 도달할 때 요청이 전송되거나 메시지가 linger.ms 보다 오래 대기되었습니다(더 빨리 발생함). 지연을 추가하면 일괄 처리를 통해 일괄 처리로 일괄 처리까지 메시지를 누적할 수 있습니다.
3
버퍼 크기는 배치 크기만큼 커야 하며 버퍼링, 압축 및 진행 중 요청을 수용할 수 있어야 합니다.

처리량 증가

사용자 지정 partitioner를 사용하여 메시지를 지정된 파티션으로 전달하여 메시지 요청의 처리량을 개선하여 기본값을 교체할 수 있습니다.

# ...
partitioner.class=my-custom-partitioner 
1


# ...
Copy to Clipboard Toggle word wrap
1
사용자 지정 파티션의 클래스 이름을 지정합니다.

6장. 대량의 메시지 처리

Apache Kafka 배포에 대한 Streams가 대량의 메시지를 처리해야 하는 경우 구성 옵션을 사용하여 처리량 및 대기 시간을 최적화할 수 있습니다.

생산자 및 소비자 구성은 Kafka 브로커에 대한 요청 크기와 빈도를 제어하는 데 도움이 될 수 있습니다. 구성 옵션에 대한 자세한 내용은 다음을 참조하십시오.

Kafka Connect 런타임 소스 커넥터(MirrorMaker 2) 및 싱크 커넥터에서 사용하는 생산자 및 소비자와 동일한 구성 옵션을 사용할 수도 있습니다.

소스 커넥터
  • Kafka Connect 런타임의 생산자는 Kafka 클러스터에 메시지를 보냅니다.
  • 소스 시스템이 Kafka이므로 MirrorMaker 2의 경우 소비자는 소스 Kafka 클러스터에서 메시지를 검색합니다.
싱크 커넥터
  • Kafka Connect 런타임의 소비자는 Kafka 클러스터에서 메시지를 검색합니다.

소비자의 경우 대기 시간을 줄이기 위해 단일 가져오기 요청에서 가져온 데이터 양을 늘릴 수 있습니다. fetch.max.bytesmax.partition.fetch.bytes 속성을 사용하여 가져오기 요청 크기를 늘립니다. max.poll.records 속성을 사용하여 소비자 버퍼에서 반환된 메시지 수에 대한 최대 제한을 설정할 수도 있습니다.

MirrorMaker 2의 경우 소스로부터 메시지를 가져오는 특정 소비자와 연결되어 있으므로 fetch.max.bytes,max.partition.fetch.bytesmax.poll.records 값을 소스 커넥터 수준(consumer.*)에서 구성합니다.

생산자의 경우 단일 생성 요청으로 전송된 메시지 배치 크기를 늘릴 수 있습니다. batch.size 속성을 사용하여 배치 크기를 늘립니다. 대규모 배치 크기는 전송할 준비가 된 미해결 메시지 수와 메시지 큐의 백로그 크기를 줄입니다. 동일한 파티션으로 전송되는 메시지는 함께 일괄 처리됩니다. 배치 크기에 도달하면 생성 요청이 대상 클러스터로 전송됩니다. 배치 크기를 늘리면 생성 요청이 지연되고 더 많은 메시지가 일괄 처리에 추가되고 동시에 브로커로 전송됩니다. 이렇게 하면 많은 수의 메시지를 처리하는 몇 가지 주제 파티션이 있는 경우 처리량이 향상될 수 있습니다.

생산자가 적절한 생산자 배치 크기에 대해 처리하는 레코드의 수와 크기를 고려하십시오.

linger.ms 를 사용하여 생산자 로드가 감소할 때 요청 생성을 지연하기 위해 대기 시간(밀리초)을 추가합니다. 지연은 최대 배치 크기에 있는 경우 배치에 더 많은 레코드를 추가할 수 있음을 의미합니다.

대상 Kafka 클러스터에 메시지를 보내는 특정 생산자와 관련이 있으므로 소스 커넥터 수준(producer.override.*)에서 batch.sizelinger.ms 값을 구성합니다.

Kafka Connect 소스 커넥터의 경우 대상 Kafka 클러스터에 대한 데이터 스트리밍 파이프라인은 다음과 같습니다.

Kafka Connect 소스 커넥터용 데이터 스트리밍 파이프라인

외부 데이터 소스 → (Kafka Connect 작업) 소스 메시지 큐 → 생산자 버퍼 → 대상 Kafka 주제

Kafka Connect 싱크 커넥터의 경우 대상 외부 데이터 소스에 대한 데이터 스트리밍 파이프라인은 다음과 같습니다.

Kafka Connect 싱크 커넥터의 데이터 스트리밍 파이프라인

소스 Kafka 주제 → (Kafka Connect 작업) 싱크 메시지 큐 → 소비자 버퍼 → 외부 데이터 소스

MirrorMaker 2의 경우 대상 Kafka 클러스터에 대한 데이터 미러링 파이프라인은 다음과 같습니다.

MirrorMaker 2의 데이터 미러링 파이프라인

소스 Kafka 주제 → (Kafka Connect 작업) 소스 메시지 큐 → 생산자 버퍼 → 대상 Kafka 주제

생산자는 버퍼의 메시지를 대상 Kafka 클러스터의 주제로 보냅니다. 이러한 상황이 발생하는 동안 Kafka Connect 작업은 데이터 소스를 폴링하여 소스 메시지 큐에 메시지를 추가합니다.

소스 커넥터의 생산자 버퍼 크기는 producer.override.buffer.memory 속성을 사용하여 설정됩니다. 작업은 버퍼가 플러시되기 전에 지정된 시간 초과 기간(offset.flush.timeout.ms)을 기다립니다. 전송된 메시지가 브로커에 의해 승인되고 커밋된 데이터 오프셋에 충분한 시간이 되어야 합니다. 소스 작업에서는 종료 중을 제외하고 오프셋을 커밋하기 전에 생산자가 메시지 큐를 비우기를 기다리지 않습니다.

생산자가 소스 메시지 큐의 메시지 처리량을 유지할 수 없는 경우 max.block.ms 가 바인딩된 시간 내에 버퍼에 사용 가능한 공간이 있을 때까지 버퍼링이 차단됩니다. 이 기간 동안 승인되지 않은 모든 메시지가 버퍼에 계속 전송됩니다. 이러한 메시지가 승인되고 플러시될 때까지 새 메시지가 버퍼에 추가되지 않습니다.

다음 구성 변경을 시도하여 미해결 메시지의 기본 소스 메시지 큐를 관리 가능한 크기로 유지할 수 있습니다.

  • offset.flush.timeout.ms의 기본값을 밀리초 단위로 늘리기
  • CPU 및 메모리 리소스가 충분한지 확인
  • 다음을 수행하여 병렬로 실행되는 작업 수를 늘립니다.

    • tasksMax 속성을 사용하여 병렬로 실행되는 작업 수 증가
    • replicas 속성을 사용하여 작업을 실행하는 작업자 노드 수 증가

사용 가능한 CPU 및 메모리 리소스 및 작업자 노드 수에 따라 병렬로 실행할 수 있는 작업 수를 고려하십시오. 원하는 효과를 얻을 때까지 구성 값을 계속 조정해야 할 수 있습니다.

6.1. 대용량 메시지에 대한 Kafka Connect 구성

Kafka Connect는 소스 외부 데이터 시스템에서 데이터를 가져와서 Kafka Connect 런타임 생산자에 전달하여 대상 클러스터에 복제됩니다.

다음 예제에서는 KafkaConnect 사용자 정의 리소스를 사용한 Kafka Connect에 대한 구성을 보여줍니다.

대량의 메시지를 처리하기 위한 Kafka Connect 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: my-connect-cluster
  annotations:
    strimzi.io/use-connector-resources: "true"
spec:
  replicas: 3
  config:
    offset.flush.timeout.ms: 10000
    # ...
  resources:
    requests:
      cpu: "1"
      memory: 2Gi
    limits:
      cpu: "2"
      memory: 2Gi
  # ...
Copy to Clipboard Toggle word wrap

KafkaConnector 사용자 정의 리소스를 사용하여 관리되는 소스 커넥터에 대한 생산자 구성이 추가됩니다.

대량의 메시지를 처리하기 위한 소스 커넥터 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnector
metadata:
  name: my-source-connector
  labels:
    strimzi.io/cluster: my-connect-cluster
spec:
  class: org.apache.kafka.connect.file.FileStreamSourceConnector
  tasksMax: 2
  config:
    producer.override.batch.size: 327680
    producer.override.linger.ms: 100
    # ...
Copy to Clipboard Toggle word wrap

참고

FileStreamSourceConnectorFileStreamSinkConnector 는 예제 커넥터로 제공됩니다. KafkaConnector 리소스로 배포하는 방법에 대한 자세한 내용은 KafkaConnector 리소스 배포를 참조하십시오.

싱크 커넥터에 대한 소비자 구성이 추가됩니다.

대량의 메시지를 처리하기 위한 싱크 커넥터 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnector
metadata:
  name: my-sink-connector
  labels:
    strimzi.io/cluster: my-connect-cluster
spec:
  class: org.apache.kafka.connect.file.FileStreamSinkConnector
  tasksMax: 2
  config:
    consumer.fetch.max.bytes: 52428800
    consumer.max.partition.fetch.bytes: 1048576
    consumer.max.poll.records: 500
    # ...
Copy to Clipboard Toggle word wrap

커넥터를 관리하기 위해 KafkaConnector 사용자 정의 리소스 대신 Kafka Connect API를 사용하는 경우 커넥터 구성을 JSON 오브젝트로 추가할 수 있습니다.

대량의 메시지를 처리하기 위한 소스 커넥터 구성을 추가하는 curl 요청의 예

curl -X POST \
  http://my-connect-cluster-connect-api:8083/connectors \
  -H 'Content-Type: application/json' \
  -d '{ "name": "my-source-connector",
    "config":
    {
      "connector.class":"org.apache.kafka.connect.file.FileStreamSourceConnector",
      "file": "/opt/kafka/LICENSE",
      "topic":"my-topic",
      "tasksMax": "4",
      "type": "source"
      "producer.override.batch.size": 327680
      "producer.override.linger.ms": 100
    }
}'
Copy to Clipboard Toggle word wrap

6.2. 대용량 메시지에 대한 MirrorMaker 2 구성

MirrorMaker 2는 소스 클러스터에서 데이터를 가져와서 Kafka Connect 런타임 생산자에 전달하여 대상 클러스터에 복제되도록 합니다.

다음 예제에서는 KafkaMirrorMaker2 사용자 정의 리소스를 사용한 MirrorMaker 2에 대한 구성을 보여줍니다.

대량의 메시지를 처리하기 위한 MirrorMaker 2 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
  name: my-mirror-maker2
spec:
  version: 3.7.0
  replicas: 1
  connectCluster: "my-cluster-target"
  clusters:
  - alias: "my-cluster-source"
    bootstrapServers: my-cluster-source-kafka-bootstrap:9092
  - alias: "my-cluster-target"
    config:
      offset.flush.timeout.ms: 10000
    bootstrapServers: my-cluster-target-kafka-bootstrap:9092
  mirrors:
  - sourceCluster: "my-cluster-source"
    targetCluster: "my-cluster-target"
    sourceConnector:
      tasksMax: 2
      config:
        producer.override.batch.size: 327680
        producer.override.linger.ms: 100
        consumer.fetch.max.bytes: 52428800
        consumer.max.partition.fetch.bytes: 1048576
        consumer.max.poll.records: 500
    # ...
  resources:
    requests:
      cpu: "1"
      memory: Gi
    limits:
      cpu: "2"
      memory: 4Gi
Copy to Clipboard Toggle word wrap

6.3. MirrorMaker 2 메시지 흐름 확인

Prometheus 및 Grafana를 사용하여 배포를 모니터링하는 경우 MirrorMaker 2 메시지 흐름을 확인할 수 있습니다.

Apache Kafka용 Streams와 함께 제공되는 MirrorMaker 2 Grafana 대시보드 예제에서는 플러시 파이프라인과 관련된 다음 메트릭을 보여줍니다.

  • Kafka Connect의 미해결 메시지 대기열의 메시지 수
  • 생산자 버퍼의 사용 가능한 바이트
  • 오프셋 커밋 시간(밀리초)

이러한 메트릭을 사용하여 메시지 볼륨에 따라 구성을 조정해야 하는지 여부를 평가할 수 있습니다.

7장. 큰 메시지 크기 처리

메시지에 대한 Kafka의 기본 배치 크기는 1MB이며 대부분의 사용 사례에서 최대 처리량에 적합합니다. Kafka는 적절한 디스크 용량을 가정하면 처리량이 감소된 대규모 배치를 수용할 수 있습니다.

큰 메시지 크기는 다음 네 가지 방법으로 처리할 수 있습니다.

  1. 브로커, 생산자 및 소비자는 더 큰 메시지 크기를 수용하도록 구성됩니다.
  2. 생산자 측 메시지 압축 은 압축 메시지를 로그에 씁니다.
  3. 참조 기반 메시징은 메시지 페이로드에 다른 시스템에 저장된 데이터에 대한 참조만 전송합니다.
  4. 인라인 메시징은 메시지를 동일한 키를 사용하는 청크로 분할한 다음 Kafka Streams와 같은 스트림 프로세서를 사용하여 출력에 결합됩니다.

매우 큰 메시지를 처리하지 않는 한 구성 방법을 사용하는 것이 좋습니다. 참조 기반 메시징 및 메시지 압축 옵션은 다른 대부분의 상황을 다룹니다. 이러한 옵션을 사용하면 성능 문제가 발생하지 않도록 주의해야 합니다.

7.1. 대규모 메시지를 처리하도록 Kafka 구성 요소 구성

대규모 메시지는 시스템 성능에 영향을 미칠 수 있으며 메시지 처리의 복잡성이 발생할 수 있습니다. 방지할 수 없는 경우 구성 옵션을 사용할 수 있습니다. 더 큰 메시지를 효율적으로 처리하고 메시지 흐름에서 블록을 방지하려면 다음 구성을 조정하는 것이 좋습니다.

  • 최대 레코드 배치 크기를 조정합니다.

    • 모든 주제에 대해 더 큰 레코드 배치 크기를 지원하려면 브로커 수준에서 message.max.bytes 를 설정합니다.
    • 개별 주제의 경우 더 큰 레코드 배치 크기를 지원하려면 주제 수준에서 max.message.bytes 를 설정합니다.
  • 각 파티션 팔로워에서 가져온 최대 메시지 크기를 늘립니다(replica.fetch.max.bytes).
  • 생산자가 단일 생성 요청으로 전송된 메시지 일괄 처리 크기를 늘리기 위해 생산자의 배치 크기(batch.size)를 늘립니다.
  • 더 큰 레코드 일괄 처리를 수용하도록 생산자(max.request.size) 및 소비자(fetch.max.bytes)에 대한 최대 요청 크기를 구성합니다.
  • 각 파티션의 소비자에 대한 최대 한도(max.partition.fetch.bytes)를 설정합니다.

일괄 요청의 최대 크기가 가장 큰 레코드 배치 크기를 수용하려면 message.max.bytes 만큼 커야 합니다.

브로커 구성 예

message.max.bytes: 10000000
replica.fetch.max.bytes: 10485760
Copy to Clipboard Toggle word wrap

생산자 구성의 예

batch.size: 327680
max.request.size: 10000000
Copy to Clipboard Toggle word wrap

소비자 구성 예

fetch.max.bytes: 10000000
max.partition.fetch.bytes: 10485760
Copy to Clipboard Toggle word wrap

더 큰 메시지를 더 효과적으로 처리하기 위해 Kafka Bridge, Kafka Connect 및 MirrorMaker 2와 같은 다른 Kafka 구성 요소에서 사용하는 생산자 및 소비자를 구성할 수도 있습니다.

Kafka Bridge

특정 생산자 및 소비자 구성 속성을 사용하여 Kafka 브리지를 구성합니다.

  • 생산자를 위한 producer.config
  • 소비자용 consumer.config

Kafka 브리지 구성 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaBridge
metadata:
  name: my-bridge
spec:
  # ...
  producer:
    config:
      batch.size: 327680
      max.request.size: 10000000
  consumer:
    config:
      fetch.max.bytes: 10000000
      max.partition.fetch.bytes: 10485760
      # ...
Copy to Clipboard Toggle word wrap

Kafka Connect

Kafka Connect의 경우 생산자 및 소비자 구성 속성에 대한 접두사를 사용하여 메시지를 보내고 검색하는 소스 및 싱크 커넥터를 구성합니다.

  • Kafka 클러스터에 메시지를 전송하기 위해 소스 커넥터에서 사용하는 생산자에 대한 producer.override
  • Kafka 클러스터에서 메시지를 검색하기 위해 싱크 커넥터에서 사용하는 소비자의 소비자

Kafka Connect 소스 커넥터 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnector
metadata:
  name: my-source-connector
  labels:
    strimzi.io/cluster: my-connect-cluster
spec:
  # ...
  config:
    producer.override.batch.size: 327680
    producer.override.max.request.size: 10000000
    # ...
Copy to Clipboard Toggle word wrap

Kafka Connect 싱크 커넥터 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnector
metadata:
  name: my-sink-connector
  labels:
    strimzi.io/cluster: my-connect-cluster
spec:
  # ...
  config:
    consumer.fetch.max.bytes: 10000000
    consumer.max.partition.fetch.bytes: 10485760
    # ...
Copy to Clipboard Toggle word wrap

MirrorMaker 2

MirrorMaker 2의 경우 생산자 및 소비자 구성 속성에 접두사를 사용하여 소스 Kafka 클러스터에서 메시지를 검색하는 소스 커넥터를 구성합니다.

  • 데이터를 대상 Kafka 클러스터에 복제하는 데 사용되는 런타임 Kafka Connect 생산자에 대한 producer.override
  • 소스 Kafka 클러스터에서 메시지를 검색하기 위해 싱크 커넥터에서 사용하는 소비자의 소비자

MirrorMaker 2 소스 커넥터 구성의 예

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
  name: my-mirror-maker2
spec:
  # ...
  mirrors:
  - sourceCluster: "my-cluster-source"
    targetCluster: "my-cluster-target"
    sourceConnector:
      tasksMax: 2
      config:
        producer.override.batch.size: 327680
        producer.override.max.request.size: 10000000
        consumer.fetch.max.bytes: 10000000
        consumer.max.partition.fetch.bytes: 10485760
        # ...
Copy to Clipboard Toggle word wrap

7.2. 생산자 측 압축

생산자 구성의 경우 생산자가 생성한 데이터의 배치에 적용되는 Gzip과 같은 compression.type 을 지정합니다. 브로커 구성 compression.type=producer (기본값)를 사용하여 브로커는 생산자가 사용한 압축을 유지합니다. 생산자 및 주제 압축이 일치하지 않을 때마다 브로커는 로그에 추가하기 전에 일괄 처리를 다시 압축해야 브로커 성능에 영향을 미칩니다.

압축은 또한 소비자에 생산자 및 압축 해제 오버헤드에 추가 처리 오버헤드를 추가하지만 배치에 더 많은 데이터를 포함하므로 메시지 데이터가 잘 압축될 때 처리량에 도움이 되는 경우가 많습니다.

생산자 측 압축을 배치 크기의 미세 조정과 결합하여 처리량을 극대화할 수 있습니다. 메트릭을 사용하면 필요한 평균 배치 크기를 측정하는 데 도움이 됩니다.

7.3. 참조 기반 메시징

참조 기반 메시징은 메시지의 규모를 모르는 경우 데이터 복제에 유용합니다. 외부 데이터 저장소는 이 구성이 작동하려면 빠르고 사용 가능한 고가용성이어야 합니다. 데이터는 데이터 저장소에 기록되고 데이터에 대한 참조가 반환됩니다. 생산자는 Kafka에 대한 참조가 포함된 메시지를 보냅니다. 소비자는 메시지에서 참조를 가져와서 이를 사용하여 데이터 저장소에서 데이터를 가져옵니다.

7.4. 참조 기반 메시징 흐름

메시지 전달에는 더 많은 여행이 필요하므로 엔드 투 엔드 대기 시간이 증가합니다. 이 접근 방식의 또 다른 중요한 단점은 Kafka 메시지가 정리될 때 외부 시스템의 데이터를 자동으로 정리하지 않는다는 것입니다. 하이브리드 접근 방식은 대규모 메시지를 데이터 저장소로만 전송하고 표준 크기의 메시지를 직접 처리하는 것입니다.

인라인 메시징

인라인 메시징은 복잡하지만 참조 기반 메시징과 같은 외부 시스템에 따라 의 오버헤드가 없습니다.

생성 클라이언트 애플리케이션은 메시지가 너무 크면 데이터를 직렬화한 다음 청크해야 합니다. 그런 다음 생산자는 Kafka Cryostat ArraySerializer 를 사용하거나 각 청크를 보내기 전에 다시 직렬화하는 것과 유사합니다. 소비자는 전체 메시지가 있을 때까지 메시지 및 버퍼 청크를 추적합니다. 클라이언트 애플리케이션을 사용하는 애플리케이션은 역직렬화 전에 어셈블되는 청크를 수신합니다. 전체 메시지는 청크된 각 메시지 세트에 대한 첫 번째 또는 마지막 청크 오프셋에 따라 소비되는 애플리케이션의 나머지 부분에 전달됩니다.

소비자는 모든 메시지 청크를 수신하고 처리한 후에만 오프셋을 커밋하여 메시지 전달을 정확하게 추적하고 재조정하는 동안 중복을 방지해야 합니다. 청크는 세그먼트에 분산될 수 있습니다. 소비자 측 처리는 나중에 세그먼트를 삭제할 때 청크를 사용할 수 없게 되는 가능성을 포함해야 합니다.

그림 7.1. 인라인 메시징 흐름

인라인 메시징은 특히 일련의 대규모 메시지를 병렬로 처리할 때 필요한 버퍼링 때문에 소비자 측에서 성능 오버헤드가 발생합니다. 버퍼에 있는 다른 대규모 메시지의 청크가 불완전하면 메시지의 모든 청크가 사용되었을 때 커밋할 수 없도록 대규모 메시지의 청크가 인터리브될 수 있습니다. 이러한 이유로 메시지 청크를 유지하거나 커밋 논리를 구현하여 버퍼링이 일반적으로 지원됩니다.

부록 A. 서브스크립션 사용

Apache Kafka의 스트림은 소프트웨어 서브스크립션을 통해 제공됩니다. 서브스크립션을 관리하려면 Red Hat 고객 포털에서 계정에 액세스하십시오.

계정 액세스

  1. access.redhat.com 으로 이동합니다.
  2. 계정이 없는 경우 계정을 생성합니다.
  3. 계정에 로그인합니다.

서브스크립션 활성화

  1. access.redhat.com 으로 이동합니다.
  2. 내 서브스크립션 으로 이동합니다.
  3. 서브스크립션 활성화로 이동하여 16자리 활성화 번호를 입력합니다.

Zip 및 Tar 파일 다운로드

zip 또는 tar 파일에 액세스하려면 고객 포털을 사용하여 다운로드할 관련 파일을 찾습니다. RPM 패키지를 사용하는 경우 이 단계는 필요하지 않습니다.

  1. 브라우저를 열고 Red Hat Customer Portal 제품 다운로드 페이지에 access.redhat.com/downloads.
  2. INTEGRATION 및 AUTOMATION 카테고리에서 Apache Kafka에 대한 Streams for Apache Kafka 항목을 찾습니다.
  3. Apache Kafka 제품에 대해 원하는 Streams를 선택합니다. 소프트웨어 다운로드 페이지가 열립니다.
  4. 구성 요소에 대한 다운로드 링크를 클릭합니다.

DNF를 사용하여 패키지 설치

패키지 및 모든 패키지 종속 항목을 설치하려면 다음을 사용합니다.

dnf install <package_name>
Copy to Clipboard Toggle word wrap

로컬 디렉터리에서 이전에 다운로드한 패키지를 설치하려면 다음을 사용합니다.

dnf install <path_to_download_package>
Copy to Clipboard Toggle word wrap

2024-05-30에 최종 업데이트된 문서

법적 공지

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat