Kafka 할당량 설정
Kafka 할당량은 클라이언트가 사용하는 브로커 자원을 제어하기 위해 생성 및 이용 요청에 대한 한계를 적용합니다. Kafka 할당량을 사용하면 관리자가 개별 생성자 및 이용자 애플리케이션에서 사용할 수 있는 네트워크 처리량에 대한 한계를 적용할 수 있습니다.
Kafka 할당량 정보
제한되지 않은 상태로 두면 소수의 이용자 또는 생성자가 서비스 인스턴스에 대해 사용 가능한 네트워크 처리량을 독점할 수 있습니다.
Kafka 브로커는 클라이언트가 네트워크를 포화시키거나 브로커 자원을 독점하는 것을 방지하기 위해 비율 한계를 적용하는 할당량을 지원합니다. 자세한 정보는 다음을 참조하십시오.
Apache Kafka 문서.
Kafka 할당량은 네트워크 대역폭 사용량을 제한하도록 구성할 수 있습니다. Kafka 는 초당 바이트 수로 이 처리량을 측정합니다. 30초동안의 처리량이 구성된 할당량을 초과하는 경우, Kafka 는 할당량 한계 내에서 처리량을 가져오기 위한 충분한 지연을 계산합니다.
Kafka 브로커는 표준 Kafka 프로토콜 응답의 일부로 클라이언트에 지연 정보를 송신합니다. 프로토콜 계약을 고려하여 협업 클라이언트는 새 요청을 작성하기 전에 이 지연을 기다립니다. 비협업 클라이언트는 조정 요청을 존중하지 않을 수 있지만, 이 경우 브로커는 조정 지연이 경과할 때까지 (비협업 클라이언트에서 제한시간을 초과할 수 있음) 클라이언트의 요청을 읽지 않습니다.
할당량에 적용되는 정보는 다음과 같습니다.
- 생성자 및 이용자에 대해 별도의 할당량을 정의할 수 있습니다.
- 기본적으로 클라이언트 할당량은 무제한입니다.
- 할당량은 클러스터가 아닌 브로커별로 적용됩니다.
- 할당량은 단일 사용자 ID를 공유하는 모든 클라이언트에 적용됩니다.
- 할당량은 '기본' 사용자에게 적용될 수 있으므로 사용자 특정 할당량이 설정되지 않은 사용자에게도 적용됩니다.
클라이언트 지표
또한 Java 클라이언트는 다음과 같은 브로커별 메트릭을 사용하여 대역폭 조절 정보를 표시합니다.
- 생성-조절-시간-최대
- 생성 조절 시간 평균
- fetch-throttle-time-max
- fetch-throttle-time-avg
클라이언트 할당량 설정
IBM® Event Streams for IBM Cloud® 엔터프라이즈 플랜을 사용하면 Kafka API를 사용하여 Kafka V3.1.x 클러스터에서 할당량을 설정하고 설명할 수 있습니다. 자세한 정보는 IBM® Event Streams for IBM Cloud® Admin REST API의 할당량 조작 섹션 을 참조하십시오.
할당량에 대한 Kafka 문서 에 대한 참조로, "user" 엔티티 (또는 "default user") 에 적용된 처리량 할당량 유형 ("producer_byte_rate" 및 "consumer_byte_rate" 할당량 유형) 만 지원됩니다.
"client-id" 엔티티, "request" 및 "controller-mutation" 할당량 유형은 사용자 설정 가능 할당량으로 지원되지 않습니다. Event Streams에서 인증된 사용자 ID는 IBM Cloud® Identity and Access Management ID로 표시됩니다. Kafka 할당량은 Cloud Identity and Access Management
ID마다 적용되므로, API키 그룹이 모두 동일한 Cloud Identity and Access Management 서비스 ID에 속하는 경우 API키 그룹이 단일 할당량을 공유할 수 있습니다.
Cloud Identity and Access Management (IAM) 서비스 ID의 Cloud Identity and Access Management ID를 얻기 위해 IBM Cloud CLI를 사용할 수 있습니다.
ibmcloud iam service-id ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab --output json
다음 예제 출력을 참조하십시오.
{
"active":true,
"jti":"...",
"iam_id":"iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab",
"realmId":"iam",
....
}
IBM Event Streams 엔터프라이즈 클러스터에 할당량 맵핑
Kafka API 할당량은 브로커당이지만 엔터프라이즈 플랜 용량은 클러스터당 처리량 으로 설명됩니다. 따라서 사용자를 총 10MB/s로 제한하려면 10/n MB/s의 할당량을 각 브로커에 적용합니다 (여기서 n은 클러스터의 브로커 수임).
클러스터에서 브로커 수를 찾기 위해 KafkaAdminClient.describeCluster 호출을 사용할 수 있습니다.
자세한 정보는 Java 문서 를 참조하십시오.
브로커 수는 Apache Kafka 배포판에 번들된 kafka-configs.sh 쉘 스크립트를 사용하여 찾을 수도 있습니다.
bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --describe --entity-type brokers
Event Streams 권한 부여
클라이언트 할당량을 설정할 수 있도록 권한을 부여하려면 사용자에게 Cloud Identity and Access Management의 "클러스터" 리소스에 대한 관리자 역할이 있어야 합니다.
인스턴스에 대한 관리자 역할이 있는 Event Streams UI를 사용하여 작성된 신임 정보 세트에도 클러스터에 대한 관리자 역할이 있습니다. 따라서 할당량 설정 외에 토픽을 작성, 삭제 및 대체할 수 있습니다. 인증된 사용자는 클러스터에 대한 독자 역할이 내재되어 있으며 할당량을 설명할 수 있습니다.
토픽, 그룹을 관리하고 트랜잭션에 참여할 수 있지만 할당량을 설정하도록 권한 부여되지 않은 신임 정보 세트를 작성하려면 리소스 유형 "topic", "group" 및 "txnid" 에 대한 관리자 역할과 "cluster" 에 대한 독자 역할이 있는 IAM 액세스 정책이 서비스 ID와 연관되어야 합니다.
예제: the kafka-config.sh 스크립트를 사용하여 할당량 관리 (Apache 클라이언트)
-
Kafka 2진 배포 (최소 V3.1.0) 를 다운로드하십시오.
-
다음 항목을 포함하는 특성 파일 (다음 명령행 예제에서는 command-config.properties ) 을 작성하십시오 ("myapikey" 를 실제 API키로 대체).
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="token" password="myapikey";
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
ssl.protocol=TLSv1.2
ssl.enabled.protocols=TLSv1.2
ssl.endpoint.identification.algorithm=HTTPS
자세한 정보는 Kafka API 클라이언트 구성을 참조하십시오.
-
다음 사용법 예제를 사용하여 작업하십시오.
bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --alter --add-config 'producer_byte_rate=1024,
consumer_byte_rate=2048' --entity-type users --entity-name iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab
iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab 사용자에 대한 구성 업데이트가 완료되었습니다.
bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --describe --entity-type users --entity-name
iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab
사용자 프린시펄 iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab 에 대한 할당량 구성은 consumer_byte_rate=2048.0 및 producer_byte_rate=1024.0 입니다.
bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --alter --delete-config 'producer_byte_rate,consumer_byte_rate' --entity-type users --entity-name iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab
iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab 사용자에 대한 구성 업데이트가 완료되었습니다.
- 기본 사용자를 포함하여 모든 사용자에게 설정된 모든 할당량을 설명하십시오.
bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --describe --entity-type users
bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --alter --add-config 'producer_byte_rate=1024,
consumer_byte_rate=2048' --entity-type users --entity-default
클러스터의 사용자에 대한 기본 구성 업데이트를 완료했습니다.
bin/kafka-configs.sh --command-config command-config.properties --bootstrap-server "kafka-0.blah.cloud:9093" --alter --delete-config 'producer_byte_rate,
consumer_byte_rate' --entity-type users --entity-default
클러스터의 사용자에 대한 기본 구성 업데이트를 완료했습니다.
예제: Java API를 통해 처리량 할당량 사용 변경
다음 예제는 KafkaAdminClient.alterclientQuotas 메소드를 호출하는 방법을 보여주는 간단한 샘플 스니펫입니다.
https://kafka.apache.org/32/javadoc/org/apache/kafka/clients/admin/KafkaAdminClient.html
Options)
import java.util.*;
import org.apache.kafka.clients.CommonClientConfigs;
import org.apache.kafka.clients.admin.*;
import org.apache.kafka.common.config.*;
import org.apache.kafka.common.quota.*;
class Snippet {
public static void main(String[] args) throws Exception {
// Kafka client configuration properties.
String mybootstrap = "..."; // from the bootstrap_endpoints of the service credentials
String myapikey = "..."; // from the apikey of the service credentials
Properties properties = new Properties();
properties.put(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, mybootstrap);
properties.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "sasl_ssl");
properties.put(SslConfigs.SSL_ENABLED_PROTOCOLS_CONFIG, "TLSv1.2");
properties.put(SslConfigs.SSL_PROTOCOL_CONFIG, "TLSv1.2");
properties.put(SaslConfigs.SASL_MECHANISM, "PLAIN");
properties.put(SaslConfigs.SASL_JAAS_CONFIG,
"org.apache.kafka.common.security.plain.PlainLoginModule " +
"required username=\"token\" password=\"" + myapikey + "\";");
AdminClient admin = AdminClient.create(properties);
String iamID = "iam-ServiceId-12345678-aaaa-bbbb-cccc-1234567890ab"; //set iam id of target user to set quotas to
// if null is used instead of the iamID string, the following quota alteration will be applied to the default user
// add quotas
ClientQuotaEntity entity = new ClientQuotaEntity(
Collections.singletonMap(ClientQuotaEntity.USER, iamID));
ClientQuotaAlteration alteration = new ClientQuotaAlteration(entity,
Arrays.asList(new ClientQuotaAlteration.Op("consumer_byte_rate", 1000.0),
new ClientQuotaAlteration.Op("producer_byte_rate", 1000.0)));
admin.alterClientQuotas(Arrays.asList(alteration)).all().get();
// describe quotas
DescribeClientQuotasResult describeClientQuotasFuture = admin.describeClientQuotas(ClientQuotaFilter.all());
System.out.println(describeClientQuotasFuture.entities().get());
//remove quotas (set them to null)
entity = new ClientQuotaEntity(Collections.singletonMap(ClientQuotaEntity.USER, iamID));
alteration = new ClientQuotaAlteration(entity,
Arrays.asList(new ClientQuotaAlteration.Op("consumer_byte_rate", null),
new ClientQuotaAlteration.Op("producer_byte_rate", null)));
admin.alterClientQuotas(Arrays.asList(alteration)).all().get();
}
}
IBM Cloud Activity Tracker 이벤트
처리량 할당량이 업데이트될 때마다 Event Streams 구성 이벤트가 생성되며, 이는 IBM Cloud® Activity Tracker에서 모니터할 수 있습니다.
Event Streams에 대한 Activity Tracker 이벤트 구성에 대한 자세한 정보는 Activity Tracker 문서 를 참조하십시오.