Kafka原理
0.Kafka原理简介
0.1.基本原理
基础原理(写的不错):https://blog.csdn.net/wanghailan1818/article/details/125166287
参考(很详细):https://www.cnblogs.com/dreamroute/p/13092117.html
基础架构图:
0.2 工作流程
数据发送流程图:
1.Kafka简介
- 0.9.0之前,是一个分布式,分区,副本机制的提交日志服务
- 0.10.0之后,加入流处理功能,成为一个分布式流处理平台,包含发布订阅,存储,流处理框架等功能
- 发行版本:Confluent Platform,Cloundera Kafka,Hortonworks Kafka(后两种为常用版本)
总结与思考⭐
Kafka优势
1)吞吐量高,性能好
2)伸缩性好,支持在线水平扩展
3)具备容错性(同一份数据存储三份,持久化到硬盘,防止数据丢失)和可靠性(一主多备,高可用)
4)TB数据量时不会出现性能问题,无缝对接hadoop/storm/spark
2.消息模型
3.基本概念
总结与思考⭐
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 解压安装
4.2 搭建3个节点的伪分布式节点
4.3.1 修改3个配置文件
4.3.2 启动zk
4.3.3 启动server
4.3.4 创建主题
## 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 生产者/消费者
- 消费者
- 生产者
5.监听器和内外部网络
5.1 监听器
5.2 内外部网络
总结与思考⭐
- listeners用于服务器,advertised.listeners用于客户端
- 分别设置内外网配置,实现内外网分流。(内网ip设置为空,外网设置为0.0.0.0)
6.使用docker部属kafka
7.Kafka的消费模型
7.1 Kafka消息模型
7.1.1 发布订阅模式
7.1.2 点对点
7.2 消费顺序
总结与思考⭐
- 一个分区不能被同一个消费者组的消费者消费
- 可通过点对点实现负载均衡
- 分区内有消息顺序,不同分区不存在消息顺序
8.消息语义传递
总结与思考⭐
- 消费语义有至少一次,至多一次,精确一次
- 至少一次,可能存在重复消费
- 至多一次,可能存在数据丢失
9.生产者API
总结与思考⭐
- 生产者通过send方法发送消息,发送方式主要有:异步发送,同步发送,批量发送
2)通过设置actks和retries参数实现至多一次(acks=0或者acks=1),至少一次语义(acks=-1或all retries>0)
10.消费者API
总结与思考⭐
1)kafka中_consumer_offsets是专门保存消费者消费位置offset的主题
2)消费者有自动提交,手动提交,逐条提交几种方式,语义实现通过poll方法和参数设置共同实现
3)可以手动指定消费分区和消费位置
11.精确一次
总结与思考⭐
1)精确一次是为了解决数据丢失和数据重复的情况
12.事务消息
总结与思考⭐
1)可读取不同隔离级别设置的数据
13.序列化与Avro
参考视频:https://www.bilibili.com/video/BV1h94y1Q7Xg?p=14&vd_source=824d8f61906b474c0974b8dce18a69fd
13.1 序列化
13.2 Avro
13.3.总结与思考⭐
1)序列化时为了提高传输效率,并且跨平台和语言
2)avro是一种数据序列化系统,可通过插件自动生存序列化的java类
14.Record Header
如果所有事件放在同一主题同一分区中,那么序列化和反序列化的方式就会有问题

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