浅谈Kafka

一、基本概念

1、Kafka里面消息的保存策略

不同于其它消息队列,消息不是消费完就被销毁,而是通过指定的保存期限,在期限到来之前,消息是一直存在的;在期限到达,消息才会被销毁。

2、leader的选择

在Kafka中,不是以服务器broker为单位划分leader、follower,而是以副本(replication)为单位划分leaderfollower。这样集群中每个服务器broker都可以持有一部分leader和一部分follower,从而达到将写入的压力分摊到不同的broker中,即利用分布式分摊写压力,提升性能。

3、关于消费者

1)消费者自己维护自己的消费情况,即维护的是消息在日志中的位置(offset),该值随着该消费者的读取不断累加。

2)两种消费模式

发布订阅模式,一个消息可以被多个消费者读取到,消费者之间互不影响,达到一种共享数据的效果;

队列模式:一条消息只能被一个消费者读取,达到多个消费者之间竞争消息的效果。

3)消费者组:多个消费者可以组成一个组,在消费者组里消息是竞争的,即队列模式;在消费者组之间消息是共享的,即发布订阅模式。

3、存储策略

从物理结构上看,Kafka中的分区(partition是一个存储目录下(可配置)的一个文件夹,文件夹的名称是主题名-分区编号(从0开始);

在分区中,存在segment的概念,一个segment是一个.log文件和一个.index文件组成,其中.log文件存放数据.index文件存放对应.log的索引信息,每个segment的文件名为上一个segment文件中最后一条消息的offset值。

扩展:读取分区中的消息时,先根据offset和当前分区的segment的名称作比较,确定出在哪个segment中;查找该segment的.index文件,确定消息在.log中的开始位置,从此位置开始读取文件。

二、可靠性保障

0、分布式下两种消息写入成功的条件

1)leader独裁:只要leader中写入消息成功,就说明消息写入成功。

    弊端:当leader宕机后,若follower没有同步,导致消息的丢失。

2)follower民主制:只有所有的follower都成功写入,才说明消息写入成功。

    弊端:当有一个follower宕机后,导致leader收不全所有follower的确认,导致消息无法写入成功。

1、AR、ISR、OSR

AR:包含所有分区的副本编号,即AR=ISR+OSR

ISR:同步列表,在其中的副本都同步了leader的消息,才算消息写入成功;

OSR:非同步列表,消息的数量大于等于ISR中副本中的消息数量。

默认副本全在ISR中,在写入消息时,当ISR中的某个副本同步消息的时间大于指定的阈值,则被移入OSR列表中。

2、LEO、HW

LEO(LogEndOffset):leader中最新消息的offset,即使还未被ISR中的follower同步;

HW(HighWatermark):消费者可以消费的最新消息的offset,该值小于等于LEO指向的offset。

3、分区同步消息的流程(仔细看图,总结自己的说法)

4、分区同步消息时的截断机制

在leader宕机后,选出的新leader,所有副本都会将消息截断到leader宕机之前的HW位置,从而保证了副本有着共同的消息,若是有消息已经被部分副本同步,此时会将多余的消息丢弃,这就是截断机制

5、可靠性保证

1)消费消息时的可靠性:借助于LEO-HW机制保证消费者只能读取到HW之前的消息,从而当leader宕机后,可以从follower中读取到,保证了消费消息的可靠性;

弊端:ISR中只剩写一个leader时,leader宕机后的消息的消费。

2)生产消息的可靠性保证(关于可靠性保证可参考本人博客:理解分布式数据处理的三个级别):

三种:

消息最多生产一次,可能会导致存储时消息丢失;

消息最少生产一次,不会丢失消息,但可能会导致存储时消息冗余;

消息存储时恰好一次

而在Kafka中,request.required.acks可以设定可靠性级别,分别是0(默认),1,-1

6、leader选举机制

在Kafka中,选举机制不同于ZooKeeper的过半选举,是通过ISR中的follower进行选举,但是当ISR中只有存在leader时,leader宕机,此时存在两种选举策略:

1)不允许OSR中的follower成为新的leader,这时只能等待原来的leader恢复,造成Kafka很长时间无法工作(unclean.leader.election.enable=false);

评价:保证了数据的一致性,但是可用性低

2)允许OSR中的follower成为新的leader,但可能造成消息的丢失(unclean.leader.election.enable=true)。

评价:可用性高,一致性没有保证

建议:根据业务需求进行取舍

 

ZooKeeper选举机制的比较:

ZooKeeper具有较高的可靠性,较低的可用性

Kafka具有较低的可靠性,较高的可用性

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值