欢迎来到窥视未来的博客

Fork me on GitHub

分布式消息Kafka通信原理分析

主要内容

  1. 消息的存储原理

  2. Parition的副本机制原理

  3. 副本数据的同步原理

日志分段

LogSegment ->

日志文件默认大小 1G,当前log日志文件到达阈值1G的时候才会生成下一个分段

 

sh kafka-run-class.sh kafka.tools.DumpLogSegments --files /temp/kafka-logs/test-lisa-0/00000000000000000000.log --print-data-log

sh kafka-run-class.sh kafka.tools.DumpLogSegments --files /temp/kafka-logs/test-lisa-0/00000000000000000000.index --print-data-log

sh kafka-run-class.sh kafka.tools.DumpLogSegments --files /temp/kafka-logs/test-lisa-0/00000000000000000000.timeindex --print-data-log

 

log文件中的内容

offset: 5335 position: 104326 CreateTime: 1614926082929 isvalid: true keysize: -1 valuesize: 12 magic: 2 compresscodec: NONE producerId: -1 producerEpoch: -1 sequence: -1 isTransactional: false headerKeys: [] payload: message_5335

offset 是逻辑位置,postion是物理位置

 

 

日志清理策略

日志清理和日志压缩

日志默认保留是7天,可以修改配置

根据时间来保存

根据大小

  1. log.cleanup.policy=delete启用删除策略

  2. 直接删除,删除后的消息不可恢复。可配置以下两个策略:

  3. 清理超过指定时间清理:

  4. log.retention.hours=168

  5. 超过指定大小后,删除旧的消息:

  6. log.retention.bytes=1073741824

 

partition副本机制概念

partition的副本被称为replica,每个分区可以有多个副本,并且在副本集中会存在一个leader副本,所有的读写请求都会通过leader完成,follower复制只负责备份数据。

副本会均匀分配到多台broker上,当leader节点挂掉之后,会从副本集中重新选出一个副本作为leader继续提供服务

副本分配算法

 n个broker 将第i个partition的第j个副本分配到第((i+j)mod n)个broker上

 

 

 get /brokers/topics/test-lisa/partitions/0/state

 

{"controller_epoch":13,"leader":0,"version":1,"leader_epoch":1,"isr":[0]}

isr 维护当前分区的所有副本集。(in sync repilcas),follower副本必须要和leader副本的数据在阈值范围内保持一致

leader 副本负责接收客户端的消息写入和消息读取请求

follower 副本负责从leader副本读取数据 (不接受客户端的任何请求),如果follow副本和leader副本数据同步速度过慢,该follow将会被T出ISR副本

 

ISR集合中的副本必须满足的条件:

  1. 副本所在的节点与zk相连

  2. 副本的最后一条消息和leader副本的最后一条消息的差值不能超过阈值replica.lag.time.max.ms:如果该follower在此时间间隔之内没有追上leader,则该follower将会被T出ISR

副本同步时的两个重要概念

LEO(Last end offset) 记录了该副本底层日志中的下一条消息的offset,例如LEO为10,那么当前的offset为9

HW (High water)标记着可消费的消息,对于同一个副本而言HW不会大于LEO,小于等于HW的消息将会被认为是已备份的。

 

 

1、把消息写入到对应分区的log文件中,同时更新leader副本LEO

2、尝试去更新leader的HW值,比较自己本身的LEO和remote LEO的值。取最小的值作为HW

如果ISR为空怎么办?leader副本也挂了

1、等待ISR中的任意一个replica活过来,重新选举leader

2、选择一个活过来的replica 作为leader

 

1、分区应该设置多少合适

没有标准,根据实际吞吐量来进行设置

 

Kafka监控工具:kafka monitor 、kafka offset monitor /kafka-manager

kafka高性能

  • 采用操作系统层面页缓存来缓存数据

  • 日志采用顺序写入以及零拷贝的方式提示IO性能

  • partition的水平分区的概念,能够把一个topic拆分多个分区

  • 发送到和消费贷都可以采用并行的方式来消费分区中的消息

 

设置50000个分区。->批量发送batch.size,linger.ms(针对同partition 而言) ->内存占用过高

 

50000个消费者->多线程(怎么分配consumer的消费能力)

文件句柄。logsement->index/log文件

副本-> 1个副本 50000个分区落到10个broker上,每个broker 5000个分区,存在5000个分区需要选leader

 

1、硬件资源

2、消息大小

3、目标吞吐量

 

《峰值消息大小》一个topic一个分区的情况下,针对目录硬件资源压测->tps发送端的tps和消费端tps

 

posted on 2021-03-07 21:30  窥视未来  阅读(188)  评论(0编辑  收藏  举报

导航