kafka之高可靠、一致性、高吞吐

本文深入探讨了Kafka如何保障高可靠性,包括消息确认机制(acks=0, acks=1, acks=all)以及分区副本策略。同步副本集合ISR确保在 Leader 失效时能快速选举新的Leader,保证数据不丢失。同时,Kafka通过顺序读写、零拷贝、文件分段和批量发送等手段实现了高吞吐。数据压缩功能进一步提升了性能。
摘要由CSDN通过智能技术生成

高可靠

1、ACK机制
如果我们要往 Kafka 对应的主题发送消息,我们需要通过 Producer 完成。前面我们讲过 Kafka 主题对应了多个分区,每个分区下面又对应了多个副本;为了让用户设置数据可靠性, Kafka 在 Producer 里面提供了消息确认机制。也就是说我们可以通过配置来决定消息发送到对应分区的几个副本才算消息发送成功。可以在定义 Producer 时通过 acks 参数指定。这个参数支持以下三种值:

  • acks = 0:意味着如果生产者能够通过网络把消息发送出去,那么就认为消息已成功写入 Kafka 。在这种情况下还是有可能发生错误,比如发送的对象无能被序列化或者网卡发生故障,但如果是分区离线或整个集群长时间不可用,那就不会收到任何错误。在 acks=0 模式下的运行速度是非常快的(这就是为什么很多基准测试都是基于这个模式),你可以得到惊人的吞吐量和带宽利用率,不过如果选择了这种模式, 一定会丢失一些消息。
  • acks = 1:意味若 Leader 在收到消息并把它写入到分区数据文件(不一定同步到磁盘上)时会返回确认或错误响应。在这个模式下,如果发生正常的 Leader 选举,生产者会在选举时收到一个 LeaderNotAvailableException 异常,如果生产者能恰当地处理这个错误,它会重试发送悄息,最终消息会安全到达新的 Leader 那里。不过在这个模式下仍然有可能丢失数据,比如消息已经成功写入 Leader,但在消息被复制到 follower 副本之前 Leader发生崩溃。
  • acks = all(这个和 request.required.acks = -1 含义一样):意味着 Leader 在返回确认或错误响应之前,会等待所有同步副本都收到悄息。如果和min.insync.replicas 参数结合起来,就可以决定在返回确认前至少有多少个副本能够收到悄息,生产者会一直重试直到消息被成功提交。不过这也是最慢的做法,因为生产者在继续发送其他消息之前需要等待所有副本都收到当前的消息。
  • 此外,producer支持同步发送和异步发送发送消息。如果设置成异步,虽然会极大的提高消息发送的性能,但是这样会增加丢失数据的风险。如果需要确保消息的可靠性,必须将 producer.type 设置为 sync,发送消息的速度会降低。
  • 2、分区副本
  • Kafka 可以保证单个分区里的事件是有序的,整个队列(topic)无序。在众多的分区副本里面有一个副本是 Leader,其余的副本是 follower,所有的读写操作都是经过 Leader 进行的,同时 follower 会定期地去 leader 上的复制数据,进行同步操作。当 Leader 挂了的时候,ISR集合中的一个 follower 会重新成为新的 Leader。通过分区副本,引入了数据冗余,同时也提供了 Kafka 的数据可靠性。
    Kafka 的分区多副本架构是 Kafka 可靠性保证的核心,把消息同步到多个副本可以使 Kafka 在发生崩溃时仍能保证消息的持久性。

一致性

ISR同步副本集合
Kafka中,一个topic的某个partition的leader如果失效,可以在该partition的ISR中动态选举出一个新的leader
ISR概念: ISR(in-sync replicas)集合(同步副本)。每个分区的 leader 会维护一个 ISR 集合,ISR 集合里面就是 follower 副本的 Borker 编号,leader副本也在ISR中,只有跟得上 Leader 的 follower 副本才能加入到 ISR 里面,跟的上并不是完全同步才算跟的上,这个是通过 replica.lag.time.max.ms 参数配置的,也就是说ISR中副本的LEO最多落后leader副本LEO这个参数值,只有 ISR 里的成员才有被选为 leader 的可能。跟不上 Leader 的 follower 副本进入OSR(out-sync replicas)。

高吞吐

1、顺序读写:kafka的消息是不断追加到文件中的,这个特性使kafka可以充分利用磁盘的顺序读写性能
2. 零拷贝:跳过“用户缓冲区”的拷贝,建立一个磁盘空间和内存的直接映射,数据不再复制到“用户态缓冲区”
3. 文件分段:kafka的队列topic被分为了多个区partition,每个partition又分为多个段segment,所以一个队列中的消息实际上是保存在N多个片段文件中
4. 批量发送:Kafka允许进行批量发送消息,先将消息缓存在内存中,然后一次请求批量发送出去
5. 数据压缩:Kafka还支持对消息集合进行压缩,Producer可以通过GZIP、Snappy、LZ4格式对消息集合进行压缩,一般LZ4的压缩速度快,压缩率低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值