美文网首页
Kafka 总结

Kafka 总结

作者: tdwmarlboro | 来源:发表于2018-05-25 14:53 被阅读0次

    kafka 是一个分布式的、可分区的、可复制的消息系统。

    1、Kafka 体系架构:

    包括若干Producer(可以是服务器日志,业务数据,页面前端产生的page view等),若干broker(Kafka 支持水平扩展,一般broker 数量越多,集群吞吐率越高),若干Consume(Group),以及一个Zookeeper 集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在consumer group 发生变化时进行rebalance。Producer 使用push(推)模式将消息发布到broker,Consumer 使用pull(拉)模式从broker 订阅并消费消息。

    2、Topic & Partition

    一个topic 可以认为一个一类消息,每个topic将被分成多个partition,每个partition在存储层面是append log文件。任何发布到此partition的消息都会被追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),offset为一个long型的数字,它唯一标记一条消息。每条消息都被append到partition中,是顺序写磁盘,因此效率非常高。

    每一条消息被发送到broker中,会根据partition 规则选择被存储到哪一个partition。如果partiton规则设置合理,所有消息可以均匀分布到不同的partition里,这就实现了水平扩展

    3、高可靠性存储

    副本(replication)策略

    Kafka 的复制机制既不是完全的同步复制,也不是单纯的异步复制。完全同步复制要求All AliveFollower都复制完,这条消息才会被认为commit,这种复制方式极大的影响了吞吐率。而异步复制方式下,Follower异步的从Leader 复制数据,数据只要被Leader 写入log就被认为已经commit,这种情况下如果Follower复制完都落后于Leader,而如果Leader突然宕机,则会丢失数据。

    Kafka 使用ISR的方式,均衡了确保数据不丢失以及吞吐率。Follower可以批量的从Leader复制数据,而且Leader充分利用磁盘顺序读以及send file(zero copy)机制。

    ISR In-Sync Replicas机制 在副本中同步

    优点

    1、性能高,吞吐量大

    2、降低了系统和磁盘开销,Leader充分利用磁盘顺序读以及send file(zero copy)机制

    3、降低Leader与Follower 之间网络开销和交互次数

    缺点

    1、有可能会占用大量网络宽带,甚至堵塞网络,需要有流控机制,否则会影响线上服务

    2、因为Follower是批量拉取Leader消息,如果设置为保证所有replicas commit,才返回ACK 给生产者会存在抖动现象,Follower拉取Leader 修改HW,当HW与当次生产者请求logEndOffset 的offset一致时,客户端等待时间会拉长。

    replica 复制机制:

    Kafka中每个Broker 启动时,都会创建一个副本管理服务(ReplicaManager),该服务负责维护ReplicaFetcherThread 与其他Broker 链路连接关系,该Broker中存在多少Follower的partitions 对应leader partitions分布在不同的Broker上,有多少Broker就会创建相同数量的ReplicaFetcherThread线程同步对应partition数据,Kafka中partition 间复制数据是由Follower主动向leader获取消息,Follower每次读取消息都会更新HW状态。每当Follower的partitions发生变更影响leader所在Broker变化时,ReplicaManager 就会新建或销毁相应的ReplicaFetcherThread。

    4、Producer 发送消息到Broker

    acks = 0: producer不会等待broker发送ack ,因为发送消息网络超时或broker crash(1.Partition的Leader还没有commit消息 2.Leader与Follower数据不同步),既有可能丢失也可能会重发。

    acks = 1: 当leader接收到消息之后发送ack,可能会重发,丢的概率很小

    acks = -1: 当所有的follower都同步消息成功后发送ack.  丢失消息可能性比较低。

    5、Consumer 从Broker 拉取消息

    Kafka中有两种consumer接口,分别为Low-level API和High-levelAPI

    (1). Low-level API  SimpleConsumer

    这套接口比较复杂的,使用者必须要考虑很多事情,优点就是对Kafka可以有完全的控制。

    (2).  High-level API ZookeeperConsumerConnector

    High-level API使用比较简单,已经封装了对partition和offset的管理,默认是会定期自动commit offset,这样可能会丢数据的,因为consumer可能拿到数据没有处理完crash。

    Kafka中由Consumer维护消费状态,当Consumer消费消息时,支持2种模式commit消费状态,分别为立即commit和周期commit。前者会导致性能低下,做到消息投递恰好一次,但很少使用,后者性能高,通常用于实际应用,但极端条件下无法保证消息不丢失。

    6、数据可靠性与一致性

    Partition Recovery 机制

    1.以segment为单位管理Partition数据,方便数据生命周期的管理,删除过期数据简单

    2.在程序崩溃重启时,加快recovery速度,只需恢复未完全flush到磁盘的segment

    3.通过index中offset与物理偏移映射,用二分查找能快速定位msg,并且通过分多个Segment,每个index文件很小,查找速度更快。

    PartitionReplica 同步机制

    1.Partition的多个replica中一个为Leader,其余为follower

    2.Producer只与Leader交互,把数据写入到Leader中

    3.Followers从Leader中拉取数据进行数据同步

    4.Consumer只从Leader拉取数据

    ISR:所有不落后的replica集合, 不落后有两层含义:

    距离上次FetchRequest的时间不大于某一个值或落后的消息数不大于某一个值, Leader失败后会从ISR中选取一个Follower做Leader。

    相关文章

      网友评论

          本文标题:Kafka 总结

          本文链接:https://www.haomeiwen.com/subject/cilftftx.html