
# 配置Kafka高可用和高可靠
#### 操作场景
Kafka消息传输保障机制，可以通过配置不同的参数来保障消息传输，进而满足不同的性能和可靠性要求。本章节介绍如何配置Kafka高可用和高可靠参数。
#### 对系统的影响
- 配置高可用、高性能模式后，数据可靠性会降低。在磁盘故障、节点故障等场景下存在数据丢失风险。
- 配置高可靠性的影响：
  - 性能降低： 在生产数据时，配置了高可靠参数ack=-1之后，需要多个副本均写入成功之后才认为是写入成功。这样会导致单条消息时延增加，客户端处理能力下降。具体性能以现场实际测试数据为准。
    
  
  - 可用性降低： 不允许不在ISR中的副本被选举为Leader。如果Leader下线时，其他副本均不在ISR列表中，那么该分区将保持不可用，直到Leader节点恢复。当分区的一个副本所在节点故障时，无法满足最小写入成功的副本数，那么将会导致业务写入失败。
    
   
- 参数配置项为服务级配置需要重启Kafka，建议在变更窗口做服务级配置修改。
 
#### 高可用和高性能配置
如果业务需要保证高可用和高性能，可以参考以下步骤操作。
- **方法一：通过服务端配置**
  1. 登录FusionInsight Manager。 登录集群Manager具体操作，请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
     
  
  2. 选择"集群 \> 服务 \> Kafka \> 配置 \> 全部配置"。
  
  3. 搜索以下参数名称，并根据实际需要修改参数值。
     表1服务端高可用性和高性能参数说明 
     | 参数                             | 默认值   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                 |
     |:---|:---|:---|
     | unclean.leader.election.enable | false | 是否允许不在ISR中的副本被选举为Leader。 - true：允许不在ISR中的副本被选举为Leader，避免因副本故障导致分区完全不可用。 如果设置为true，且Producer中配置acks=1或者acks=0，在副本没有同步完成的情况下重启Leader所在的Broker，可能会造成数据丢失。   - false：确保Leader是ISR中的副本，避免数据不一致。   |
     | auto.leader.rebalance.enable   | true  | 是否使用Leader自动均衡功能。 - true：Controller会周期性地为所有节点的每个分区均衡Leader，将Leader分配给更优先的副本。  - false：不使用Leader自动均衡功能。                                                                                                                                     |
     | min.insync.replicas            | 1     | 当Producer设置acks为-1时，指定需要写入成功的副本的最小数目。                                                                                                                                                                                                                                                                                                                                                                                              |
        
     
  
  4. 保存修改的配置。保存完成后请重新启动配置过期的服务或实例以使配置生效。
   
- **方法二：通过服务端配置**
  1. 以**root**用户登录安装Kafka客户端的节点。
  
  2. 执行以下命令，编辑客户端配置文件producer.properties。
     ```
     vi Kafka客户端安装路径/Kafka/kafka/config/producer.properties
     ```
     
  
  3. 根据需要配置下表中参数，并保存文件。
     表2客户端高可用性和高性能参数说明 
     | 参数   | 默认值 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
     |:---|:---|:---|
     | acks | 1   | 需要Leader确认消息是否已经接收并认为已经处理完成。该参数会影响消息的可靠性和性能。 - acks=0：Producer将不会等待服务端任何响应。消息将会被认为成功。  - acks=1：当副本所在Leader确认数据已写入，但是其不会等待所有的副本完全写入即返回响应。在这种情况下，如果Leader确认后但是副本未同步完成时Leader异常，那么数据就会丢失。  - acks=-1：意味着等待所有的同步副本确认后才认为成功，配合"min.insync.replicas"可以确保多副本写入成功，只要有一个副本保持活跃状态，记录将不会丢失。   |
        
     
   
 
#### 数据高可靠性配置
如果业务需要保证数据高可靠性，可以参考以下步骤操作。
- **方法一：通过服务端配置**
  1. 登录FusionInsight Manager。 登录集群Manager具体操作，请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
     
  
  2. 选择"集群 \> 服务 \> Kafka \> 配置 \> 全部配置"。
  
  3. 搜索以下参数名称，并根据实际需要修改参数值。
     表3服务端高可靠性参数说明 
     | 参数                             | 建议值   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                  |
     |:---|:---|:---|
     | unclean.leader.election.enable | false | 是否允许不在ISR中的副本被选举为Leader。 - true：允许不在ISR中的副本被选举为Leader，避免因副本故障导致分区完全不可用。 如果设置为true，且Producer中配置acks=1或者acks=0，在副本没有同步完成的情况下重启Leader所在的Broker，可能会造成数据丢失。   - false：确保Leader是ISR中的副本，避免数据不一致。   |
     | min.insync.replicas            | 2     | 当Producer设置acks为-1时，指定需要写入成功的副本的最小数目。 需要满足min.insync.replicas \<= replication.factor。                                                                                                                                                                                                                                                                                                                |
        
     
  
  4. 保存修改的配置。保存完成后请重新启动配置过期的服务或实例以使配置生效。
   
- **方法二：通过服务端配置**
  1. 以**root**用户登录安装Kafka客户端的节点。
  
  2. 执行以下命令，编辑客户端配置文件producer.properties。
     ```
     vi Kafka客户端安装路径/Kafka/kafka/config/producer.properties
     ```
     
  
  3. 根据需要配置下表中参数，并保存文件。
     表4客户端高可靠性参数说明 
     | 参数   | 建议值 | 说明                                                                                                                                                                                              |
     |:---|:---|:---|
     | acks | -1  | Producer需要Leader确认消息是否已经接收并认为已经处理完成。 acks=-1：需要等待在ISR列表的副本都确认接收到消息并处理完成才表示消息成功。配合"min.insync.replicas"可以确保多副本写入成功，只要有一个副本保持活跃状态，记录将不会丢失，此参数配置为-1时，会降低生产性能，请权衡后配置。 |
        
     
   
 
#### 配置建议
请根据以下业务场景对可靠性和性能要求进行评估，采用合理参数配置。
- 对于价值数据，这两种场景下建议Kafka数据目录磁盘配置raid1或者raid5，从而提高单个磁盘故障情况下数据可靠性。
- 参数配置项均为Topic级别可修改的参数，默认采用服务级配置。 可针对不同Topic可靠性要求对Topic进行单独配置。
  例如，以**root**用户登录Kafka客户端节点，在客户端安装目录下配置Topic的可靠性参数命令：
  ```
  cd Kafka客户端安装路径/Kafka/kafka/bin
  ```
  ```
  kafka-configs.sh --bootstrap-server Kafka集群IP:21007 --command-config ../config/client.properties --alter --topic 主题名称 --add-config unclean.leader.election.enable=false,min.insync.replicas=2
  ```
  

- 参数配置项为服务级配置时需要重启Kafka，建议在变更窗口做服务级配置修改。
 
