kafka-入门

194 阅读6分钟

消息模型

点对点

生产者向消息队列发送一个消息之后,只能被一个消费者消费一次

发布/订阅

生产者向topic发送一个消息之后,多个消费者可以从该topic得到数据

作用

  • 解耦:上有关注消息通知,而不关注下游处理
  • 异步处理
  • 缓冲(削锋):应对突发流量
  • 广播:一条信息,可以被多个下游处理
  • 持久化:消息可以被回溯

kafka

基本概念

role(角色)

  • producer:生产者生成数据,默认情况下生产者会把一个消息均匀的分散在不同分区,但是也可以根据分区器将消息写入指定分区
  • consumer:消费者消费数据,消费者订阅一个或多个主题,并按照消息生成的顺序消费数据;消费者通过偏移量来区分已经读取过的数据
  • consumer group:消费者是消费者群组的一部分,群组保证每个分区只能被一个消费者使用,消费者和分区之间的映射关系通常又被称为所有权关系
  • broker:一个独立的kafka服务器被称为broker,broker接收来自生产者的消息,为消息设置偏移量,并提交到磁盘保存。broker为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘的消息。根据特定的硬件以及其性能特征,一个broker能轻松应对上千个分区以及每秒百万级的并发量

consumer(消费者):

  • rebalance:在一个consumer group中增加conumser会导致分区的再分配
  • 群组协调器:一个特殊的broker,作为消费组的协调者。不同的群组可以有不同的协调器
  • 心跳:consumer会向协调器发送信息表示自己健康状态
  • 提交:更新分区当前位置的操作

offset(偏移量)

  • 偏移量也是一种元数据,它是一个不断递增的整数,在给定的分区上每个消息的分区都是唯一的,消费者把每个分区读取的最后偏移量放在zookeeper或kafka上。如果消费者关闭或重启数据不会丢失。

Record(消息)

  • Key-Value
  • Timestamp

Topic(话题)

  • 逻辑概念
  • 发布-订阅均基于Topic

Partition(分区)

  • 一个Topic包含一个或多个partition
  • 每个partition对应物理上的一个文件夹

Segment

  • 每个Segment对应物理上的一个文件

Replica(分区副本)

  • leader 主副本
  • follower 冗余副本

partition分区策略

kafka中会以partition为纬度进行副本存储,一个partition的所有副本被叫做AR(Assigned Replicas)。所有与副本保持一定程度同步(可配置)的副本组成ISR(In-Sync Replicas),与副本同步滞后过多的副本组成OSR(Out-of-Sync Replicas);

AR = ISR + OSR

当leader副本发生问题时,会将ISR中的第一个follower作为leader

生产者

有一个独立的线程负责把这些记录批次发送到相应的broker上,所以发送器的线程应该是批次级别的。

不同的发送场景

  1. 发送并忘记(大部分情况下消息都能被正确的送达,因为kafka自带错误重试机制)
  2. 同步发送
  3. 异步发送

生产者信息三元组

  1. broker
  2. topic
  3. partition

消费者

消费者的核心是轮训,通过一个简单的轮训想服务器请求数据。一旦消费者订阅了主题,轮训就会处理所有细节,包括群组协调、分区再均衡、发送心跳、获取数据

在同一个群组中,我们无法让一个线程运行多个消费者,也无法让多个线程安全的共享一个消费者。按照规则,一个消费者使用一个线程。

消费者消息三元组

  1. broker
  2. topic
  3. partition
  4. offset

consumer与consumer group

如何实现安全的rebalance以及避免不必要的rebalance?

rebalance过程

  • 群主:第一个加入该消费组的消费者
  • 只有群主能掌握全部消费者分区信息,其他消费者只知道自己的分区信息

提交和偏移量

消费者是如何提交偏移量的?消费者往一个叫做_consumer_offset的特殊主题发送消息,消息里包含每个分区的偏移量。如果消费者一直处于运行状态,那么偏移量就没有什么用处。不过,如果当新的消费者加入或者消费者崩溃的时候,就会触发rebalance,在rebalance之后,消费者对应的分区有可能改变。为了能够继续之前的工作,消费者需要读取每个分区最后一次提交的偏移量。

提交方式

  • 自动提交:将enable.auto.commit设置为true,消费者每间隔auto.commit.inteval.ms时间进行一次提交。问题:消息冗余处理。
  • 同步提交:调用commitSync()同步提交。问题:上一次同步提交到rebalance这段期间到消息会用冗余处理
  • 异步提交:调用commitAsync()
  • 同步和异步提交组合:当消费者正常时,使用异步提交。当消费者快退出时,使用同步提交。

kafka信息保存位置

zookeeper

  1. topic
  2. 配置信息
  3. 旧版本consumer

broker

  1. 新版本consumer

聚焦

Kafka的特性,为什么选择kakfa?

  • 多个消费者:由于消费组的存在,使得kafka同时满足点对点模式以及发布/订阅模式
  • 基于磁盘的数据存储:保证了消息的持久化
  • 伸缩性:支持consumer、broker、producer的伸缩
  • 高性能:上面的特性保证了kafka的高性能,通过横向扩展c、b、p可以轻松处理巨大的消息流;并且kafka还能保证毫秒级的延迟。

Kafka 选主怎么做的?

  • 讲冗余分为两种:ISR、OSR;当leader副本出现问题,从ISR中选取第一个follower作为leader

kafka如何保证生产与消费都是同步的?

kafka 怎么保证不丢消息的?

  • kafka消费者自带重试机制
  • 消息冗余提交机制,只有当一个消息被同步到所有ISR中,才会认为一个消息被成功提交,防止单机故障丢失信息

Kafka中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?

  • 分区器:根据消息“键”计算出散列值,通过散列值将消息写入分区
  • 序列化器:与反序列化器一一对应,这样才能保证消息被正确解析

KafkaConsumer是非线程安全的,那么怎么样实现多线程消费? 题意解释:kafka一个分区只能有一个消费者(同一个消费组),如何实现多个消费者共同消费同一个分区? 方法大致上可以理解为将消费和处理的过程解耦

kafka topic数可不可以增加? blog.csdn.net/u013256816/…

保留消息机制?

  • 保留一段时间
  • 保留空间限制
  • 自己灵活配置

为什么选择多集群?

  • 数据类型隔离
  • 安全级别隔离
  • 多数据中心

Linux操作系统调优

  1. 虚拟内存
    • 内存交换
    • 脏页(????)
  2. 磁盘
    • 文件系统选择
    • 禁止非必要文件元数据
  3. 网络
    • 系统内核没有针对大流量网络传输进行优化,所以大部分web系统都得自己对Linux网络栈进行优化
    • 增加TCP socket缓存区大小

参考文档

kafka权威指南 kafka参数配置