

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

# 從 Amazon MSK 叢集中移除代理系統
<a name="msk-remove-broker"></a>

當您想要從 Amazon Managed Streaming for Apache Kafka (MSK) 佈建叢集中移除代理程式時，請使用此 Amazon MSK 操作。您可以透過移除一組代理程式來減少叢集的儲存和運算容量，而不會影響可用性、資料持久性風險或資料串流應用程式中斷。

您可以將更多代理程式新增至叢集，以處理流量增加，並在流量下降時移除代理程式。透過代理程式新增和移除功能，您可以充分利用叢集容量並最佳化 MSK 基礎設施成本。代理程式移除可讓您控制現有叢集容量，以符合工作負載需求，並避免遷移至另一個叢集。

使用 AWS 主控台、命令列界面 (CLI)、 SDK 或 CloudFormation 來減少佈建叢集的代理程式計數。MSK 會挑選沒有任何分割區的代理程式 (Canary 主題除外），並防止應用程式向這些代理程式產生資料，同時安全地從叢集中移除這些代理程式。

如果您想要減少叢集的儲存和運算，您應該為每個可用區域移除一個代理程式。例如，您可以從兩個可用區域叢集移除兩個代理程式，或在單一代理程式移除操作中從三個可用區域叢集移除三個代理程式。

如需有關從叢集移除代理程式後如何重新平衡分割區的資訊，請參閱 [重新指派分割區](bestpractices.md#bestpractices-balance-cluster)。

無論執行個體大小為何，您都可以從所有 M5 和 M7g 型 MSK 佈建叢集中移除代理程式。

Kafka 2.8.1 版及更新版本支援代理程式移除，包括 KRaft 模式叢集。

**Topics**
+ [移除代理程式分割區](#msk-remove-broker-partitions)
+ [使用主控台移除代理程式](#msk-remove-broker-console)
+ [使用 CLI 移除代理程式](#msk-remove-broker-cli)
+ [使用 API 移除代理程式](#msk-remove-broker-api)

## 準備透過移除所有分割區來移除代理程式
<a name="msk-remove-broker-partitions"></a>

開始代理程式移除程序之前，請先移動所有分割區，但主題`__amazon_msk_canary`和您計劃移除之`__amazon_msk_canary_state`代理程式的分割區除外。這些是 Amazon MSK 為叢集運作狀態和診斷指標建立的內部主題。

您可以使用 Kafka 管理員 APIs 或 Cruise Control，將分割區移至您要保留在叢集中的其他代理程式。請參閱[重新指派分割區](https://docs.aws.amazon.com/msk/latest/developerguide/bestpractices.html#bestpractices-balance-cluster)。

### 移除分割區的範例程序
<a name="msk-remove-broker-partitions-example"></a>

本節範例說明如何從您要移除的代理程式中移除分割區。假設您有一個叢集，其中包含 6 個代理程式、每個可用區域中 2 個代理程式，並且有四個主題：
+ `__amazon_msk_canary`
+ `__consumer_offsets`
+ `__amazon_msk_connect_offsets_my-mskc-connector_12345678-09e7-c657f7e4ff32-2`
+ `msk-brk-rmv`

1. 建立用戶端機器，如[建立用戶端機器](https://docs.aws.amazon.com/msk/latest/developerguide/create-client-machine.html)中所述。

1. 設定用戶端機器後，請執行下列命令來列出叢集中所有可用的主題。

   ```
   ./bin/kafka-topics.sh --bootstrap-server “CLUSTER_BOOTSTRAP_STRING” --list
   ```

   在此範例中，我們看到四個主題名稱：`__amazon_msk_canary`、`__amazon_msk_connect_offsets_my-mskc-connector_12345678-09e7-c657f7e4ff32-2`、 `__consumer_offsets`和 `msk-brk-rmv`。

1. 在用戶端機器`topics.json`上建立名為 的 json 檔案，並新增所有使用者主題名稱，如下列程式碼範例所示。您不需要包含`__amazon_msk_canary`主題名稱，因為這是服務受管主題，在必要時會自動移動。

   ```
   {
   "topics": [
   {"topic": "msk-brk-rmv"},
   {"topic": "__consumer_offsets"},
   {"topic": "__amazon_msk_connect_offsets_my-mskc-connector_12345678-09e7-c657f7e4ff32-2"}
   ],
   "version":1
   }
   ```

1. 執行下列命令來產生提案，以僅將叢集上 6 個代理程式中的 3 個代理程式移至 。

   ```
   ./bin/kafka-reassign-partitions.sh --bootstrap-server “CLUSTER_BOOTSTRAP_STRING” --topics-to-move-json-file topics.json --broker-list 1,2,3 --generate
   ```

1. 建立名為 的檔案，`reassignment-file.json`並複製`proposed partition reassignment configuration`您從上述命令取得的 。

1. 執行下列命令來移動您在 中指定的分割區`reassignment-file.json`。

   ```
   ./bin/kafka-reassign-partitions.sh --bootstrap-server “CLUSTER_BOOTSTRAP_STRING” --reassignment-json-file reassignment-file.json --execute
   ```

   輸出結果類似如下：

   ```
   Successfully started partition reassignments for morpheus-test-topic-1-0,test-topic-1-0
   ```

1. 執行下列命令，以確認所有分割區都已移動。

   ```
   ./bin/kafka-reassign-partitions.sh --bootstrap-server “CLUSTER_BOOTSTRAP_STRING” --reassignment-json-file reassignment-file.json --verify
   ```

   輸出結果類似如下。監控狀態，直到請求主題中的所有分割區已成功重新指派：

   ```
   Status of partition reassignment:
   Reassignment of partition msk-brk-rmv-0 is completed.
   Reassignment of partition msk-brk-rmv-1 is completed.
   Reassignment of partition __consumer_offsets-0 is completed.
   Reassignment of partition __consumer_offsets-1 is completed.
   ```

1. 當狀態指出每個分割區的分割區重新指派已完成時，請監控`UserPartitionExists`指標 5 分鐘，以確保它`0`為您移動分割區的代理程式顯示。確認後，您可以繼續從叢集中移除代理程式。

## 使用 AWS 管理主控台移除代理程式
<a name="msk-remove-broker-console"></a>

**使用 AWS 管理主控台移除代理程式**

1. 開啟位於 [https://console.aws.amazon.com/msk/](https://console.aws.amazon.com/msk/) 的 Amazon MSK 主控台。

1. 選擇包含您要移除之代理程式的 MSK 叢集。

1. 在叢集詳細資訊頁面上，選擇**動作**按鈕，然後選取**編輯代理程式數量**選項。

1. 輸入您希望叢集在每個可用區域擁有的代理程式數量。主控台摘要將移除跨可用區域的代理程式數量。請確定您想要的。

1. 選擇**儲存變更**。

為了防止意外移除代理程式，主控台會要求您確認要刪除代理程式。

## 使用 CLI AWS 移除代理程式
<a name="msk-remove-broker-cli"></a>

執行下列命令，`ClusterArn`將 取代為您建立叢集時取得的 Amazon Resource Name (ARN)。若您沒有叢集的 ARN，可透過列出所有叢集來找到該 ARN。如需詳細資訊，[請列出 Amazon MSK 叢集](https://docs.aws.amazon.com/msk/latest/developerguide/msk-list-clusters.html)。`Current-Cluster-Version` 將 取代為目前版本的叢集。

**重要**  
叢集版本不是簡單的整數。若要尋找叢集的目前版本，請使用 [DescribeCluster](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn.html#DescribeCluster) 操作或 [describe-cluster](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kafka/describe-cluster.html) AWS CLI 命令。範例版本為`KTVPDKIKX0DER`。

*Target-Number-of-Brokers* 參數代表您希望叢集在這項操作成功完成時擁有的代理程式節點總數。您為 *Target-Number-of-Brokers* 指定的值必須是小於叢集中目前代理程式數量的整數。它也必須是可用區域數量的倍數。

```
aws kafka update-broker-count --cluster-arn ClusterArn --current-version Current-Cluster-Version --target-number-of-broker-nodes Target-Number-of-Brokers
```

此 `update-broker-count` 操作的輸出如以下 JSON 所示。

```
{
"ClusterOperationInfo": {
"ClientRequestId": "c0b7af47-8591-45b5-9c0c-909a1a2c99ea",
        "ClusterArn": "arn:aws:kafka:us-east-1:012345678012:cluster/exampleClusterName/abcdefab-1234-abcd-5678-cdef0123ab01-2",
        "CreationTime": "2019-09-25T23:48:04.794Z",
        "OperationArn": "arn:aws:kafka:us-east-1:012345678012:cluster-operation/exampleClusterName/abcdefab-1234-abcd-5678-cdef0123ab01-2/0123abcd-abcd-4f7f-1234-9876543210ef",
        "OperationState": "UPDATE_COMPLETE",
        "OperationType": "DECREASE_BROKER_COUNT",
        "SourceClusterInfo": {
"NumberOfBrokerNodes": 12
        },
        "TargetClusterInfo": {
"NumberOfBrokerNodes": 9
        }
    }
}
```

在此輸出中，`OperationType` 是 `DECREASE_BROKER_COUNT`。如果 `OperationState` 具有值 `UPDATE_IN_PROGRESS`，請稍候一段時間，然後再次執行 `describe-cluster-operation` 命令。

## 使用 AWS API 移除代理程式
<a name="msk-remove-broker-api"></a>

若要使用 API 移除叢集中的代理程式，請參閱《*Amazon Managed Streaming for Apache Kafka API 參考*》中的 [UpdateBrokerCount](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn-nodes-count.html#clusters-clusterarn-nodes-count-url)。