kafka流水账

kafka的消息按照topic来进行逻辑区分。为了提升吞吐及可用性,每个topick可以有多个分区(partition)。每个分区可以有多个副本。但是同一个分区只有一个副本是leader,其他均为follower
分区中的消息是有序的,但是topic的消息可能是无序的。kafka仅保证分区消息有序
发送到分区上的消息,是通过日志形势持久化的
一个topic分为多个partition、一个partition分为多个segment、一个segment包含两个文件(.log文件及.index文件)
每个.log文件的大小为1G,超过1G则会创建新的log文件


生产者分区策略
为什么分区?1:方便集群扩展 2.提高并发
分区原则:
生产者指明partition————发送到对应的partition上
生产者未指明partition,但存在key————根据key的hash值对topic分区总数取余,得到具体分区
生产者未指明partition和key————round-robin

生产者ISR
ISR:in-sync replica set 同步副本集合
isr由leader分区来维护。存储在Zookeeper上
分区副本宕机则将被移除对应分区的ISR
只有ISR中的副本能够进行leader选举


ACK机制
partition收到producer发送的数据后,需要回复ack。若producer未收到ack会重新发送数据
ack由 leader partition发送,会在全部follower同步完成后发送ack
kafka的三种可靠级别:
0: producer不等待ack
1:producker等待ack,partition leader将数据落盘成功后返回ack
-1(all):producker瞪大ack,partition leader等待ISR中的全部follower都落盘成功才返回ack


消费者
对于处于同一个消费者组中的消费者,通知只有1个消费者可以消费同一条消息。如何保证的?消费者组里的消费者加入组时都会分配消费的partition。当:
1.当N个分区1个consumer时,该consumer从所有分区中消费
2.当分区数量等于组中消费者数量时,1个消费者对应1个分区
3.当consumer数量超过分区数时,多余的部分consumer将限制


数据一致性问题:
名次:
LEO:每个副本的最后一个offset
HW(high watermark):所有副本中最小LEO
follower故障和leader故障

follower故障:follower发生故障后会被临时踢出ISR;follower恢复后,读取本地磁盘记录的上次的HW,并将log文件高于HW的部分截取掉,从HW开始向leader进行同步,等待该follower的LEO大于等于该partition的HW,即follower追上leader之后,就可以重新加入ISR了。
leader故障:leader发生故障之后,会从ISR中选出一个新的leader,为了保证多个副本之间的数据的一致性,其余的follower会先将各自的log文件高于HW的部分截掉,然后从新的leader中同步数据。


ExactlyOnce
0.11版本的kafka,引入了一项重大特性:幂等性。幂等性指代Producer不论向Server发送了多少次重复数据,Server端都只会持久化一条数据。幂等性结合At Least Once语义就构成了Kafka的Exactly Once语义。
实现方式:开启幂等性的Producer在初始化的时候会被分配一个PID,发往同一个Partition的消息会附带Sequence Number,而Broker端会对<PID,Partition,SeqNumber>做缓存,当具有相同主键的消息的时候,Broker只会持久化一条。

offset提交:
consumer通过topic———_consumer_offset提交偏移量
当触发再均衡时,consumer会被分配到新的分区上,并从分区读取之前最后提交的offset继续处理
如果最后提交的offset小于正在处理的消息,那么这之前的消息会被重复消费
如果最后提交的offset大雨正在处理的消息,那么这之间的消息将会丢失

消费者提交offset的方式:自动、手动。
自动:可设置提交间隔,如定时5s提交一次。问题:如果在两次提交之间触发再均衡,则会出现消息重复消费。可适当降低定时间隔
手动:在完成数据处理后程序主动吊用commitSync()

Kafka存储管理

分区分配

创建主题时,kafka会决定如何在broker间分配分区。需要达到以下几个目标:

1.在broker间平均的分布分区的副本

2.确保每个分区的每个副本分布在不同的broker上

3.如果为broker指定了机架信息,则尽可能把每个分区的副本分配到不同机架的broker上

文件目录分配原则:计算每个目录分区数量,新的分区总是被添加到数量最小的那个目录里

注意:分配分区不会考虑磁盘空间

存储结构

创建topick并指定分区数量后,每个分区单独创建1个目录。目录中主要包含两类文件:.index索引文件以及.log数据文件。
每个目录可能包含多个.index和.log文件。可以理解未划分了多个segment。每个segment包含一对.index和.log文件,其前缀相同,均以文件起始偏移量命名。

使用多个segment可以提升消息检索效率,可以从一个相对较小的segment中检索消息。同时配合.index文件可以快速定位
.index文件中存储的是若干个条目,每个条目表示数据文件中的一条message的索引,包含两部分:相对offset和position
相对offset是message相对所处文件最小offset的一个相对便宜量

消息检索过程:
1)先定位segment file。对所有日志文件,通过二分确认处于哪个日志文件
2)再从.index文件中中顺序查找物理偏移地址
3)基于物理偏移地址从.log文件中查找消息

Q:kafka如何给予index文件和log文件查询消息
.log文件的文件名即位第一个消息的offset??

Q:kafka如何持久化消息
Q:生产者如何将消息发送到partition上
Q:ACK机制
Q:消费者如何选择从那个partition消费(消费者分区策略)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值