Kafka学习知识要点

Win10下kafka简单安装及使用
https://blog.csdn.net/github_38482082/article/details/82112641

—— MQ

定义:是一个分布式的基于发布 / 订阅模式的消息队列,主要应用于大数据实时处理领域
优点:解耦;削峰;缓冲(生产大于消费);灵活性(分布式)

两种模式

  • 点对点模式(消费者主动拉取数据,消费者消费数据后清除消息)
  • 发布/订阅模式(一对多,消费者消费数据之后不会被清除)
    队列自动推送;消费者主动拉取(kafka,需要不断去轮询队列)

—— Kafka

架构图
在这里插入图片描述
基本概念
存储于磁盘中,默认存储7天

  • Producer : 消息生产者,就是向 Kafka ;
  • Consumer : 消息消费者,向 Kafka broker 取消息的客户端;
  • Consumer Group (CG): 消费者组,由多个 consumer 组成。 消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。 所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
  • Broker :经纪人 一台 Kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker可以容纳多个 topic。
  • Topic : 主题,可以理解为一个队列, 生产者和消费者面向的都是一个 topic;
  • Partition: 分区,为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列;
  • Replica: 副本(Replication),为保证集群中的某个节点发生故障时, 该节点上的 partition 数据不丢失,且 Kafka仍然能够继续工作, Kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower。
  • Leader: 每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 leader。
  • Follower: 每个分区多个副本中的“从”,实时从 leader 中同步数据,保持和 leader 数据的同步。 leader 发生故障时,某个 Follower 会成为新的 leader。

—— 安装配置

server.properties

  • broker.id=0(broker的全局唯一编号,不能重复)
  • delete.topic.enable=true(删除 topic 功能使能)
  • log.dirs=/opt/module/kafka/logs (kafka 运行日志存放的路径)
  • zookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181(配置连接 Zookeeper 集群地址)

xsync kafka/(分发在集群节点上)

—— 命令行操作Topic增删改查

  • 开启kafka内置ZK(不要关闭当前窗口):.\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties

  • 读取配置文件启动kafka:.\bin\windows\kafka-server-start.bat .\config\server.properties

  • 创建 topic——replication-factor 定义副本数——partitions 定义分区数: .\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test-topic

  • 进入对应的topic生产者:.\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic test-topic

  • 消费消息 --from-beginning: 会把主题中以往所有的数据都读取出来: .\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test-topic --from-beginning

  • 查看当前服务器中的所有 topic: bin\windows\kafka-topics.bat --list --zookeeper localhost:2181

  • 删除 topic:bin\windows\kafka-topics.bat --zookeeper localhost:2181 --delete --topic test-topic

  • 查看某个 Topic 的详情:bin\windows\kafka-topics.bat --zookeeper localhost:2181 --describe --topic first

—— 数据日志分离

server.propertieslog.dirs=/opt/module/kafka/logs进行修改配置(存在日志和数据,更改为logs和data)

—— 工作流程

在这里插入图片描述

  • Kafka中消息是以topic进行分类,producer生产消息,consumer消费消息,都是面向topic的
  • topic是逻辑上的概念(不存在的),partition是物理上的概念(能找到的文件夹),每个partition都有一个log文件,该文件存储的就是producer生产的数据
  • producer生产的数据会不断追加到log文件末端,且每条数据都有自己的offset(偏移量)。consumer组中的每个consumer,都会实时记录自己消费到了哪个offset,以便出错恢复时,从上一个位置继续消费

—— 文件存储

在这里插入图片描述

  • 因为producer生产的消息不断追加到 log 文件末尾, 为防止 log 文件过大导致数据定位效率低下, Kafka 采取了分片和索引机制,将每个 partition 分为多个 segment(分片)
  • 每个 segment对应两个文件——“.index”文件和“.log”文件。 这些文件位于一个文件夹下, 该文件夹的命名规则为: topic 名称+分区序号
  • “.index”文件存储大量的索引信息,“.log”文件存储大量的数据,索引文件中的元数据指向对应数据文件中 message 的物理偏移地址
  • .index文件中查找.log文件中message的offset(偏移量)方法:
    二分查找法

—— 生产者

—— 分区策略

分区原因

  • 方便在集群中扩展,每个 Partition 可以通过调整以适应它所在的机器,而一个 topic又可以有多个 Partition 组成,因此整个集群就可以适应适合的数据
  • 可以提高并发,因为可以以 Partition 为单位读写(联想到ConcurrentHashMap在高并发环境下读写效率比HashTable的高效)

分区原则

  • 指明 partition 的情况下,直接将指明的值直接作为 partiton 值
  • 没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值
  • 既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition值,也就是常说的 round-robin (轮询)算法

—— ISR

为保证 producer 发送的数据,能可靠的发送到指定的 topic, topic 的每个 partition 收到producer 发送的数据后,都需要向 producer 发送 ack(acknowledgement 确认收到),如果producer 收到 ack, 就会进行下一轮的发送,否则重新发送数据

在这里插入图片描述
副本数据同步策略
在这里插入图片描述
Kafka 选择了第二种方案,原因如下:

  • 同样为了容忍 n 台节点的故障,第一种方案需要 2n+1 个副本,而第二种方案只需要 n+1 个副本,而 Kafka 的每个分区都有大量的数据, 第一种方案会造成大量数据的冗余。
  • 虽然第二种方案的网络延迟会比较高,但网络延迟对 Kafka 的影响较小。

ISR
Leader 维护了一个动态的 in-sync replica set (ISR),意为和 leader 保持同步的 follower 集合。当 ISR 中的 follower 完成数据的同步之后,就会给 leader 发送 ack。如果 follower长时间未向leader同步数据,则该follower将被踢出ISR,该时间阈值由replica.lag.time.max.ms参数设定。 Leader 发生故障之后,就会从 ISR 中选举新的 leader。

—— ACK机制

acks参数配置

  • 0: producer 不等待 broker 的 ack,这一操作提供了一个最低的延迟, broker 一接收到还没有写入磁盘就已经返回,当 broker 故障时有可能丢失数据
  • 1: producer 等待 broker 的 ack, partition 的 leader 落盘成功后返回 ack,如果在 follower同步成功之前 leader 故障,那么将会丢失数据
  • -1(all) : producer 等待 broker 的 ack, partition 的 leader 和 ISR 的follower 全部落盘成功后才返回 ack。但是如果在 follower 同步完成后, broker 发送 ack 之前, leader 发生故障,那么会造成数据重复

—— 数据一致性

在这里插入图片描述

  • LEO:(Log End Offset)每个副本的最后一个offset
  • HW:(High Watermark)高水位,指的是消费者能见到的最大的 offset, ISR 队列中最小的 LEO
  • follower 故障:follower 发生故障后会被临时踢出 ISR,待该 follower 恢复后, follower 会读取本地磁盘记录的上次的 HW,并将 log 文件高于 HW 的部分截取掉,从 HW 开始向 leader 进行同步。等该 follower 的 LEO 大于等于该 Partition 的 HW,即 follower 追上 leader 之后,就可以重新加入 ISR 了。
  • leader 故障:leader 发生故障之后,会从 ISR 中选出一个新的 leader,之后,为保证多个副本之间的数据一致性, 其余的 follower 会先将各自的 log 文件高于 HW 的部分截掉,然后从新的 leader同步数据。

注意: 这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。

—— ExactlyOnce

  • At Least Once:将服务器的 ACK 级别设置为-1(all),可以保证 Producer 到 Server 之间不会丢失数据
  • At Most Once:将服务器 ACK 级别设置为 0,可以保证生产者每条消息只会被发送一次
  • 幂等性:指生产者不论向服务器发送多少次重复数据,服务器上只会持久化一条(At Least Once + 幂等性 = Exactly Once
  • 要启用幂等性,只需要将 Producer 的参数中 enable.idempotence 设置为 true 即可。 Kafka的幂等性实现其实就是将原来下游需要做的去重放在了数据上游。开启幂等性的 Producer 在初始化的时候会被分配一个 PID,发往同一 Partition 的消息会附带 Sequence Number。而Broker 端会对PID,Partition,SeqNumber>做缓存,当具有相同主键的消息提交时, Broker 只会持久化一条。

但是 PID 重启就会变化,同时不同的 Partition 也具有不同主键,所以幂等性无法保证跨分区跨会话的 Exactly Once

—— 事务

producer事务

  • 为了实现跨分区跨会话的事务,引入一个全局唯一的一个TransactionID,并将Producer获得的PID和TransactionID绑定,这样当Producer重启后就可以通过正在进行的TransactionID获得原来的PID

consumer事务

  • Kafka事务机制主要是从producer方面考虑,对于consumer相对较弱,无法保证commit的信息被精确消费。因为consumer可以通过offset访问任何消息,并且不同的segment file生命周期不同,同一事务的消息可能会出现重启后被删除的情况

—— ZK在Kafka中的作用

kafka集群中有一个broker会被选举为Controller,负责管理集群broker的上下线,所有topic的分区副本分配和leader选举工作

—— 相关资料

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序少年不秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值