kafka-1kafka基本概念和集群架构

消息系统的意义

  • 解耦
    • 生产者和消费者可以单独的进行扩展和修改,只需要遵循同样的接口约束就行
  • 扩展性
    • 因为解耦特性,可以单独的增加消息入队和处理频率
  • 冗余和防止数据丢失
    • 消息队列接受大量的数据并将数据持久化,直到被消费为止
      • 从消息队里删除数据前,需要处理系统明确的告知消息队里已处理完数据,从而保证了数据不会丢失。
  • 灵活性和峰值处理能力
    • 数据可能有峰值,按照峰值来配置资源会造成浪费。有了消息系统,峰值的压力由消息系统承担,大量的数据可以进入消息队里等待,而不是必须马上处理。
  • 可恢复性
    • 可恢复性主要指的是处理数据程序的可恢复性。系统的一部分组件失效时,不会影响整个系统。当某个处理程序重新启动后,可以继续处理数据
  • 顺序保证
    • 大部分消息队列是有序的,并且能保证数据会按照特定的顺序被处理。(kafka保证一个partition内的消息的消息有序,全局不保证,除非只有一个partition。但是只有一个partition就没意义了)
  • 缓冲
    • 由于解耦合消息队列的存在,生成消息和消费消息的速度可以不一致
  • 异步通信
    • 很多时候,用户不想也不需要立即处理数据。消息队列提供了异步通信机制。生产者可以一直向消息系统的消息队列放入数据,消费者可以在需要的时候处理数据。

简单来说消息系统的核心意义是

  • 解耦
  • 消息队列
  • 数据持久化

由以上特性延展派生出可扩展、缓冲、异步通信、灵活性、顺序保证和可恢复性。

kafka前身和概念

kafka前身

Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。

kafka概念

kafka是一个分布式消息队列

  • 具有高性能、持久化、多副本备份、横向扩展能力。
  • 生产者往队列里写消息,消费者从队里里取消息进行业务逻辑。
  • kafka是一种发布-订阅模式,将消息保存在磁盘中,以顺序读写的方式访问磁盘,避免随机读写导致性能瓶颈。

kafaka特性

  • 高吞吐、低延迟
    • kafka最大的特点就是,收发消息特别快。每秒可以处理几十万条消息,最低延迟只有几毫秒
  • 高伸缩性
    • 每个主题(topic)包含多个分区(partition),主题中的分区可以分布在不同的主机(broker)中
  • 持久性、可靠性
    • kafka允许数据持久化存储,消息被持久化到磁盘中,并支持数据备份来防止数据丢失
  • 容错性
    • 允许集群中的节点失败、某个节点宕机、kafka仍然能正常工作。
  • 高并发
    • 支持数千个用户同时读写

kafka集群架构

kafka-1kafka基本概念和集群架构

kafka集群中的角色

  • producer

    • 消息生产者,发布消息到kafka集群的终端或服务
  • broker

    • kafka集群中的服务器,一个broker代表kafka集群的一个节点
  • topic

    • 每条发布到kafka集群的消息属于的类别,某一消息的聚集,如:订单topic。不同类别的消息会去往不同的topic。kafka是面向topic的
    • topic就像一个消息队列,生产者根据消息的类别写往不同的topic,消费者从中读取消息。
    • 一个topic支持多个订阅者同时订阅它。
  • partition

    • 每个topic包含一个或多个partition。kafaka分配的单位是partition
  • replica

    • partition的副本,保障kafka的高可用
  • consumer

    • 消费者,从kafka中消费消息的终端或服务
      • consumer数量大于partition则有consumer空闲
      • consumer数量小于partition,则一个consumer消费多个partition
      • consumer数量等于partition,则一对一
  • consumer group

    • 每个consumer都属于一个consumer group
      • 同一个partition只能被同一个consumer group中的一个consumer消费
      • 同一个partition从可以被不同consumer group中的多个不同consumer消费
    • 因为一般同一个consumer group一般处理同一个业务,比如统计订单数据。同一组的多个如果消费同一个partition则可能导致数据统计重复。
      kafka-1kafka基本概念和集群架构
  • leader

    • 每个topic有至少一个partition,每个partition有且仅有一个leader
    • leader负责当前partition数据的读写,生产者和消费者只和leader互动
  • follow

    • Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader
  • controller

    • controller主要负责kafka集群的管理,包含
      • 感知broker是否宕机
      • leader的选举
      • partition的选举
      • 对新增broker的监听
      • 新增加broker后数据的迁移和负载均衡
      • kafka集群的各种元数据:如leader、partition、follower的位置等等
      • 删除topic后partition的删除
      • 等等
    • controller负责管理整个集群的各种东西
  • zookeeper

    • kafka通过zookeeper来存储集群的元数据信息
    • controller节点回在ZK上注册一个临时节点,其他节点监听该临时节点。当该controller节点宕机后,其他broker争抢再次创建临时节点,保证一台新的broker会成为controller角色。
  • offset

    • 偏移量即消费者在对应分区上已经消费的消息数(位置)。offset保存的地方和kafka的版本有关系
      • kafka0.8 版本之前offset保存在zookeeper上
      • kafka0.8 版本之后offset保存在kafka集群上
  • ISR机制: ISR机制主要是为了保证数据的不丢失,ISR列表中存放和leader数据完全同步的follower

    • 多副本机制能保证kafka的高可用,但不能保证数据不丢失。leader宕机时,数据还没有被同步到其他follower,即使选举了新的leader,也会丢失没有同步部分的数据。
    • ISR是:in-sync replica,就是跟leader partition保持同步的follower partition的数量,只有处于ISR列表中的follower才可以在leader宕机之后被选举为新的leader,因为在这个ISR列表里代表他的数据跟leader是同步的。