kafka随笔

kafka是一个消息队列
kafka有生产者producer和消费者consumer(以及消费者组consumer group)
一台kafka的服务器就是一个broker,一个kafka集群是由多个broker组成,一个broker可以容纳多个topic
topic可以理解为一个队列,生产者和消费者都是一个topic
partition是分区,一个topic里面可以有多个partition,每个partition是有序的
replica是副本,一个topic的每个partiion都有若干个副本
leader是每个分区的主副本,生产者发送数据的对象,以及消费者消费数据的对象都是leader
follower是每个分区的多个从副本,实时从leader同步数据,保持和leader数据的同步,leader发生故障时,某个follower会成为新的leader

查看当前服务器中所有topic
bin/kafka-topic.sh --zookeeper hadoop102:2181 --list
创建topic
bin/kafka-topic.sh --zookeeper hadoop102:2181
–create --replication-factor 3 --partitions 1 --topic first
删除topic
bin/kafka-topic.sh --zookeeper hadoop102:21811
–delete --topic first
发送消息
bin/kafka-console-producer.sh
–broker-list hadoop102:9092 --topic first
消费消息
bin/kafka-console-consumer.sh
–bootstrap-server hadoop102:9092 --from-beginning --topic first

工作机制
topic是逻辑上概念,而partition是物理上的概念。
一个topic分为多个partition
一个partition分为多个segment (kafka采取了分片和索引的机制,分为多个segment可以加快索引查找)
一个segment对应2个文件(.log .index)
该文件夹命名规则:topic名称+分区序号,
例如first这个topic有3个分区,则其对应的文件夹为first-0,first-1,first-2
00000000000000000000.index
00000000000000000000.log
00000000000000170410.index
00000000000000170410.log
00000000000000239430.index
00000000000000239430.log
index和log文件以当前segment得到第一条消息的offset命名
index存储大量的索引信息,log文件存储大量的数据,索引文件中的元数据指向对应数据文件中message
的物理偏移地址。

分区规则
producer需要将数据封装成一个ProducerRecord对象
(1)指明 partition 的情况下,直接将指明的值直接作为 partiton 值;
(2)没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值;
(3)既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),
将这个值与 topic 可用的 partition 总数取余得到 partition 值,也就是常说的 round-robin 算法。

数据可靠性保证
kafka选择 producer发送数据到指定topic,topic的每个partition收到数据后,都需要向producer发送ack,
如果producer收到Ack后,就会进行下一轮发送,否则重新发送数据
replica中leader动态维护了一个in-sync replica set(ISR),意为和leader保持同步的follower集合,
当ISR中的follower完成数据同步后,leader就会给producer发送ack。如果follower长时间未向leader同步数据,
则该follewer将被提出ISR。leader发生故障后,就会从ISR中选举新的leader

LEO (log end offset) 每个副本中最后一个offset
HW(High WaterMark) 所有副本中最小的LEO

Exactly once 语义: 数据既不重复也不丢失
幂等性:指的是producer不论向server发送多少的数据,server端只会持久化一条
at least once + 幂等性 = exactly once
启用幂等性,Producer的参数中enable.idompotence设置为true即可。
幂等性的实现其实是将下游需要做的去重放在了数据上游去处理
开启幂等性的producer在初始化的时候会被分配一个PID,发往同一个partition的消息会附带
sequence Number。而broker端会对<PID,partition,SeqNumber>做缓存,当具有相同主键的消息
被提交时,broker只会持久化一条
但是PID重启后会发生变化,同时不同的Partition也具有不同的主键,
所以幂等性无法保证跨分区跨会话的exactly once,0.11版本后引入事务支持,
事务可以保证Kafka在Exactly Once语义的基础上,生产和消费可以跨分区和会话,要么全部成功,要么全部失败。

Kafka 0.9版本之前,consumer默认将offset保存在Zookeeper中,
+从0.9版本开始,consumer默认将offset保存在Kafka一个内置的topic中,该topic为__consumer_offsets。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值