
# 配置Kafka数据均衡工具
#### 操作场景
该任务指导管理员根据业务需求，在客户端中执行Kafka均衡工具来均衡Kafka集群的负载，一般用于节点的退服、入服以及负载均衡的场景。
本章节内容适用于MRS 3.x及后续版本。3.x之前版本请参考[均衡Kafka扩容节点后数据](https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_24299.html)
#### 前提条件
- MRS集群管理员已明确业务需求，并准备一个Kafka管理员用户（属于kafkaadmin组，普通模式不需要）。
- 已安装Kafka客户端。
 
#### 操作步骤
1. 以客户端安装用户，登录已安装Kafka客户端的节点。
2. 切换到Kafka客户端安装目录，例如"/opt/client"。 
   **cd /opt/client**
   
   
3. 执行以下命令，配置环境变量。 
   **source bigdata_env**
   
   
4. 执行以下命令，进行用户认证（普通模式跳过此步骤）。 
   **kinit** *组件业务用户*
   
   
5. 执行以下命令，切换到Kafka客户端安装目录。 
   **cd Kafka/kafka**
   
   
6. 使用"kafka-balancer.sh"进行用户集群均衡，常用命令如下： 
   - 使用--run命令执行集群均衡： **./bin/kafka-balancer.sh --run --zookeeper** *\<ZooKeeper* ***的任意一个节点的** 业务IP:zkPort**/kafka**\>* **--bootstrap-server** *\<Kafka* *集群IP: port\>* **--throttle 10000000 --consumer-config config/consumer.properties --enable-az-aware --show-details**
     该命令包含均衡方案的生成和执行两部分，其中--show-details为可选参数，表示是否打印方案明细，--throttle表示均衡方案执行时的带宽限制，单位:bytes/sec, --enable-az-aware为可选参数，表明生成均衡方案时，开启跨AZ特性，使用此参数时，请务必保证集群已开启跨AZ特性。
     
   
   - 使用--run命令执行节点退服： **./bin/kafka-balancer.sh --run --zookeeper** *\<ZooKeeper**的任意一个节点的** 业务IP:zkPort**/kafka**\>* **--bootstrap-server** *\<Kafka集群IP: port\>* **--throttle 10000000 --consumer-config config/consumer.properties --remove-brokers** *\<BrokerId列表\>* **--enable-az-aware --force**
     其中--remove-brokers表示要删除的BrokerId列表，多个间用逗号分隔，--force参数为可选参数，表示忽略磁盘使用率告警，强制生成迁移方案， -enable-az-aware为可选参数，表明生成均衡方案时，开启跨AZ特性，使用此参数时，请务必保证集群已开启跨AZ特性。
     ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
     此退服命令会将待退服Broker节点上的数据迁移至其他Broker节点。
     
   
   - 查看执行状态： **./bin/kafka-balancer.sh --status --zookeeper** *\<ZooKeeper**的任意一个节点的** 业务IP:zkPort**/kafka**\>*
     
   
   - 生成均衡方案： **./bin/kafka-balancer.sh --generate --zookeeper** *\<ZooKeeper* ***的任意一个节点的** 业务IP:zkPort**/kafka**\>* **--bootstrap-server** *\<Kafka* *集群IP:port\>* **--consumer-config config/consumer.properties --enable-az-aware**
     该命令仅根据集群当前状态生成迁移方案，并打印到控制台, 其中--enable-az-aware为可选参数，表明生成迁移方案时，开启跨AZ特性，使用此参数时，请务必保证集群已开启跨AZ特性。
     
   
   - 清理中间状态 **./bin/kafka-balancer.sh --clean --zookeeper** *\<ZooKeeper* ***的任意一个节点的** 业务IP:zkPort**/kafka**\>*
     一般在迁移没有正常执行完成时用来清理ZooKeeper上的中间状态信息。
     ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/notice_3.0-zh-cn.png)
     Kafka集群IP端口号安全模式下是21007，普通模式下是9092。
     
   
   
   
   
 
#### 异常情况处理
在使用Kafka均衡工具进行Partition迁移的过程中，如果出现集群中Broker故障导致均衡工具的执行进度阻塞，这时需要人工介入来恢复，分为以下几种场景：
- 存在Broker因为磁盘占有率达到100%导致Broker故障的情况。
  1. 登录FusionInsight Manager，选择"集群 \> *待操作集群的名称* \> 服务 \> Kafka \> 实例"，将运行状态为"正在恢复"的Broker实例停止并记录实例所在节点的管理IP地址以及对应的"broker.id"，该值可通过单击角色名称，在"实例配置"页面中选择"全部配置"，搜索"broker.id"参数获取。
  
  2. 以**root** 用户登录记录的管理IP地址，并执行**df -lh**命令，查看磁盘占用率为100%的挂载目录，例如"${BIGDATA_DATA_HOME}/kafka/data1"。
  
  3. 进入该目录，执行**du -sh \*** 命令，查看该目录下各文件夹的大小。查看是否存在除"kafka-logs"目录外的其他文件，并判断是否可以删除或者迁移。
     - 是，删除或者迁移相关数据，然后执行[8]。
     
     - 否，执行[4]。
      
  
  4. 进入"kafka-logs"目录，执行**du -sh \***命令，选择一个待移动的Partition文件夹，其名称命名规则为"Topic名称-Partition标识"，记录Topic及Partition。
  
  5. 修改"kafka-logs"目录下的"recovery-point-offset-checkpoint"和"replication-offset-checkpoint"文件（两个文件做同样的修改）。
     1. 减少文件中第二行的数字（若移出多个目录，则减少的数字为移出的目录个数）。
     
     2. 删除待移出的Partition所在的行（行结构为"Topic名称 Partition标识 Offset"，删除前先将该行数据保存，后续此内容还要添加到目的目录下的同名文件中）。
      
  
  6. 修改目的数据目录下（例如："${BIGDATA_DATA_HOME}/kafka/data2/kafka-logs"）的"recovery-point-offset-checkpoint"和"replication-offset-checkpoint"文件（两个文件做同样的修改）。
     - 增加文件中第二行的数字（若移入多个Partition目录，则增加的数字为移入的Partition目录个数）。
     
     - 添加待移入的Partition行到文件末尾（行结构为"Topic名称 Partition标识 Offset"，直接复制[5]中保存的行数据即可）。
      
  
  7. 移动数据，将待移动的Partition文件夹移动到目的目录下，移动完成后执行**chown omm:wheel -R** *Partition目录*命令修改Partition目录属组。
  
  8. 登录FusionInsight Manager，选择"集群 \> 服务 \> Kafka \> 实例"，启动停止的Broker实例。
  
  9. 等待5至10分钟后查看Broker实例的运行状态是否为"良好"。
     - 是，修复完成后按照"ALM-38001 Kafka磁盘容量不足"告警指导彻底解决磁盘容量不足问题。
     
     - 否，联系运维人员。
      
  
  
  按照上述步骤将故障Broker进行恢复后，阻塞的均衡任务会继续执行，可使用--status命令来查看任务的执行进度。
  
- 存在由其他原因导致的Broker故障，且问题场景单一明确，短时间内可以恢复Broker的情况。
  1. 根据问题根因制定恢复方案，恢复故障Broker。
  
  2. 故障Broker恢复后，阻塞的均衡任务会继续执行，可使用--status命令来查看任务的执行进度。
   
- 存在由其他原因导致的Broker故障，且问题场景复杂，短时间内无法恢复Broker的情况。
  1. 执行**kinit** *Kafka* *管理员用户*。（普通模式跳过此步骤）
  
  2. 使用**zkCli.sh -server** *\<ZooKeeper集群业务IP:zkPort**/kafka**\>*登录ZooKeeper Shell。
  
  3. 执行**addauth krbgroup**。（普通模式跳过此步骤）
  
  4. 删除"/admin/reassign_partitions"目录和"/controller"目录。
  
  5. 通过以上步骤强行终止迁移，待集群恢复后使用**kafka-reassign-partitions.sh**命令手动将中间过程中导致的多余的副本删除。
   
 
