Kafka的分区和副本机制详解

1. 生产者分区写入策略

简介: 生产者写入消息到topic,Kafka将依据不同的策略将数据分配到不同的分区中.

  • 轮询分区策略(默认的,使用最多的策略): 可以最大限度的保证消息平均分配到不同的区中.
    Kafka的分区和副本机制详解_第1张图片
  • 随机分配策略(基本不用): 随机将消息分配到每个分区中
  • 按key分配策略: 根据Key分配到每一个区中,但是可能出现数据倾斜,大量相同的key被分到同一个区中.
  • 自定义分区策略: 了解有这个.
1.1 轮询策略、随机策略导致的乱序问题
  • 轮询策略、随机策略会导致Kafka中数据储存的乱序问题, 按照Key分配会导致数据倾斜问题,实际生产环境中要结合实际情况来做取舍
    Kafka的分区和副本机制详解_第2张图片

2. 消费者的分区策略

  • Range范围分配策略: Range范围分配策略是Kafka默认的分配策略,它可以确保每个消费者消费的分区数量是均衡的。Range分配策略之针对每个Topic

配置:

配置消费者的partition.assignment.strategy为
org.apache.kafka.clients.consumer.RangeAssignor。

算法公式:

n = 分区数量 / 消费者数量      
m = 分区数量 % 消费者数量
解释:     
	前m个消费者消费n+1个
	剩余消费者消费n个

图示:
Kafka的分区和副本机制详解_第3张图片

  • RoundRobin轮询策略: 将消费组内所有消费者以及消费者所订阅的所有topic的partition按照字典序排序,在通过轮询方式逐个将分区以此分配给每个消费者。
    Kafka的分区和副本机制详解_第4张图片

  • Stricky粘性分配策略:

    • 1.分区分配尽可能均匀

    • 2.在发生rebalance(消费者组在均衡)的时候,分区的分配尽可能与上一次分配保持相同

3. Kafka的副本机制

简介: 副本的目的就是冗余备份,当某个Broker上的分区数据丢失时,依然可以保障数据可用。因为在其他的Broker上的副本是可用的。

  • Kafka中对副本影响最大是producer配置的acks参数,acks参数决定了生产者生产消息时写入到副本的严格程度。它决定了生产者如何在性能和可靠性之间做取舍。

配置:

Properties props = new Properties();
props.put("bootstrap.servers", "node1.itcast.cn:9092");
props.put("acks", "all");   //这里
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  • 1.acks配置为0
    Kafka的分区和副本机制详解_第5张图片
  • 2 acks配置为1Kafka的分区和副本机制详解_第6张图片
  • 3 acks配置为-1或者all
    Kafka的分区和副本机制详解_第7张图片

你可能感兴趣的:(Kafka的分区和副本机制详解)