更新时间:2022-02-24 GMT+08:00

Kafka高可靠使用说明

Kafka 高可靠、高可用说明

Kafka消息传输保障机制,可以通过配置不同的参数来保障消息传输,进而满足不同的性能和可靠性要求的应用场景。

  • Kafka高可用、高性能

    如果业务需要保证高可用和高性能,可以采用参数:

    参数

    默认值

    说明

    unclean.leader.election.enable

    true

    是否允许不在ISR中的副本被选举为Leader,若设置为true,可能会造成数据丢失。

    auto.leader.rebalance.enable

    true

    是否使用Leader自动均衡功能。

    如果设为true,Controller会周期性的为所有节点的每个分区均衡Leader,将Leader分配给更优先的副本。

    acks

    1

    需要Leader确认消息是否已经接收并认为已经处理完成。该参数会影响消息的可靠性和性能。

    • acks=0 :如果设置为0,Producer将不会等待服务端任何响应。消息将会被认为成功。
    • acks=1 :如果设置为1,当副本所在Leader确认数据已写入,但是其不会等待所有的副本完全写入即返回响应。在这种情况下,如果Leader确认后但是副本未同步完成时Leader异常,那么数据就会丢失。
    • acks=-1 :如果设置为-1(all),意味着等待所有的同步副本确认后才认为成功,配合min.insync.replicas可以确保多副本写入成功,只要有一个副本保持活跃状态,记录将不会丢失。
      说明:

      该参数在kafka客户端配置文件中配置。

    min.insync.replicas

    1

    当Producer设置acks为-1时,指定需要写入成功的副本的最小数目。

    配置高可用、高性能的影响:

    配置高可用、高性能模式后,数据可靠性会降低。在磁盘故障、节点故障等场景下存在数据丢失风险。

  • Kafka高可靠性配置说明

    如果业务需要保证数据高可靠性,可以采用相关参数:

    参数

    建议值

    说明

    unclean.leader.election.enable

    false

    是否允许不在ISR中的副本被选举为Leader。

    acks

    -1

    Producer需要Leader确认消息是否已经接收并认为已经处理完成。

    acks=-1需要表示等待在ISR列表的副本都确认接收到消息并处理完成才表示消息成功。配合min.insync.replicas可以确保多副本写入成功,只要有一个副本保持活跃状态,记录将不会丢失。

    说明:

    该参数在kafka客户端配置文件中配置。

    min.insync.replicas

    2

    当Producer设置acks为-1时,指定需要写入成功的副本的最小数目。

    需要满足min.insync.replicas <= replication.factor。

    配置高可靠性的影响:

    • 性能降低:

      需要所有的ISR列表副本,且满足最小成功的副本数确认写入成功。这样会导致单条消息时延增加,客户端处理能力下降,具体性能以现场实际测试数据为准。

    • 可用性降低:

      不允许不在ISR中的副本被选举为Leader。如果Leader下线时,其他副本均不在ISR列表中,那么该分区将保持不可用,直到Leader节点恢复。

      需要所有的ISR列表副本,且满足最小成功的副本数确认写入成功。当分区的一个副本所在节点故障时,无法满足最小成功的副本数,那么将会导致业务写入失败。

配置影响

请根据业务场景对可靠性和性能要求进行评估,采用合理参数配置。

  • 对于价值数据,两种场景下建议Kafka数据目录磁盘配置raid1或者raid5,从而提高单个磁盘故障情况下数据可靠性。
  • 不同Producer API对应的acks参数名称不同
    • 新Producer API

      org.apache.kafka.clients.producer.KafkaProducer中定义的接口,acks配置为acks。

    • 旧Producer API

      kafka.producer.Producer中定义的接口,acks配置名称为request.required.acks。

  • 参数配置项均为Topic级别可修改的参数,默认采用服务级配置。可针对不同Topic可靠性要求对Topic进行单独配置。

    例如,配置Topic名称为test的可靠性参数:

    kafka-topics.sh --zookeeper 192.168.1.205:2181/kafka --alter --topic test --config unclean.leader.election.enable=false --config min.insync.replicas=2

    其中192.168.1.205为ZooKeeper业务IP地址。

  • 如果修改服务级配置需要重启Kafka,建议在变更窗口做服务级配置修改。