View a markdown version of this page

Amazon MSK Replicator 문제 해결 - Amazon Managed Streaming for Apache Kafka

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon MSK Replicator 문제 해결

다음 정보는 MSK Replicator 관련 문제를 해결하는 데 도움이 될 수 있습니다. 다른 Amazon MSK 기능은 섹션을 참조Amazon MSK 클러스터 문제 해결하세요. 또한 AWS re:Post에 문제를 게시할 수 있습니다.

복제기 상태가 CREATING에서 FAILED로 전환됩니다.

MSK Replicator 생성 실패의 일반적인 원인:

  1. 대상 클러스터에 제공한 보안 그룹에 대상 클러스터의 보안 그룹에 대한 트래픽을 허용하는 아웃바운드 규칙이 있고 대상 클러스터의 보안 그룹에 복제기 보안 그룹의 트래픽을 수락하는 인바운드 규칙이 있는지 확인합니다.

  2. 리전 간 복제의 경우 소스 클러스터에 IAM 액세스 제어를 위한 다중 VPC 연결이 켜져 있고 클러스터 정책이 소스 클러스터에 설정되어 있는지 확인합니다.

  3. 생성 중에 제공된 IAM 역할에 주제에 대한 쓰기 권한을 포함하여 소스 및 대상 클러스터를 읽고 쓰는 데 필요한 권한이 있는지 확인합니다.

  4. 네트워크 ACLs MSK Replicator와 클러스터 간의 연결을 차단하지 않는지 확인합니다.

  5. MSK Replicator가 연결을 시도할 때 소스 또는 대상 클러스터를 완전히 사용할 수 없을 수 있습니다. 이는 과도한 로드, 디스크 사용량 또는 CPU 사용량 때문일 수 있습니다. 브로커 관련 문제를 해결하고 복제기 생성을 다시 시도합니다.

위의 검증을 수행한 후 MSK Replicator를 다시 생성합니다.

복제기가 CREATING 상태에서 멈춘 것처럼 보임

MSK Replicator 생성에는 최대 30분이 걸릴 수 있습니다. 30분간 기다렸다가 복제기의 상태를 다시 확인합니다.

복제기가 데이터를 복제하지 않거나 부분 데이터만 복제하고 있습니다.

  1. Amazon CloudWatch의 AuthError 지표를 사용하여 Replicator에서 인증 오류가 발생하지 않는지 확인합니다. 이 지표가 0을 초과하는 경우 IAM 역할 정책을 확인하고 클러스터 권한에 대해 설정된 거부 권한이 없는지 확인합니다.

  2. 소스 및 대상 클러스터에 문제가 없는지 확인합니다(연결이 너무 많거나 전체 용량의 디스크가 있거나 CPU 사용량이 많음).

  3. KafkaClusterPingSuccessCount 지표를 사용하여 클러스터에 연결할 수 있는지 확인합니다. 이 지표가 0이거나 데이터 포인트가 없는 경우 네트워크 및 IAM 역할 권한을 확인합니다.

  4. ReplicatorFailure 지표를 사용하여 Replicator에 오류가 발생하지 않는지 확인합니다. 0을 초과하는 경우 IAM 역할에서 주제 수준 권한을 확인합니다.

  5. 허용 목록의 정규식이 복제하려는 주제의 이름과 일치하고 거부 목록에서 주제를 제외하지 않는지 확인합니다.

  6. 복제기가 새 주제를 감지하고 생성하는 데 최대 30초가 걸릴 수 있습니다. 대상 클러스터에서 주제가 생성되기 전에 생성된 메시지는 시작 위치가 최신(기본값)인 경우 복제되지 않습니다.

대상 클러스터의 메시지 오프셋이 소스 클러스터와 다릅니다.

MSK Replicator는 소스 클러스터의 메시지를 사용하여 대상 클러스터로 메시지를 생성하므로 오프셋이 다를 수 있습니다. 소비자 그룹 오프셋 동기화를 켠 경우 MSK Replicator는 오프셋을 자동으로 변환하므로 장애 조치 후 소비자가 중단한 부분 근처에서 처리를 재개할 수 있습니다.

복제기가 소비자 그룹 오프셋을 동기화하지 않습니다.

  1. 데이터 복제가 예상대로 작동하는지 확인합니다.

  2. 허용 목록의 정규식이 복제하려는 소비자 그룹과 일치하는지 확인합니다.

  3. MSK Replicator가 대상 클러스터에서 주제를 생성했는지 확인합니다. 소스 클러스터의 소비자 그룹이 복제되지 않은 메시지만 사용한 경우 소비자 그룹은 대상 클러스터에 복제되지 않습니다. 소비자 그룹이 새로 복제된 메시지를 읽기 시작하면 MSK Replicator는 자동으로 소비자 그룹을 복제합니다.

참고

MSK Replicator는 주제 파티션의 거의 끝에서 읽는 소비자를 위해 소비자 그룹 오프셋 동기화를 최적화합니다. 소비자 그룹이 소스 클러스터에서 지연되는 경우 대상에서 지연이 더 높아질 수 있습니다. 소비자가 소비를 시작하면 MSK Replicator가 지연을 자동으로 줄입니다.

복제 지연 시간이 길거나 계속 증가하는 경우

  1. 파티션 수가 적절한지 확인합니다. 다음 표에는 원하는 처리량에 권장되는 최소 파티션 수가 나와 있습니다.

    처리량 및 권장되는 최소 파티션 수
    처리량(MB/초) 필요한 최소 파티션
    50167
    100334
    250833
    5001666
    10003333
  2. 클러스터에 충분한 읽기 및 쓰기 용량이 있는지 확인합니다. MSK Replicator는 소스 클러스터(송신)의 소비자 역할과 대상 클러스터(수신)의 생산자 역할을 합니다. 다른 트래픽 외에도 복제 트래픽을 지원하도록 클러스터 용량을 프로비저닝합니다.

  3. 복제 지연 시간은 리전 페어 거리에 따라 다릅니다.

  4. ThrottleTime 지표를 사용하여 Replicator에 병목 현상이 없는지 확인합니다. 0보다 크면 Kafka 할당량을 조정합니다. Kafka 할당량으로 처리량 관리을(를) 참조하세요.

  5. 해당 리전의 MSK 서비스 이벤트에 대한 서비스 AWS 상태 대시보드를 확인합니다.

ReplicatorFailure 지표를 사용한 문제 해결

ReplicatorFailure 지표는 복제 문제를 모니터링하고 감지하는 데 도움이 됩니다. 0이 아닌 값은 일반적으로 메시지 크기 제한, 타임스탬프 범위 위반 또는 레코드 배치 크기 문제로 인한 복제 실패를 나타냅니다. 복제기에 대해 로그 전송이 구성된 경우 전송된 로그 메시지를 사용하여 특정 실패를 식별할 수 있습니다. 자세한 내용은 MSK Replicator 로그 섹션을 참조하세요. 로그 전송이 구성되지 않은 경우 아래 단계에 따라 복제기의 상태 주제에 오류 메시지를 쿼리합니다.

지표가 ReplicatorFailure 0이 아닌 값을 보고하는 경우 다음 단계에 따라 문제를 해결합니다.

  1. 대상 MSK 클러스터에 연결할 수 있고 Apache Kafka CLI 도구가 설정된 클라이언트를 구성합니다. Amazon MSK 프로비저닝된 클러스터에 연결을(를) 참조하세요.

  2. https://console.aws.amazon.com/msk/home?region=us-east-1#/home/에서 Amazon MSK 콘솔을 엽니다.

    MSK Replicator 및 대상 MSK 클러스터의 ARNs을 가져오고 대상 MSK 클러스터의 브로커 엔드포인트를 가져옵니다.

  3. MSK Replicator ARN 및 브로커 엔드포인트를 내보냅니다.

    export TARGET_CLUSTER_SERVER_STRING=<BootstrapServerString> export REPLICATOR_ARN=<ReplicatorARN> export CONSUMER_CONFIG_FILE=<ConsumerConfigFile>
  4. <path-to-your-kafka-installation>/bin 디렉터리에 다음 스크립트를 로 저장합니다query-replicator-failure-message.sh.

    #!/bin/bash # Script: Query MSK Replicator Failure Message # Description: This script queries exceptions from AWS MSK Replicator status topics # It takes a replicator ARN and bootstrap server as input and searches for replicator exceptions # in the replicator's status topic, formatting and displaying them in a readable manner # # Required Arguments: # --replicator-arn: The ARN of the AWS MSK Replicator # --bootstrap-server: The Kafka bootstrap server to connect to # --consumer.config: Consumer config properties file # Usage Example: # ./query-replicator-failure-message.sh --replicator-arn <replicator-arn> --bootstrap-server <bootstrap-server> --consumer.config <consumer.config> print_usage() { echo "USAGE: $0 ./query-replicator-failure-message.sh --replicator-arn <replicator-arn> --bootstrap-server <bootstrap-server> --consumer.config <consumer.config>" echo "--replicator-arn <String: MSK Replicator ARN> REQUIRED: The ARN of AWS MSK Replicator." echo "--bootstrap-server <String: server to connect to> REQUIRED: The Kafka server to connect to." echo "--consumer.config <String: config file> REQUIRED: Consumer config properties file." exit 1 } # Initialize variables replicator_arn="" bootstrap_server="" consumer_config="" # Parse arguments while [[ $# -gt 0 ]]; do case "$1" in --replicator-arn) if [ -z "$2" ]; then echo "Error: --replicator-arn requires an argument." print_usage fi replicator_arn="$2"; shift 2 ;; --bootstrap-server) if [ -z "$2" ]; then echo "Error: --bootstrap-server requires an argument." print_usage fi bootstrap_server="$2"; shift 2 ;; --consumer.config) if [ -z "$2" ]; then echo "Error: --consumer.config requires an argument." print_usage fi consumer_config="$2"; shift 2 ;; *) echo "Unknown option: $1"; print_usage ;; esac done # Check for required arguments if [ -z "$replicator_arn" ] || [ -z "$bootstrap_server" ] || [ -z "$consumer_config" ]; then echo "Error: --replicator-arn, --bootstrap-server, and --consumer.config are required." print_usage fi # Extract replicator name and suffix from ARN replicator_arn_suffix=$(echo "$replicator_arn" | awk -F'/' '{print $NF}') replicator_name=$(echo "$replicator_arn" | awk -F'/' '{print $(NF-1)}') echo "Replicator name: $replicator_name" # List topics and find the status topic topics=$(./kafka-topics.sh --command-config client.properties --list --bootstrap-server "$bootstrap_server") status_topic_name="__amazon_msk_replicator_status_${replicator_name}_${replicator_arn_suffix}" # Check if the status topic exists if echo "$topics" | grep -Fq "$status_topic_name"; then echo "Found replicator status topic: '$status_topic_name'" ./kafka-console-consumer.sh --bootstrap-server "$bootstrap_server" --consumer.config "$consumer_config" --topic "$status_topic_name" --from-beginning | stdbuf -oL grep "Exception" | stdbuf -oL sed -n 's/.*Exception:\(.*\) Topic: \([^,]*\), Partition: \([^\]*\).*/ReplicatorException:\1 Topic: \2, Partition: \3/p' else echo "No topic matching the pattern '$status_topic_name' found." fi

    이 스크립트를 실행하여 MSK Replicator 실패 메시지를 쿼리합니다.

    <path-to-your-kafka-installation>/bin/query-replicator-failure-message.sh --replicator-arn $REPLICATOR_ARN --bootstrap-server $TARGET_CLUSTER_SERVER_STRING --consumer.config $CONSUMER_CONFIG_FILE

    이 스크립트는 예외 메시지 및 영향을 받는 토픽 파티션과 함께 모든 오류를 출력합니다. 토픽에 모든 과거 실패 메시지가 포함되어 있으므로 마지막 메시지를 사용하여 조사를 시작합니다. 다음은 실패 메시지의 예입니다.

    ReplicatorException: The request included a message larger than the max message size the server will accept. Topic: test, Partition: 1
일반적인 장애 및 해결 방법

다음은 일반적인 MSK Replicator 장애와 이를 완화하는 방법을 설명합니다.

max.request.size보다 큰 메시지 크기

원인: 개별 메시지 크기가 10MB(기본 최대값)를 초과합니다.

다음은 오류 메시지 유형의 예입니다.

ReplicatorException: The message is 20635370 bytes when serialized which is larger than 10485760, which is the value of the max.request.size configuration. Topic: test, Partition: 1

해결 방법: 주제의 개별 메시지 크기를 줄입니다. 이렇게 할 수 없는 경우 제한 증가를 요청하는 지침을 따르세요.

서버가 수락할 최대 메시지 크기보다 큰 메시지 크기

원인: 메시지 크기가 대상 클러스터의 최대 메시지 크기를 초과합니다.

다음은 오류 메시지 유형의 예입니다.

ReplicatorException: The request included a message larger than the max message size the server will accept. Topic: test, Partition: 1

해결 방법: 대상 클러스터 또는 주제의 max.message.bytes 구성을 늘립니다. max.message.bytes를 참조하세요.

범위를 벗어난 타임스탬프

원인: 메시지 타임스탬프가 대상 클러스터의 허용 범위를 벗어납니다.

다음은 오류 메시지 유형의 예입니다.

ReplicatorException: Timestamp 1730137653724 of message with offset 0 is out of range. The timestamp should be within [1730137892239, 1731347492239] Topic: test, Partition: 1

해결 방법: 대상 클러스터의 message.timestamp.before.max.ms 구성을 업데이트합니다. message.timestamp.before.max.ms 참조하십시오.

레코드 배치가 너무 큼

원인: 레코드 배치 크기가 대상 클러스터의 주제에 대해 설정된 세그먼트 크기를 초과합니다. MSK Replicator는 최대 배치 크기 1MB를 지원합니다.

다음은 오류 메시지 유형의 예입니다.

ReplicatorException: The request included message batch larger than the configured segment size on the server. Topic: test, Partition: 1

해결 방법: 대상 클러스터의를 segment.bytes 1048576(1MB) 이상으로 업데이트합니다. segment.bytes를 참조하세요.

참고

이러한 솔루션을 적용한 후에도 지표가 ReplicatorFailure 0이 아닌 값을 계속 내보내는 경우 지표가 0의 값을 내보낼 때까지 문제 해결 프로세스를 반복합니다.

자체 관리형 Kafka 클러스터에서의 복제 문제 해결

MSK Replicator가 자체 관리형 Kafka 클러스터에 연결할 수 없음

MSK Replicator가 자체 관리형 Kafka 클러스터에 연결할 수 없는 경우 다음 검사를 수행합니다.

  1. VPN 또는 Direct Connect 연결이 활성 상태이고 라우팅 테이블이 올바른지 확인합니다.

  2. 보안 그룹이 SASL_SSL 포트(일반적으로 9096)의 MSK Replicator 서브넷에서 들어오는 인바운드 트래픽을 허용하는지 확인합니다.

  3. VPC에서 자체 관리형 클러스터 브로커 호스트 이름으로의 DNS 확인을 확인합니다.

  4. Amazon CloudWatch에서 지표를 확인합니다KafkaClusterPingSuccessCount. 값이 0이면 연결 실패를 나타냅니다.

SASL/SCRAM 인증 실패

지표가 AuthError 0이 아니거나 Replicator 로그에 SASL/SCRAM 오류가 표시되는 경우:

  1. AWS Secrets Manager에 저장된 자격 증명이 자체 관리형 클러스터의 SCRAM 사용자 자격 증명과 일치하는지 확인합니다.

  2. SCRAM 사용자에게 필요한 ACL 권한이 있는지 확인합니다(주제에 대한 읽기, 설명, 소비자 그룹에 대한 읽기, 설명, 클러스터에 대한 설명).

  3. 지표를 확인하여 인증 오류를 확인하고 AuthError ClusterAlias차원을 사용하여 소스 또는 대상 클러스터가 영향을 받는지 확인합니다.

SSL 인증서 문제

복제기가 자체 관리형 클러스터에 대한 보안 연결을 설정할 수 없는 경우:

  1. AWS Secrets Manager의 certificate 값에 PEM 형식의 전체 CA 인증서 체인이 포함되어 있는지 확인합니다.

  2. SSL 리스너가 모든 자체 관리형 클러스터 브로커에 구성되어 있는지 확인합니다.

  3. 인증서가 만료되지 않았고 신뢰할 수 있는 CA에서 발급되었는지 확인합니다.

자체 관리형 클러스터에 대한 소비자 그룹 오프셋 동기화 실패

소비자 그룹 오프셋이 올바르게 동기화되지 않는 경우:

  1. 지표를 확인합니다ConsumerGroupOffsetSyncFailure. 지표는 0이어야 합니다.

  2. 소비자 그룹이 소스 클러스터에서 적극적으로 소비되고 있는지 확인합니다(비활성 소비자 그룹은 동기화되지 않을 수 있음).

  3. 양방향 복제의 경우 두 복제기 true 모두에서 synchroniseConsumerGroupOffsets가 로 설정되어 있는지 확인합니다.