Kafka常见问题
Kafka的设计目标是高吞吐量
顺序写 不保存消息的状态 支持点对点的批量消息传递 使用内存映射和零拷贝
顺序写入:
一般硬盘:寻址 — 写入,太耗时了,kafka:顺序写入---partition(文件),插入末尾
导致文件不可删除,删除策略,定时,partition已满时
Kafka数据不是实时写入硬盘,采用内存映射文件(分页存储)来利用内存提高I/O效率,利用操作系统的页来实现物理内存映射,映射完后物理内存上的操作会被同步到硬盘上,(顺序写磁盘效率比随机写内存要高)
如果Kafka写入到mmap之后就立即flush然后再返回Producer叫同步(sync);写入mmap之后立即返回Producer不调用flush叫异步(async)。
Kafka使用了zero copy:零拷贝
一般硬盘的读写:先复制到内核空间---复制到用户空间---再从用户空间复制到内核空间---发送给网卡
而zero copy:直接从内核空间到内核空间---发送给网卡
将消息变成文件,读取数据的时候配合sendfile直接暴力输出,push pull,默认是 pull。
用户会自己保持这个offset,每次请求都会发送这个offset。Zookeeper中存有offerset。
Kafka的高可用:
基于zookeeper实现Leader election
Data replication策略(ISR:副本同步列表,是由leader维护,因为follower从leader复制数据有延迟,超过阈值被提出ISR列表,只有ISR中的才会被选举为leader)
说明Kafka相对传统技术有什么优势?
高吞吐率 可伸缩 数据持久化 可靠性 容错性高
Broker:服务器,构建kafka集群
Zookeeper作用:
保持集群中节点的通信;保存提交的偏移量,保证出错可恢复;leader选举、分布式同步、监控集群
解释Kafka的用户如何消费信息?
Consumer每次消费partition消息时,Consumer会自己记录offset物理偏移量。
在Kafka中传递消息是通过使用sendfile API完成的。它支持将字节从套接口转移到磁盘,通过内核空间保存副本,并在内核用户之间调用内核。