Kafka深入理解

kafka有三层形式:kafka有多个主题,每个主题下有多个分区,每个分区有多个消息的形式。
每个分区可以分不到不同的机器上

副本机制:
在kafka中,每个主题可以有多个分区,每个分区又可以有多个副本。这多个副本中,只有一个是leader,而其他的都是follower副本。仅有leader副本可以对外提供服务。

1.ISR(in-sync replicas)同步副本

ISR其实是一个列表。ISR中的副本都是与Leader进行同步的副本,所以不在该列表的follower会被认为与Leader是不同步的。Leader副本总是存在于ISR中. 而follower副本是否在ISR中,取决于该follower副本是否与Leader副本保持了“同步”。在一定时间内,若follower可以将leader的内容同步完成,则该follower就存在于ISR列表中,否在就会剔除该列表。

2.Consumer消费Partition的分配策略

分配策略使用:partition.asssignment.strategy 进行设置,有三个选项可以选择:
RangeAssignor
RoundRobinAssignor
StickyAssignor

1.RangeAssignor

Range策略是对每个topic而言的,首先对同一个主题里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。
r = p/c=2(其中p是分区数,c是消费者数),用于设置每个消费者所分配的partition的数量,设置为r+1
比如:一个topic,有8(p0,p1,…p7)个分区,但是有三个consumer(c0,c1,c2),在这种情况下
c0分配:p0,p1,p2
c1分配:p3,p4,p5
c2分配:p6,p7

2.RoundRobin策略

与上面类似,但是不是连着的partition分给consumer,而是轮询的方式,分好后的情况如下;
c0分配:p0,p3,p6
c1分配:p1,p4,p7
c2分配:p2,p5
先为c0分p0,c1分p1,c3分p2,之后c0分p3,c1分p4,c2分p5,依次直至分完。

3.Sticky

粘合策略,如果rebalance,会在之前已分配的基础上调整,不会改变之前的分配情况。如果这个策略没有开,那么就要进行全部的重新分配,建议开启

3.当你使用kafka-topics.sh创建(删除)了一个topic之后,Kafka背后会执行什么逻辑?

4.kafka的幂等性

只在topic下的单个partiton是幂等性的

5.kafka如何实现高可用

副本机制也是分布式系统中的常用的机制。
kafka中每个分区都会有多个副本,多个副本分别部署在不同的broker中,不同的broker都分别部署在不同的机器上,这样就提高了容错性,提高了高可用,一旦某个机器挂了,也不会导致该分区不可用。每个分区的多个副本是主从leader-follower的关系,有一个leader副本,其他都是follow副本。生产者的写和消费者的读都是和leader副本打交道,follow副本只负责从leader副本pull数据,冗余数据。一旦leader副本所在的broker宕机了,可以从余下broker中的follow副本中选举新的leader副本,保证高可用。

6.kafka中的选举

7 集群中的controller

每个broker启动时会向zk创建一个临时顺序号节点,获得的序号最小的那个broker将会作为集中的controller
作用:负责管理整个集群中的所有分区和副本的状态,
当集群中有一个leader挂掉了,需要由controller选出leader:若某个分区的leader挂了,可以从该leaer的isr中找到最靠前的
当检测到某个分区的ISR集合发生变化时,由controller负责通知所有broker更新元数据信息
当为topic增加分区数量时,也会由controller通知其他的broker

8.Rebalance机制

消费者没有指明分区,当消费组里消费者和分区的关系发生变化,那么就会出发rebalance机制。这个机制会重新调整消费者消费哪个分区,需要由设置的策略决定
消费者消费哪个分区有三个策略
2.Consumer消费Partition的分配策略所讲

9.HW和leo

HighWaterMark高水位
leo:log end offset 是(某个副本???)最后消息的消息位置
在这里插入图片描述

在这里插入图片描述
图中的线是hw,当写入broker0中4时,此时4就是leo,
高水位 High WaterMark 是标记消息提交和未提交的分界线,在hw之前的数据都可以认为是已提交到kafka上了,否则还认为没有成功提交到kafka上;此处的提交是说认为某条消息全部同步到所有副本上的时候才认为是已提交;

leader 是如何移动自己的leo,leader收到producer产生的消息的时候,leo会先位移标志位

其他副本是如何移动自己的leo,副本异步拉去leader中的数据,然后同步自己的leo,正常情况下,这时候leader和副本之间的leo都是一样的
leader会将hw设置成所有副本的最小leo值。

10.如何防止消息丢失

生产者:1)使用同步发送2)ack设成1或者all,并且设置同步的分区数大于等于2
消费者:自动提交改为手动提交

11.如何防止消息的重复消费

在这里插入图片描述
两种情况:生产者多次发送,消费者多次消费导致重复的原因

在防止消息丢失,如果发送者发完消息,因为网络抖动,么有收到ack,实际上broker已经收到了。此时生产者会进行重试,于是brokder就会收到多条相同的消息,而造成消息的重复消费,解决方案:
消费者端设置幂等性消费问题
幂等性保证:
方案1:在mysql中创建一个联合住建,联合主键(id主键自增)order_id(业务Id)
方案2:使用分布式锁
Redission.lock(消息中的order-id)

12 顺序消费

生产者: ack 设置成非0,且把重试关闭,确保发送方是顺序发送的
消费者:一个消费组中的一个消费者消费

13 消息堆积

原因:生产的消息速度远比消费的消息速度快
如何解决消息积压问题:
1.使用多线程,充分利用机器的性能
2.创建多个消费组,多个消费者,部署到其他机器上

.zookeeper相关知识

broker注册
topic注册

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值