专栏首页T客来了内功提升-kafka producer 核心知识

内功提升-kafka producer 核心知识

目录

  • kafka producer
  • kafka 分区策略
  • kafka 数据可靠性保证 - ack
  • kafka 数据一致性保证 - Hw
    • 消费一致性
    • 存储一致性 同少同重复

1 kafka producer

1.1 分区策略

1.1.1 分区的原因

提高并发,以分区 partition 为单位进行读写操作

1.1.2 生产者生产消息进入的分区3种策略

这三种策略的前提都是明确知道具体的topic1. 明确知道partition index,则直接进入指定partition中2. 不知道partition index,给出了消息对应的key,则 hash(key)mod(num(partitions)) 获取对应的分区partition编号3. 不知道partition index, 但给出了消息的value,第一次调用时生成一个整数,并记录下来,后面每次调用在这个整数上自增,将这个值与topic 可用 的partition 总数取余 得到partition值,也是常说的 round-robin 算法

1.2 数据可靠性保证(非常重要,强烈建议深刻理解)

kafka 通过 leader partition发送ack 机制实现消息的可靠传输;

1.2.1 leader partition 发送ack给producer的充要条件:

  1. 确保有follower与leader同步完成,leader 再发送ack, 这样能保证leader挂掉之后,follower可以容灾,并从follower中选举出新的leader;
  2. 与leader同步的follower个数也有两种不同的策略:
    • 2.1 半数以上的follower同步完成,即可发送ack 优点: 延迟比较低 缺点: 选举新leader时,容忍n台节点故障,需要2n+1个副本
    • 2.2 全部follower完成同步,才发送ack 优点: 容忍n台节点故障,需要n+1个副本 缺点,延迟比较高 kafka 选用全量同步,虽然延迟高,但是数据副本量比较少

1.2.2 kafka the ISR of leader partition - 解决全量同步过程中follower副本挂掉,leader长时间等待的场景

问题1

如果 follower 副本在同步leader 数据的过程中,有一个副本挂掉了,长时间不能跟leader同步,那么leader就要一直等下去,直到挂掉的follower也同步了 leader 的数据,才发送ack,这个问题该如何解决?

kafka 通过在leader partition 维护一个动态的ISR即 同步副本(是个set),来保存与leader保持同步的follower集合。

follower如何被选定为ISR?older version: 同步时间快慢 + 与leader 差异的数据条数 (尽最大努力同步) 0.9 版本 new version 去掉了与leader 差异的数据条数因为会频繁操作zk(想象一下 batch_size > 差异数据num策略),保留了同步时间策略,用来作为选取follower作为ISR元素的依据;默认10s

1.2.3 ack 应答机制

为什么需要ack应答机制在某些场景下可以容忍数据丢失的情况,对数据的可靠性要求不高,能够容忍数据的少量丢失,所有没有必要等待ISR中的Follower全部接收成功 所以对于不同场景下的数据可靠性传输、与数据传输性能上的要求,kafka对应给出了如下三种ack应答机制配置策略。

1.2.3.1 acks = 0

0:producer 不等待 leader partition所在的broker 回传的ack,这个操作提供了一个最低的延迟,broker接收到(还没有写入磁盘的时候就已经返回返回),当broker 故障时有可能丢失数据 1:producer 等待 leader partition 所在的broker 回传的ack,leader partition 落盘成功后返回ack,如果follower同步之前leader故障, 那么将会丢失数据。-1: producer 等待 leader partition 所在的broker 回传的ack,partition 的leader 和follower 全部落盘成功后才返回ack。

但是,注意在 acks = -1时,在极端情况下还是可能会出现数据丢失的情况(这种情况很少见,但不代表没有),而且最容易出现的情况是数据重复 下面简单清晰的描述下这两种场景:

acks = -1,数据丢失 ISR 中的follower副本数量恰好为0,即当前leader partition接收的数据,没有follower 需要同步,且leader partition 发完ack之后挂掉了,那数据就丢失了。acks = -1, 数据重复 如果ISR 中维护的 followers 同步完数据,leader 在发送ack给producer 之前挂掉了,那么producer就会重发数据给新晋升的leader。此时,数据就会重复发送。

1.3 数据一致性问题

1.3.1 保证消费数据的一致性

场景描述: leader 接收了新一批数据,但是ISR 中follower还未同步完之前就挂掉了,如下图所示,假如consumer已经消费到了19,那么接下来将消费18,此时 leader挂掉,新的follower成为leader,那么去消费offset为18(当前最老的数据)就会报错。为应对以上问题,kafka通过 HW & LEO 的机制解决消费一致性问题:

解决方案:HW - High water 高水位 即ISR 中所有 follower 中最小的LEO LEO - 每个副本的最后一个offset

注意: HW 来保证数据一致性,高水位之前的数据是消费者可见的。

1.3.2 脑裂问题-存储的一致性

可能出现脑裂问题 ,leader 挂掉,follower 被选举为新leader, 先前挂掉的leader又重新活了起来,产生脑裂,如果此时producer又新发一批次数据, 这两个leader都会接收到数据,那么数据就发生混乱且不一致了。将来消费的数据都不一样 。脑补一下场面就可以了,那么如何解决脑裂产生数据不一致问题呢? 新官上任三把火: 告诉所有在ISR中记录的follower,将数据截取到HW, 跟新leader的存储数据保持一致注意 HW只能保证副本数据的一致性,并不能保证数据丢不丢失,或者重不重复,即要少都少,要多都多

以上问题讨论的都是ISR 记录的Follower 范围。

本文分享自微信公众号 - T客来了(ltdo11),作者:bofeng

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Kafka面试题基础27问:应该都会的呀!

    Producer将消息发送到集群指定的主题中存储,同时也自定义算法决定将消息记录发送到哪个分区?

    Java小咖秀
  • Kafka学习笔记之Kafka性能测试方法及Benchmark报告

      本文主要介绍了如何利用Kafka自带的性能测试脚本及Kafka Manager测试Kafka的性能,以及如何使用Kafka Manager监控Kafka的工...

    Jetpropelledsnake21
  • Kafka面试题——20道Kafka知识点

    消息的生产者被称为Producer。Producer将消息发送到集群指定的主题中存储,同时也自定义算法决定将消息记录发送到哪个分区?

    江帅帅
  • Kafka剖析系列之Benchmark

    性能测试及集群监控工具 本章将介绍Kafka提供的性能测试工具,Metrics报告工具及Yahoo开源的Kafka Manager。 Kafka性能测试脚本 $...

    用户1263954
  • RocketMQ 的基础概念和架构-RocketMQ知识体系1

    前面几篇文章分享了kafka 相关的实现逻辑,kafka在大吞吐量方面有较好的表现,但是有时候我们需要实现比较复杂的业务逻辑从而对于吞吐量方面要求不是太高,这个...

    DougWang
  • Kafka精进 | Producer端核心参数及调优建议

    在前面文章《Kafka精进 | 一文读懂Producer消息发送机制》中,我们从Kafka消息结构、序列化器、分区器及消息缓冲池等方面介绍了Producer端的...

    大数据技术架构
  • 事务消息大揭秘!RocketMQ、Kafka、Pulsar全方位对比

    ? 导语 | 事务是一个程序执行单元,里面的所有操作要么全部执行成功,要么全部执行失败。RocketMQ、Kafka和Pulsar都是当今业界应用十分广泛的开...

    腾小云
  • 开源消息中间件Kafka在华泰证券的探索与实践

    Spark学习技巧
  • 每秒处理10万条消息的高性能MQ,Kafka是怎么做到的?

    MQ(消息中间件)是项目开发中经常用到的一种技术。它是分布式系统重要的组件,主要用来解决应用解耦、异步任务、流量削锋等业务场景。MQ有非常多的开源实现,包括Ro...

    码农架构
  • Kafka精进 | 一文读懂Producer消息发送机制

    前面我们总结了broker端的核心参数,一些服务端原理细节后面文章再聊。本文我们重点讨论Producer端的消息发送机制,希望通过本文我们能整体掌握Produc...

    大数据技术架构
  • 详细剖析kafka分布式消息系统

    1.背景 最近因为工作需要,调研了追求高吞吐的轻量级消息系统Kafka,打算替换掉线上运行的ActiveMQ,主要是因为明年的预算日流量有十亿,而ActiveM...

    Java架构
  • 中通消息平台集群突破百万主题的技术探索

    随着业务上的增长与迭代,业务使用的消息集群会创建越来越多主题,在业务流量不断增长的情况下,还需要不断增加主题的分区数量,Kafka 由于本身的存储机制特点,随着...

    张乘辉
  • Kafka系列1:Kafka概况

    Kafka是当前分布式系统中最流行的消息中间件之一,凭借着其高吞吐量的设计,在日志收集系统和消息系统的应用场景中深得开发者喜爱。本篇就聊聊Kafka相关的一些知...

    王金龙
  • Apache Kafka 版本演进及特性介绍

    前段时间有一个同事问到:Kafka 0.8.2 只能使用Zookeeper连接吗?虽然仍有一部分Kafka的老用户在使用 0.8.x 版本,但 Kafka 0....

    大数据技术架构
  • 业务视角谈谈Kafka(第一篇)

    https://github.com/aalansehaiyang/technology-talk

    用户7676729
  • 阿里资深架构师仅用8个知识点带你参透Kafka!

    Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以...

    Java程序猿
  • Kafka的生成者、消费者、broker的基本概念

    kafka是一款基于发布与订阅的消息系统。它一般被称为“分布式提交日志”或者“分布式流平台”。文件系统或者数据库提交日志用来提供所有事物的持久化...

    chenchenchen
  • Kafka设计-恰好一次和事务消息

    为了解决重试导致的消息重复、乱序问题,kafka引入了幂等消息。幂等消息保证producer在一次会话内写入一个partition内的消息具有幂等性,可以通过重...

    王知无-import_bigdata
  • Kafka中sequence IO、PageCache、SendFile的应用详解

    大家都知道Kafka是将数据存储于磁盘的,而磁盘读写性能往往很差,但Kafka官方测试其数据读写速率能达到600M/s,那么为什么Kafka性能会这么高呢?

    大数据学习与分享

扫码关注云+社区

领取腾讯云代金券