kafka 消息和存储实战

record, partition, offset, replication

  • 一个非常大的Topic可以被分成多个分区(partition), 从而分配到多个broker中(分区可以存储在不同的服务器上,分区是对Topic中所包含数据集的物理分区)。kafka中的每一条消息(record)都会分配一个自增ID(Offset)。

  • 一个partition中的消息可以顺序发给消费者,不保证多个partion有序

  • 在数据持久化时,每条record都是根据一定的分区规则路由到对应的Partition中,并append在log文件的尾部

  • Partition是用来存储数据的,但并不是最小的数据存储单元。Partition下还可以细分成Segment,每个Partition是由一个或多个Segment组成。每个Segment分别对应两个文件:一个是以.index结尾的索引文件,另一个是以.log结尾的数据文件,且两个文件的文件名完全相同。所有的Segment均存在于所属Partition的目录下。

  • Replication逻辑上是作用于Topic的,但实际上是体现在每一个Partition上。例如:有一个Topic,分区(partitions)数为3(分别为a, b, c),副本因子(replication-factor)数也为3;其本质就是该Topic一共有3个a分区,3个b分区,3个c分区。

  • Leader Replica: 每一个Partition有且只有一个Replica可以作为Leader, 其负责处理所有Producer、Consumer的请求;与此同时,Leader还负责监管和维护ISR(In-Sync Replicas:副本同步队列)中所有follower的滞后状态。

  • Follower Replica: 除了Leader以外的所有Replica均为follower,其不处理任何来自客户端的请求;只通过Fetch Request拉取leader replica的数据进行同步

topic 创建和查看

在这里插入图片描述
partition数目是2,replication因子是2

  • 对于partition 0, leader 是 3,follower 是 1
  • 对于partition 1, leader还是 1, follower 是 2

消息发送

在这里插入图片描述
一次发送了4条消息,内容分别是

空
a1
b1
c1

消息在partition中的存储情况

  • partion 0在这里插入图片描述

  • partition 1
    在这里插入图片描述

消息的存储

  • kafka 是通过分段的方式将 Log 分为多个 LogSegment,LogSegment 是一个逻辑上的概念,一个 LogSegment 对应磁盘上的一个日志文件和一个索引文件,其中日志文件是用来记录消息的。索引文件是用来保存消息的索引。

回顾 partition 0 的 leader 是 3, follower 有一个 是 1; partition 1 的 leader 是 1, follower 有一个 是 2

broker id = 1

在这里插入图片描述

broker id = 2

在这里插入图片描述

broker id = 3

在这里插入图片描述

消费组,消费offset

摘自:https://www.cnblogs.com/rainwang/p/7496147.html

  • consumer group下可以有一个或多个consumer instance,consumer instance可以是一个进程,也可以是一个线程

  • group.id是一个字符串,唯一标识一个consumer group

  • consumer group下订阅的topic下的每个分区只能分配给某个group下的一个consumer(当然该分区还可以被分配给其他group)

  • 消费者在消费的过程中需要记录自己消费了多少数据,即消费位置信息(Offset)。Kafka的每个consumer group保存自己的位移信息,只需要简单的一个整数表示位置就够了;同时可以引入checkpoint机制定期持久化,简化了应答机制的实现。

Kafka默认是定期自动提交位移的(enable.auto.commit = true),当然可以选择手动提交位移实现自己控制。另外kafka会定期把group消费情况保存起来,做成一个offset map, 如下图

在这里插入图片描述

__consumer_offsets

由于Zookeeper并不适合大批量的频繁写入操作,新版Kafka已推荐将consumer的位移信息保存在Kafka内部的topic中,即__consumer_offsets topic

获取 consumer group的group id

在这里插入图片描述
在这里插入图片描述

Math.abs("console-consumer-49951".hashCode()) % 50 = 49

即__consumer_offsets的partition 49, 保存了这个consumer group的位移信息
在这里插入图片描述

日志格式:[Group, Topic, Partition]::[OffsetMetadata[Offset, Metadata], CommitTime, ExpirationTime]

参考:https://www.cnblogs.com/huxi2b/p/6061110.html

附 本次使用到到命令

bin/kafka-topics.sh --create --zookeeper 172.16.227.250:2181,172.16.227.129:2181,172.16.227.130:2181 --replication-factor 2 --partitions 2 --topic kafkatest


bin/kafka-topics.sh --describe --zookeeper 172.16.227.250:2181,172.16.227.129:2181,172.16.227.130:2181 --topic kafkatest


bin/kafka-console-producer.sh --broker-list 172.16.227.250:9092,172.16.227.129:9092,172.16.227.130:9092 --topic kafkatest



bin/kafka-console-consumer.sh --bootstrap-server 172.16.227.250:9092,172.16.227.129:9092,172.16.227.130:9092 --topic kafkatest --from-beginning --new-consumer


bin/kafka-consumer-groups.sh --bootstrap-server 172.16.227.250:9092,172.16.227.129:9092,172.16.227.130:9092 --list --new-consumer


bin/kafka-simple-consumer-shell.sh --topic __consumer_offsets --partition 49 --broker-list 172.16.227.250:9092,172.16.227.129:9092,172.16.227.130:9092 --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter"


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值