Kafka原理

0.Kafka原理简介

0.1.基本原理

基础原理(写的不错):https://blog.csdn.net/wanghailan1818/article/details/125166287

参考(很详细):https://www.cnblogs.com/dreamroute/p/13092117.html

基础架构图:

image-20230426091545468

0.2 工作流程

数据发送流程图:

image-20230426091706603

1.Kafka简介

  • 0.9.0之前,是一个分布式,分区,副本机制的提交日志服务
  • 0.10.0之后,加入流处理功能,成为一个分布式流处理平台,包含发布订阅,存储,流处理框架等功能
  • 发行版本:Confluent Platform,Cloundera KafkaHortonworks Kafka(后两种为常用版本)

总结与思考⭐

Kafka优势

1)吞吐量高,性能好

2)伸缩性好,支持在线水平扩展

3)具备容错性(同一份数据存储三份,持久化到硬盘,防止数据丢失)和可靠性(一主多备,高可用)

4)TB数据量时不会出现性能问题,无缝对接hadoop/storm/spark

2.消息模型

image-20230424165428206

3.基本概念

image-20230424160233431

image-20230424161302392

image-20230424161834762

image-20230424162112986

总结与思考⭐

1)Topic

  • 可以将Topic看作数据库的表
  • 通常同一类型的数据存储再一个Topic中

2)Partion

  • 不同分区存储不同节点,保证了kafka的拓展性
  • 给分区中的消息,分配offset(偏移量,不可重复且递增)以记录位置

3)record

  • 以键值对形式进行存储
  • 同一个key,存储在同一分区中
  • key为空,则以轮询方式分配a,b,c,d......

4)副本机制

  • 通过设定副本因子replication-actor设置副本数
  • 副本的主节点leader负责读写,follower只负责副本数据同步

5)Broker 消息代理

  • 每个服务器启动一个Broker,一台服务器就是一个Broker

  • Broker负责数据读写,并落到磁盘

  • 每个Broker中,只负责leader的读写,follower的副本同步,不负责follower的读写

4. 环境搭建

4.1 解压安装

image-20230424170150534

4.2 搭建3个节点的伪分布式节点

4.3.1 修改3个配置文件

image-20230424170554084

4.3.2 启动zk

image-20230424170859003

4.3.3 启动server

image-20230424171702573

4.3.4 创建主题

image-20230424171723826

## kafka3.0 创建topic命令有更新,不再需要zookeeper选项
bin/kafka-topics.sh --bootstrap-server hadoop:9092 --create --topic my_topic_name --partitions 20 --replication-factor 3 

4.3.5 生产者/消费者

  • 消费者

image-20230424172430095

  • 生产者

image-20230424172540006

5.监听器和内外部网络

5.1 监听器

5.2 内外部网络

总结与思考⭐

  • listeners用于服务器,advertised.listeners用于客户端
  • 分别设置内外网配置,实现内外网分流。(内网ip设置为空,外网设置为0.0.0.0)

6.使用docker部属kafka

视频:https://www.bilibili.com/video/BV1h94y1Q7Xg?p=7&spm_id_from=pageDriver&vd_source=824d8f61906b474c0974b8dce18a69fd

7.Kafka的消费模型

7.1 Kafka消息模型

image-20230424184052709

7.1.1 发布订阅模式

image-20230424184342395

7.1.2 点对点

image-20230424184456939

7.2 消费顺序

image-20230424185445867

总结与思考⭐

  • 一个分区不能被同一个消费者组的消费者消费
  • 可通过点对点实现负载均衡
  • 分区内有消息顺序,不同分区不存在消息顺序

8.消息语义传递

总结与思考⭐

  • 消费语义有至少一次,至多一次,精确一次
  • 至少一次,可能存在重复消费
  • 至多一次,可能存在数据丢失

9.生产者API

总结与思考⭐

  1. 生产者通过send方法发送消息,发送方式主要有:异步发送,同步发送,批量发送

2)通过设置actks和retries参数实现至多一次(acks=0或者acks=1),至少一次语义(acks=-1或all retries>0)

10.消费者API

总结与思考⭐

1)kafka中_consumer_offsets是专门保存消费者消费位置offset的主题

2)消费者有自动提交,手动提交,逐条提交几种方式,语义实现通过poll方法和参数设置共同实现

3)可以手动指定消费分区和消费位置

11.精确一次

image-20230425161446615

总结与思考⭐

1)精确一次是为了解决数据丢失和数据重复的情况

12.事务消息

image-20230425162344880

总结与思考⭐

1)可读取不同隔离级别设置的数据

13.序列化与Avro

参考视频:https://www.bilibili.com/video/BV1h94y1Q7Xg?p=14&vd_source=824d8f61906b474c0974b8dce18a69fd

13.1 序列化

image-20230425163347851

13.2 Avro

13.3.总结与思考⭐

1)序列化时为了提高传输效率,并且跨平台和语言

2)avro是一种数据序列化系统,可通过插件自动生存序列化的java类

14.Record Header

如果所有事件放在同一主题同一分区中,那么序列化和反序列化的方式就会有问题

![](/home/fubo/图片/schema registry.png)

image-20230425173420770

总结与思考⭐

1)由于存在将所有事件放入同一主题同一分区的场景,但序列化和反序列化,只能将一个事件放入同一主题同一分区,为了解决这种问题,可以使用schema registry(结构注册中心),但schema registry存在强依赖它和破环数据两个问题,所以需要自定义序列化,即在发送消息时加入record header

posted @ 2023-07-03 08:59  付十一。  阅读(7)  评论(0)    收藏  举报