

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# MSK Replicator 故障診斷
<a name="msk-replicator-troubleshooting"></a>

下列資訊可協助您針對 MSK Replicator 可能發生的問題進行疑難排解。如需其他 Amazon MSK 功能的問題解決資訊[對 Amazon MSK 叢集進行故障診斷](troubleshooting.md)，請參閱 。您也可以將您的問題張貼到 [AWS re:Post](https://repost.aws/)。

## MSK Replicator 狀態從 CREATING (建立中) 變為 FAILED (失敗)
<a name="msk-replicator-troubleshooting-failed-state"></a>

以下是 MSK Replicator 建立失敗的一些常見原因。

1. 驗證您在目標叢集區段中為建立複寫器提供的安全群組是否具有傳出規則，以允許流量前往目標叢集的安全群組。此外，請驗證目標叢集的安全群組是否具有傳入規則，可接受來自於目標叢集區段中為建立複寫器提供之安全群組的流量。請參閱 [選擇目標叢集](msk-replicator-create-console.md#msk-replicator-create-console-choose-target)。

1. 如果您要建立跨區域複寫的複寫器，請驗證來源叢集是否已針對 IAM 存取控制身分驗證方法開啟多 VPC 連線。請參閱 [Amazon MSK 的單一區域多 VPC 私有連線](aws-access-mult-vpc.md)。同時驗證是否已在來源叢集上設定叢集政策，以便 MSK Replicator 可以連線到來源叢集。請參閱 [準備 Amazon MSK 來源叢集](msk-replicator-prepare-cluster.md)。

1. 驗證您在建立 MSK Replicator 期間提供的 IAM 角色是否具有讀取和寫入來源和目標叢集所需的許可。此外，請驗證 IAM 角色是否具有寫入主題的許可。請參閱 [設定複寫器設定和許可](msk-replicator-create-console.md#msk-replicator-create-settings)

1. 驗證您的網路 ACL 是否未封鎖 MSK Replicator 與來源和目標叢集之間的連線。

1. MSK Replicator 嘗試連線至來源或目標叢集時，可能無法完全使用來源或目標叢集。這可能是因為負載過多、磁碟使用率或 CPU 使用率過高，造成複寫器無法連線至代理程式。修復代理程式的問題，然後重試建立複寫器。

執行上述驗證後，請再次建立 MSK Replicator。

## MSK Replicator 顯示停滯在 CREATING 狀態
<a name="msk-replicator-troubleshooting-stuck-creating"></a>

有時建立 MSK Replicator 最多需要 30 分鐘。等候 30 分鐘，然後再次檢查複寫器的狀態。

## MSK Replicator 未複製資料或僅複製部分資料
<a name="msk-replicator-troubleshooting-not-replicating"></a>

依照下列步驟，對資料複寫問題進行疑難排解。

1. 使用 Amazon CloudWatch 中 MSK Replicator 提供的 AuthError 指標，確認您的 Replicator 未執行任何身分驗證錯誤。如果此指標超過 0，請檢查複寫器的 IAM 角色政策是否有效，並且未針對叢集設定拒絕許可。根據 clusterAlias 維度，您可以識別來源或目標叢集是否遇到身分驗證錯誤。

1. 驗證您的來源和目標叢集沒有遇到任何問題。複寫器可能無法連線到來源或目標叢集。這可能是由於連線太多，磁盤容量全滿或高 CPU 使用率。

1. 使用 Amazon CloudWatch 中的 KafkaClusterPingSuccessCount 指標，確認您的來源和目標叢集可從 MSK Replicator 連線。根據 clusterAlias 維度，您可以識別來源或目標叢集是否遇到身分驗證錯誤。如果此指標為 0 或沒有資料點，則表示連線的運作狀態不佳。您應該檢查 MSK Replicator 用來連線到叢集的網路和 IAM 角色許可。

1. 使用 Amazon CloudWatch 中的 ReplicatorFailure 指標，確認您的 Replicator 未因缺少主題層級許可而執行失敗。如果此指標高於 0，請檢查您為主題層級許可提供的 IAM 角色。

1. 驗證您在建立複寫器時，在允許清單中提供的規則運算式是否與您要複寫的主題名稱相符。此外，請驗證主題並未因為拒絕清單中的規則運算式而排除在複寫之外。

1. 請注意，複寫器最多可能需要 30 秒才能偵測和建立目標叢集上的新主題或主題分割區。如果在目標叢集上建立主題之前對來源主題產生的任何訊息，如果複寫器的開始位置是最新的 （預設），則不會複寫。或者，如果您想要複寫目標叢集主題上的現有訊息，您可以從來源叢集主題分割區中最早的位移開始複寫。請參閱 [設定複寫器設定和許可](msk-replicator-create-console.md#msk-replicator-create-settings)。

## 目標叢集中的訊息位移與來源叢集不同
<a name="msk-replicator-troubleshooting-different-message-offsets"></a>

在複寫資料的過程中，MSK Replicator 會使用來自來源叢集的訊息，並將訊息產生到目標叢集。這可能會導致訊息在來源和目標叢集上有不同的位移。不過，如果您已在建立複寫器期間開啟取用者群組位移同步，則 MSK Replicator 會在複製中繼資料時自動翻譯位移，以便在容錯移轉至目標叢集之後，您的取用者可以從在來源叢集中離開的附近繼續處理。

## MSK Replicator 不會同步取用者群組位移，或取用者群組不存在於目標叢集上
<a name="msk-replicator-troubleshooting-not-syncing-consumer-groups"></a>

請依照下列步驟對中繼資料複寫問題進行疑難排解。

1. 確認您的資料複寫如預期般運作。如果沒有，請參閱 [MSK Replicator 未複製資料或僅複製部分資料](#msk-replicator-troubleshooting-not-replicating)。

1. 驗證您在建立複寫器時在允許清單中提供的規則表達式是否符合您要複寫的取用者群組名稱。此外，請確認消費者群組不會因為拒絕清單中的規則表達式而從複寫中排除。

1. 確認 MSK Replicator 已在目標叢集上建立主題。複寫器最多可能需要 30 秒才能偵測和建立目標叢集上的新主題或主題分割區。在目標叢集上建立主題之前對來源主題產生的任何訊息，如果複寫器的開始位置是*最新的* （預設），則不會複寫。如果您在來源叢集上的取用者群組只取用 MSK Replicator 尚未複寫的訊息，則取用者群組將不會複寫至目標叢集。在目標叢集上成功建立主題後，MSK Replicator 會開始將來源叢集上新寫入的訊息複寫到目標。一旦您的取用者群組開始從來源讀取這些訊息，MSK Replicator 會自動將取用者群組複寫到目標叢集。或者，如果您想要複寫目標叢集主題上的現有訊息，您可以從來源叢集主題分割區中最早的位移開始複寫。請參閱 [設定複寫器設定和許可](msk-replicator-create-console.md#msk-replicator-create-settings)。

**注意**  
MSK Replicator 會針對來源叢集上的取用者最佳化取用者群組位移同步，這些取用者群組會從更接近主題分割區結尾的位置讀取。如果您的取用者群組在來源叢集上延遲，相較於來源，您可能會看到目標上這些取用者群組的延遲較高。這表示容錯移轉至目標叢集後，您的取用者將重新處理更多重複的訊息。若要減少此延遲，來源叢集上的取用者需要趕上進度，並從串流的頂端開始取用 （主題分割區的結尾）。隨著您的消費者追上進度，MSK Replicator 會自動減少延遲。

## 複寫延遲很高或持續增加
<a name="msk-replicator-troubleshooting-high-latency"></a>

以下是造成高複寫延遲的一些常見原因。

1. 驗證在來源和目標 MSK 叢集上的分區數量是否正確。分區過少或過多可能會影響效能。如需有關選擇分區數量的指引，請參閱 [使用 MSK Replicator 的最佳實務](msk-replicator-best-practices.md)。下表顯示 MSK Replicator 取得所需輸送量建議的分區數量下限。  
**輸送量和建議的分區數量下限**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/msk/latest/developerguide/msk-replicator-troubleshooting.html)

1. 驗證在來源和目標 MSK 叢集中具有足夠的讀取和寫入容量，以支援複寫流量。MSK Replicator 可作為來源叢集 (輸出) 的取用者，以及作為目標叢集 (輸入) 的生產者。因此，除了叢集上的其他流量以外，您還應佈建叢集容量以支援複寫流量。如需有關調整 MSK 叢集大小的指引，請參閱 [使用 MSK Replicator 的最佳實務](msk-replicator-best-practices.md)。

1. 不同來源和目的地 AWS 區域對中的 MSK 叢集的複寫延遲可能會有所不同，具體取決於叢集彼此之間的地理位置距離。例如，在歐洲 (愛爾蘭) 與亞太區域 (雪梨) 區域中叢集之間的複寫，比在歐洲 (愛爾蘭) 與歐洲 (倫敦) 區域中叢集之間的複寫延遲更低。

1. 驗證您的複寫器沒有因為在來源或目標叢集上設定過度積極的配額而受到限流。您可以使用 Amazon CloudWatch 中 MSK Replicator 提供的 ThrottleTime 指標，查看來源/目標叢集上的代理程式調節請求的平均時間，以毫秒為單位。如果此指標高於 0，則應調整 Kafka 配額以減少限流，以便複寫器可以追上。如需有關管理複寫器 Kafka 配額的資訊，請參閱 [使用 Kafka 配額管理 MSK Replicator 輸送量](msk-replicator-best-practices.md#msk-replicator-manage-throughput-kafka-quotas)。

1. 當 AWS 區域降級時，ReplicationLatency 和 MessageLag 可能會增加。使用 [AWS 服務運作狀態儀表板](https://health.aws.amazon.com/health/status) 來檢查主要 MSK 叢集所在區域中是否有 MSK 服務事件。如果發生服務事件，您可以暫時將應用程式讀取和寫入重新導向至其他區域。

## 使用 ReplicatorFailure 指標對 MSK Replicator 失敗進行故障診斷
<a name="msk-replicator-troubleshooting-ReplicatorFailure"></a>

ReplicatorFailure 指標可協助您監控和偵測 MSK Replicator 中的複寫問題。此指標的非零值通常表示複寫失敗問題，可能由下列因素造成：
+ 訊息大小限制
+ 時間戳記範圍違規
+ 記錄批次大小問題

如果 ReplicatorFailure 指標報告非零值，請依照下列步驟對問題進行疑難排解。

**注意**  
如需此指標的詳細資訊，請參閱 [MSK Replicator 指標](msk-replicator-monitor.md#msk-replicator-metrics)。

1. 設定可連線至目標 MSK 叢集且具有 Apache Kafka CLI 工具設定的用戶端。如需設定用戶端和 Kafka CLI 工具的資訊，請參閱 [連線至 Amazon MSK 佈建叢集](client-access.md)。

1. 開啟 Amazon MSK 主控台，網址為 [https://console.aws.amazon.com/msk/home?region=us-east-1\$1/home/](https://console.aws.amazon.com/msk/home?region=us-east-1#/home/)。

   然後，執行下列動作：

   1. 取得 MSK Replicator 和目標 MSK 叢集ARNs。

   1. [取得目標 MSK 叢集的代理程式端點](get-bootstrap-console.md)。您將在下列步驟中使用這些端點。

1. 執行下列命令來匯出您在上一個步驟中取得的 MSK Replicator ARN 和代理程式端點。

   請務必將下列範例中使用的 <*ReplicatorARN*>、<*BootstrapServerString*> 和 <*ConsumerConfigFile*> 預留位置值取代為其實際值。

   ```
   export TARGET_CLUSTER_SERVER_STRING=<BootstrapServerString>
   ```

   ```
   export REPLICATOR_ARN=<ReplicatorARN>
   ```

   ```
   export CONSUMER_CONFIG_FILE=<ConsumerConfigFile>
   ```

1. 在您的 `<path-to-your-kafka-installation>/bin`目錄中，執行下列動作：

   1. 儲存下列指令碼並命名為 **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 ./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
      ```

   1. 執行此指令碼來查詢 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
      ```

      此指令碼會輸出所有錯誤及其例外狀況訊息和受影響的主題分割區。您可以使用此例外狀況資訊來緩解故障，如 中所述[常見的 MSK Replicator 失敗及其解決方案](#msk-replicator-ReplicatorFailure-error-mitigation)。由於主題包含所有歷史故障訊息，請使用最後一個訊息開始調查。以下是失敗訊息的範例。

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

### 常見的 MSK Replicator 失敗及其解決方案
<a name="msk-replicator-ReplicatorFailure-error-mitigation"></a>

以下清單說明您可能會遇到的一些 MSK Replicator 失敗，以及如何緩解這些失敗。

**訊息大小大於 max.request.size**  
**原因**  
當 MSK Replicator 因為個別訊息大小超過 10 MB 而無法複寫資料時，就會發生此失敗。根據預設，MSK Replicator 會複寫大小上限為 10 MB 的訊息。
以下是此失敗訊息類型的範例。  

```
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
```
**解決方案**  
減少主題中的個別訊息大小。如果您無法這麼做，請依照這些指示[請求提高限制](limits.md#request-msk-quota-increase)。

**訊息大小大於伺服器接受的最大訊息大小**  
**原因**  
當訊息大小超過目標叢集的訊息大小上限時，就會發生此失敗。
以下是此失敗訊息類型的範例。  

```
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`組態，以符合您最大的未壓縮訊息大小。如需執行此操作的詳細資訊，請參閱 [max.message.bytes](https://kafka.apache.org/documentation/#topicconfigs_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`組態，以允許具有較舊時間戳記的訊息。如需執行此操作的詳細資訊，請參閱 https：//[message.timestamp.before.max.ms](https://kafka.apache.org/documentation/#topicconfigs_message.timestamp.before.max.ms)。

**記錄批次過大**  
**原因**  
發生此失敗是因為記錄批次大小超過目標叢集上為主題設定的區段大小。MSK Replicator 支援最大批次大小為 1 MB。
以下是此失敗訊息類型的範例。  

```
ReplicatorException: The request included message batch larger than the configured segment size on the server. Topic: test, Partition: 1
```
**解決方案**  
目標叢集的 segment.bytes 組態必須至少與複寫器的批次大小 (1 MB) 一樣大，才能繼續執行而不會發生錯誤。將目標叢集的 segment.bytes 更新為至少 1048576 (1 MB)。如需執行此操作的詳細資訊，請參閱 [segment.bytes](https://kafka.apache.org/documentation/#topicconfigs_segment.bytes)。

**注意**  
如果 ReplicatorFailure 指標在套用這些解決方案後繼續發出非零值，請重複疑難排解程序，直到指標發出零值。