kafka 是一个高吞吐量,分布式,分布订阅系统
kafka 的作用: 系统解耦,异步通信,削峰填谷
kafka 集群以topic 作为分类
每个topic 下面会有一组分区,
每个分区下面会有多个broker,1个broker 是leader,多个follower,leader 负责数据的读写,follwer负责同步分区中的数据,
分区数是3,每个topic下面有三个分区
分区副本因子是3 每个分区有三个副本,在不同的机器上,会有一个是leader,其他是follower
leader宕机,其他的follower会选举出新的leader,负责该分区数据的读写,leader和topic的部分的数据在zookeeper中。
消息队列的两种模式:
1.至多一次:消费生产者将数据写入消息队列,然后由消费者负责拉取消息服务器中的消息,一旦消息被确认消费之后,由消息服务器主动删除队列中的消息,这种消费方式一般只允许被一个消费者消费,并且消息队列中的数据不允许被重复消费。
2.没有限制: 生产者发完数据以后,该消息可以被多个消费者消费,并且同一个消费者可以多次消费服务器中的同一个记录,消息服务器一般可以长时间存储海量信息。
kafka 中的关键的概念:
分区数:3
分区副本因子:3
主题:topic01
消费组:
LEO:
水位线
kafka 会把topic中Record消息持久化到磁盘,持久化的时间通过配置文件制定
log.retention.hours=168
kafka底层会定期检查日志文件,然后将过期的数据从log中移除。
kafka 日志分区的原因
1.方便扩容。 如果数据太大,直接增加分区就可以了。
2.方便负载均衡。 在不同的机器上,存储的消息数据比较均匀
分区的策略:
1.轮训
2.hash
3.自定义分区
消费组
1.在同一个消费者组中的消费者实例,均匀消费这个组中的所有的数据
2.在不同组中的消费者,每条记录会广播的消费组中。
在同一个消费组中的消费者实例
1.如果新成员的介入,新成员会接管消费组中的其他成员的分区
2.如果有其他消费者实例挂掉,则有消费者组中的其他成员接管宕机的消费者的实例
kafka 同一个topic下,相同分区是有序的,不同分区是无序的。
如果要保证全局有序,可以通过只有一个分区topic 实现
kafka的消息是保存在磁盘上的
硬盘是机械结构,每次写入都会寻址--->写入。寻址是一个机械操作,它是最耗时的,硬盘最讨厌随机io,最喜欢数据io。为了提高读写硬盘的速度,kafka使用顺序io,这样节省了大量的内存开销,以及io寻址时间
现代分页存储利用内存,提高IO效率。利用操作系统的page 实现文件到物理内存内存的映射,完成
MMP的映射后,用户对内存的操作,会自动刷新到磁盘,极大的降低了io使用率。
kafka 高吞吐率的原因
1.利用多分区
2.顺序写入
3.MMFile(Memory mapped filed)
4. Zero copy
DMA是一种协处理器,是CPU 的一个代理,它负责一部分copy工作,从而减轻了cpu的负担。DMA的有点:中断少,cpu负担低。
普通copy和zerocopy的区别:
一般copy
1.文件在磁盘中的数据被copy内核缓存区
2.文件从内核缓存区copy到用户缓存区
3.文件从用户缓存区copy到内核与socket 相关的缓存区中
4.数据从socket 缓存区copy到相关协议引擎发送出去
zerocopy
1.文件直接从磁盘copy到内核缓存区
2.文件从内核缓存区copy到内核与socket相关的缓存区
3.文件从内核与socket相关的缓存区copy到相关协议引擎发送出去
kafak 高水位数据的丢失
0.11版本++ 以后 幂等性和事务性是kafka的核心性能
参数:
1.https://www.cnblogs.com/cjsblog/p/9664536.html
2.https://blog.csdn.net/u014236541/article/details/78439045
3.https://blog.csdn.net/weixin_30235225/article/details/102054125-----DMA
4.https://www.zhihu.com/question/56172498?sort=created
5.https://blog.csdn.net/lizhitao/article/details/39499283