如何對 Linux 機器上的 Amazon Kinesis 代理程式問題進行疑難排解?

上次更新日期:2022 年 5 月 5 日

我正在嘗試在 Linux 機器上使用 Amazon Kinesis 代理程式。但遇到了一個問題。如何解決此錯誤?

簡短描述

本文涵蓋下列問題:

  • Kinesis 代理程式正在傳送重複的事件。
  • Kinesis 代理程式在我的 Amazon Kinesis 串流上造成寫入調節和失敗記錄。
  • Kinesis 代理程式無法讀取或串流日誌檔案。
  • 我的 Amazon Elastic Computing (Amazon EC2) 伺服器由於 Java 堆積大小不足而一直失敗。
  • 我的 Amazon EC2 CPU 使用率非常高。

解決方案

Kinesis 代理程式正在傳送重複的事件

如果您每次從 Kinesis Agent 傳送日誌時都會收到重複資料,則可能會出現檔案輪換,因為比對模式未正確限定。每次傳送日誌時,Kinesis 代理程式都會檢查符合檔案模式的每個檔案的 latestUpdateTimestamp。依預設,Kinesis 代理程式會選擇最近更新的檔案,識別符合輪換模式的作用中檔案。如果同時更新多個檔案,Kinesis Agent 則無法判斷要追蹤的作用中檔案。因此,Kinesis 代理程式會從一開始就開始追蹤更新的檔案,導致多個重複項目。

若要避免此問題,請為每個個別檔案建立不同的檔案流程,以確保檔案模式會改為追蹤輪換。

注意:如果您正在追蹤輪換,最佳實務是使用 create (建立) 或 rename (重新命名) 日誌輪換設定,而不是 copytruncate

例如,您可以使用類似下列所示的檔案流程:

"flows": [
        {
            "filePattern": "/tmp/app1.log*",
            "kinesisStream": "yourkinesisstream1"
        },
        {
            "filePattern": "/tmp/app2.log*",
            "kinesisStream": "yourkinesisstream2"
        }
    ]

Kinesis 代理程式還會在發生間斷性網路問題時,重試無法傳回的任何記錄。如果 Kinesis 代理程式無法接收伺服器端確認,則會再次嘗試建立重複項目。在此範例中,下游應用程式必須去除重複資料。

調整或移除檢查點檔案時,可能也會發生重複項目。如果檢查點檔案存放在 /var/run/aws-kinesis-agent 中,則可能會在重新安裝或執行個體重新啟動期間清除檔案。當您再次執行 Kinesis 代理程式時,應用程式會在讀取檔案後立即失敗,導致重複。因此,請將檢查點保留在主代理程式目錄中,並使用新位置來更新 Kinesis 代理程式組態。

例如:

"checkpointFile": "/aws-kinesis-agent-checkpoints/checkpoints"

Kinesis 代理程式在我的 Amazon Kinesis 資料串流上造成寫入調節和失敗記錄

依預設,Kinesis 代理程式會嘗試盡快傳送日誌檔案,從而違反 Kinesis 的輸送量閾值。然而,失敗記錄會重新排入佇列,並持續重試以防止任何資料遺失。佇列排滿後,Kinesis 代理程式會停止追蹤檔案,這可能會造成應用程式延遲。

例如,如果佇列已滿,您的日誌看起來會類似這樣:

com.amazon.kinesis.streaming.agent.Agent [WARN] Agent: Tailing is 745.005859 MB (781195567 bytes) behind.

注意:佇列大小由 publishQueueCapacity 參數確定 (預設值設定為 "100")。

若要調查 Kinesis 資料串流上的任何失敗記錄或效能問題,請嘗試下列操作:

  • 在 Amazon CloudWatch 中監控 RecordSendErrors 指標。
  • 檢閱您的 Kinesis 代理程式日誌,以檢查是否發生任何延遲。只有在 DEBUG 日誌層級下,才會顯示 ProvisionedThroughputExceededException 項目。在此期間,如果大部分 CPU 用於剖析和轉換資料,Kinesis Agent 的記錄傳送速度可能會較慢。
  • 如果您發現 Kinesis 代理程式落後,請考慮為您的 Amazon Kinesis 交付串流擴充規模。

Kinesis 代理程式無法讀取或串流日誌檔案

請確定執行 Kinesis 代理程式所在的 Amazon EC2 執行個體具有適當許可,以存取目的地 Kinesis 交付串流。如果 Kinesis 代理程式無法讀取日誌檔案,請檢查 Kinesis 代理程式是否具有該檔案的讀取許可。對於符合此模式的所有檔案,讀取許可必須授予 aws-kinesis-agent-user。對於包含檔案的目錄,讀取和執行許可也必須授予 aws-kinesis-agent-user。否則,您會收到「拒絕存取」錯誤或 Java 執行時間例外狀況。

我的 Amazon EC2 伺服器由於 Java 堆積大小不足而一直失敗

如果您的 Amazon EC2 伺服器因 Java 堆積大小不足而持續失敗,請增加分配給 Amazon Kinesis 代理程式的堆積大小。若要設定 Kinesis 代理程式可用的記憶體量,請更新 “start-aws-kinesis-agent” 檔案。增加下列參數的設定值:

  • JAVA_START_HEAP
  • JAVA_MAX_HEAP

注意:在 Linux 上,“start-aws-kinesis-agent” 的檔案路徑為 “/usr/bin/start-aws-kinesis-agent”。

我的 Amazon EC2 CPU 使用率非常高

如果 Kinesis 代理程式正在執行次最佳化的 Regex 模式比對和記錄轉換,則 CPU 使用率可能會增加。如果您已設定 Kinesis 代理程式,請嘗試移除所有規則運算式 (regex) 模式相符項目和轉換。然後,檢查您是否仍然遇到 CPU 問題。

如果您仍然遇到 CPU 問題,請考慮調校記憶體中緩衝的執行緒和記錄。或者,更新 /etc/aws-kinesis/agent.json 組態設定檔案中的一些預設參數。您還可以在 Kinesis 代理程式組態檔案中降低若干參數。

以下是您可以嘗試降低的一般組態參數:

  • sendingThreadsMaxQueueSize︰threadPool 將資料傳送至目的地的 workQueue 大小。預設值為 100。
  • maxSendingThreads︰傳送資料至目的地的執行緒數目。最小值為 2。預設值是您電腦核心數目的 12 倍。
  • maxSendingThreadsPerCore:︰傳送資料至目的地的每核心執行緒數目。預設值為 12。
以下是您可以嘗試降低的流程組態參數:
  • publishQueueCapacity︰在傳送至目的地之前,可排入佇列的記錄緩衝區數目上限。預設值為 100。
  • minTimeBetweenFilePollsMillis︰在輪詢追蹤檔案並開始剖析新資料的時間間隔。預設值為 100。

此文章是否有幫助?


您是否需要帳單或技術支援?