Kafka 基础

80 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

2 快速搞定 Kafka 术语

  • 消息:Record。Kafka 是消息引擎嘛,这里的消息就是指 Kafka 处理的主要对象。
  • 主题:Topic。主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。
  • 分区:Partition。一个有序不变的消息序列。每个主题下可以有多个分区。
  • 消息位移:Offset。表示分区中每条消息的位置信息,是一个单调递增且不变的值。
  • 副本:Replica。Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。副本还分为领导者副本和追随者副本,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
  • 生产者:Producer。向主题发布新消息的应用程序。
  • 消费者:Consumer。从主题订阅新消息的应用程序。
  • 消费者位移:Consumer Offset。表征消费者消费进度,每个消费者都有自己的消费者位移。
  • 消费者组:Consumer Group。多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。
  • 重平衡:Rebalance。消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。

Kafka 体系架构 = M个 producer + N个 broker + K个 consumer + ZK 集群

基础架构

  • Producer:消息生产者,就是向 Kafka broker 发消息的客户端。

  • Consumer:消息消费者,向 Kafka broker 取消息的客户端。

  • Consumer Group(CG):消费者组,由多个 consumer 组成。

    • 消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;
    • 消费者组之间互不影响。
    • 所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者
  • Broker:一台 Kafka 服务器就是一个 broker

    • 一个集群由多个 broker 组成。一个broker 可以容纳多个 topic
  • Topic:可以理解为一个队列,生产者和消费者面向的都是一个 topic

  • Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。

  • Replica:副本。一个 topic 的每个分区都有若干个副本,一个 Leader 和若干个 Follower

  • Leader:每个分区多个副本的“主” ,生产者发送数据的对象,以及消费者消费数据的对象都是 Leader。

  • Follower:每个分区多个副本中的“从”,实时从 Leader 中同步数据,保持和Leader 数据的同步。Leader 发生故障时,某个Follower 会成为新的 Leader。

3 Kafka只是消息引擎系统吗?

Apache Kafka 是消息引擎系统,也是一个分布式流处理平台(Distributed Streaming Platform)。

4 我应该选择哪种Kafka?

  • Apache Kafka(社区版 Kafka)

    • 优势在于迭代速度快,社区响应度高,使用它可以让你有更高的把控度;
    • 缺陷在于仅提供基础核心组件,缺失一些高级的特性。
  • Confluent Kafka(Confluent 公司提供)

    • 优势在于集成了很多高级特性且由 Kafka 原班人马打造,质量上有保证;
    • 缺陷在于相关文档资料不全,普及率较低,没有太多可供参考的范例。
  • CDH/HDP Kafka(大数据云公司提供的 Kafka,内嵌 Apache Kafka)

    • 优势在于操作简单,节省运维成本;
    • 缺陷在于把控度低,演进速度较慢。

  • 推荐的监控工具

    • 试试JMXTrans + InfluxDB + Grafana
    • 一个是 kafka tools ,能够清晰的看到kafka存储结构。一个是 granafa,能看到消费的折线图。
    • 滴滴开源github.com/didi/Logi-K…,是目前市面上最好用的一站式 Kafka 集群指标监控与运维管控平台。

5 聊聊Kafka的版本号

  • Kafka 版本命名:大版本号 - 小版本号 - Patch 号,如 kafka-2.11-2.1.1

    • 2.11是 Scala 编译器版本
    • 真正的 Kafka 版本号实际上是 2.1.1
      • 前面的 2 表示大版本号,即 Major Version;中间的 1 表示小版本号或次版本号,即 Minor Version;最后的 1 表示修订版本号,也就是 Patch 号。
  • Kafka 版本演进

    • 0.7版本:只提供最基础的消息队列功能
    • 0.8版本
      • 引入了副本机制(成为了一个真正意义上完备的分布式高可靠消息队列解决方案)(较好地做到消息无丢失)
      • 0.8.2.0 版本社区引入了新版本 Producer API,即需要指定 Broker 地址的 Producer
    • 0.9版本
      • 增加了基础的安全认证 / 权限功能,Java重写了新的consumer API;(不建议使用consumer API)
      • 引入了 Kafka Connect 组件用于实现高性能的数据抽取;
    • 0.10版本(里程碑式的大版本)
      • 引入Kafka Streams功能(Kafka 正式升级成分布式流处理平台);
      • 建议版本0.10.2.2;建议使用新版consumer API
    • 0.11版本(2017 年 6 月)
      • 提供幂等性 Producer API 以及事务(Transaction) API;
      • 对 Kafka 消息格式做了重构。
      • 建议版本0.11.0.3(目前最主流的版本之一)。
    • 1.0 和 2.0 版本:主要还是 Kafka Streams 的各种改进,在消息引擎方面并未引入太多的重大功能特性。
      • 如果你是 Kafka Streams 的用户,至少选择 2.0.0 版本吧。
      • 如果你在意的依然是消息引擎,那么这两个大版本都是适合于生产环境的。
    • 3.0版本
  • 最后建议,不论你用的是哪个版本,都请尽量保持服务器端版本和客户端版本一致,否则你将损失很多 Kafka 为你提供的性能优化收益。