《kafka权威指南》总结篇

       kafka 是 linkedin 公司开发的,为解决用户行为日志而产生;

kafka的最初目的并非消息队列组件,而流式处理平台;

只是其中有的功能看起来像一个消息队列组件;

      1. 发布订阅功能;

      2. 存储流式日志数据;

      3. 实时处理流式数据;

 

kafka安装很简单,主要是要调整下一些配置参数。broker.id, port, zookeeper.connect, log.dirs, num.recovery.thread.per.data.dir, auto.create.topics.enable, num.partions, log.retention.ms, ...

 

Kafka部署环境:

1. 磁盘性能直接影响kafka吞吐量。

3. 内存同样影响其吞吐能力,jvm不需要太多内存,但是多余的系统内存可以被用作页面缓存(性能关键)。

4. 网络同样影响其吞吐量,在其他性能都很好时,如果带宽受限则吞吐量受限,且kafka还会存在数据集群复制和镜像也会占用网络流量。

5. kafka对cpu要求相对不高,但在压缩方面会影响cpu负载。

 

kafka容量估算,受限于复制系统和单个分区存储能力;适当对操作系统调优;

 

 

kafka处理模型为(推送和拉取):生产者发送数据到kafka,发送将会按照分区规则进行指定分区,kafka会暂时将数据存储在内存,然后在适当时机冲刷到磁盘,随后消费者进行主动拉取式消费,自行维护数据偏移,从而完成消息从生产者转移到消费者的传递。

 

kafka由很多broker组成,单个broker可以轻松处理数千个分区以及每秒百万级的消息量。

kafka一般都是集群部署的,每个集群都有一个broker充当了集群控制器的角色(集群选举产生)。控制器负责管理工作,包括将分区分配给broker和监控broker。一个分区从属于broker,即每个分区的首领。如果一个broker失效,其他broker可以接管领导权。

kafka具有保留消息的能力,这是它和很多消息中间件差异较大地方。可以设置保留天数,可以设置到达一定数量后。

消费者群组可以作为一个统一的消费者,共享一个消息流,整个群组对同一个消息只处理一次。而普通非群组机器,则是任意消费数据。

 

 

 

远程读取比远程生成更加安全。因为如果消费者连接到生产集群,最多也就是无法读取数据,但数据仍然会保存在kafka里很长时间。而相反居发生网络分区时,已经读取了数据却无法发送生成数据到目标机器,那么就会造成数据丢失。(MirrorMaker)

 

生产者主要负责数据发送,关键点:

1. 需要指定几个broker地址信息,当一个不可用时,可以切到下一个。

2. 指定序列化方式,key和value序列化方式,avro;

3. 有异步发送和同步等待,差别在于是否阻塞get();

4. 异步发送可以设置回调方法;

5. acks用于设置与kafka的确认方式,取决性能和可靠性的平衡。值有0, 1, all. 

6. retries 配置重试次数;

7. buffer.memory

8. compression.type snapy, gzip, lz4

9. batch.size 一个批次可使用大小;

10. 可以自定义分区器,用于指定发送的分区,实现 Partioner 接口即可。

 

kafka消费者,一般为群组消费,要点:

1. 群组会自动实现负载均衡;

2. 分区再均衡时,消费者将暂停消息,并收到通知,可以自行处理数据;

3. 消费者上线或下线时会触发再均衡;

4. consumer.subscribe("test.*") 消息数据;

5. 通过 consumer.poll(100)拉取数据;

6. 可以自动提交偏移,也可以主动提交偏移;

7. fetch.min.bytes 获取最小字节数;

8. fetch.max.wait.ms 最长等待时间;

9. session.timeout.ms 会话超时;

10. auto.offset.reset 无偏移时的消费偏移策略,earliest, latest .

11. enable.auto.commit 自动提交;

12. partition.assignment.strategy 分区分配策略;

13. max.poll.records 单次最大数;

14. __consumer_offset 特殊主题保存偏移量;

15. ... 

16. 再均衡监听器,可以进行清理工作;实现 ConsumerRebalanceListener. 可以监听 丢失分区前事件(清理现场),也可以监听新分区被分配时事件(初始化数据);

17. 

 

深入kafka

1. kafka如何复制;

2. kafka如何处理来自生产者和消费者的请求;

3. kafka存储细节;

 

控制器由/controller 节点控制;使用epoch来避免脑裂;

复制特性是kafka的重要特性和架构核心。

副本类型有 首领副本和跟随者副本。首选首领是第一个副本;

处理请求流程:broker会在各监听端口运行一个acceptor,创建连接后交给processor处理,processor数量可配置,它从客户端获取连接请求,把它放到请求队列,然后从响应队列里获取消息,发送给客户端;具体业务处理由io线程处理(从请求队列获取数据,完后放入响应队列)

消费者可以设定,让broker等到有足够多数据后再返回(实现原理应该是sleep()或者wait/notify模式),也可以设置最大超时时间;

可以自定义实现与broker通信协议,但broker之间也有同样的通信协议,客户端不应该使用这些请求。比如新首领选举出来,控制器会发送LeaderAndIsr请求给新首领和跟随者。

kafka基本存储单元是分区,无法再细分;

kafka分区分配策略会保证,分区均衡地分布在broker集群里,包括机架信息。

文件会按修改日期和设置的过期策略进行删除,活跃片段不会删除。

kafka的索引是为了让broker快速定位到偏移处,索引把偏移量映射到片段和偏移量所在文件的位置;索引也被分为片段,所以在删除消息时,也可以删除相应索引;(索引是非必须的,如果不存在将被kafka重建)

清理使用map保存散列值和偏移量,将污浊部分清理掉。

事件删除场景,比如将用户从系统删除,应用程序发送null消息,墓碑消息,该消息会被清理线程从kafka里删除。

 

kafka可靠的数据传递

kafka可靠性保证:

1. 保证分区有序;

2. 只有当消息写入所有副本时,才认为消息已提交,消费者才可用;

3. 只要有一个副本是活跃的,那么消息就不会丢失;

4. 消费者只能读取到已提交的消息;

 

复制系统默认为3,可以自定义,但尽量为奇数;

不完全首领选举,可以开启但是有风险;

应用程序验证,依次重启broker,依次重启消费者,依次重启生产者,客户端从服务器断开,首领选举。

 

构建数据管道connect

数据库A到数据库C的迁移;mysql到es;

 

跨集群数据镜像 mirrormaker

使用场景

1. 区域集群和中心集群;

2. 冗余dr;

3. 云迁移;

 

 

 

 

 

流处理:

kafka是个稳定的数据来源;

流处理的设计模式:

时间窗口,流join,

 

 

 

流处理的设计模式:单个事件处理,本地状态;map或filter模式;

单机10w/30s,tps: 3300+;

实际上只成功7w/30s,即tps: 2000+, 即被内存锁住(512M);

posted @   阿牛20  阅读(967)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示