Kafka 基础

topic、partition、replica、offset、checkpointing、leader、follower、ISR、零拷贝、epoll、selector、consumer group、coordinator、rebalance、reactor、ack
消息引擎系统(EMS)

是一组规范,实现不同系统间传递语义准确的消息。在实际使用中,消息引擎系统通常以软件接口为主要形式,实现松耦合的异步式数据传递语义。
基于队列的点对点模型,该模型定义了消息队列、发送者和接收者。
基于主题(Topic)的发布/订阅模型,该模型定义了主题、发布者和订阅者。主题是逻辑语义相近的消息的容器。

Kafka

Kafka是一种高吞吐量的分布式发布订阅消息系统,有如下特性:
通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。(文件追加的方式写入数据,定期删除过期数据)

一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用。
Kafka对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。
Kafka是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,最大的特性就是可以实时的处理大量数据以满足各种需求场景。

吞吐量与时延

吞吐量是某种处理能力的最大值。 Kafka的吞吐量是每秒能够处理的消息数或者字节数。
Kafka通过下面4点实现高吞吐量、低延时:

  • 使用页缓存。内存操作速度快且命中率高。
  • 采用追加写入方式。放弃缓慢的随机写操作。
  • 使用sendfile等零拷贝技术。提高数据传输效率。
  • 不直接参与I/O操作。而是由操作系统完成。
零拷贝

Kafka在读取消息时先尝试从页缓存中读取,如果命中便把消息由页缓存直接发送到网络的Socket上。这个过程是利用Linux平台的sendfile系统调用达到的,这就是零拷贝(Zero Copy)技术。
Kafka通过网络与磁盘进行数据传输的操作是通过Java的FileChannel.transferTo方法实现的。在Linux平台上该方法底层会调用sendfile系统调用,即Linux的零拷贝(Zero Copy)技术。
零拷贝技术可以有效改善数据传输性能。在内核驱动程序处理I/O数据的时候,它可以减少甚至完全规避不必要的CPU数据拷贝操作,避免数据在操作系统内核地址空间和用户应用程序地址空间的缓冲区间进行重复拷贝,因而可以获得很好的性能。Linux提供的诸如mmap、sendfile以及splice等系统调用即实现了这样的技术。

负载均衡和故障转移

负载均衡,让系统的负载根据规则,均衡的分配到所有服务器上,从而提升整个系统的运行效率。
Kafka通过ZK的分区领导者选举机制来实现服务器端的负载均衡。消费端的负载均衡是通过consumer group实现。
故障转移,是指当服务器意外终止时,整个集群快速检测到该失效(failure),并立即将该服务器上的应用或服务自动转移到其他服务器上。故障转移通常是以“心跳”或“会话”机制实现的。
Kafka的故障转移方式是会话机制。Kafka服务启动后,在ZK服务器上注册为临时节点(会话形式)。一旦出现问题,临时节点会被删除从而超时失效。

Kafka伸缩性

伸缩性,是指通过增加计算资源提升吞吐量的能力。
阻碍线性扩容的常见因素是状态的保存。状态的保存会引起数据一致性问题。
Kafka使用ZK管理大部分状态信息。少部分信息保存在broker上。

Kafka线上环境部署

操作系统的选型

Linux比Windows更适合部署Kafka。主要是I/O模型和数据网络传输效率。
5种I/O模型:阻塞、非阻塞、多路复用、信号驱动和异步。Linux的select函数属于I/O多路复用模型。Linux epoll模型兼具I/O多路复用和信号驱动I/O。
epoll比select高级,是因为epoll是回调机制(callback)而不是轮询机制。这样当连接的Socket数较多时,可以避免很多无意义的上下文切换。
Kafka新版本clients的底层网络库采用Java的Selector机制,Selector在Linux上的实现机制是epoll。

磁盘规划

Kafka的每条消息都必须被持久化到底层的存储中,并且只有被规定数量的broker成功接收后才能通知clients消息发送成功。

磁盘容量规划
  • 新增消息数
  • 消息留存时间
  • 平均消息大小
  • 副本数
  • 是否启用压缩
内存规划

较少使用堆缓存,大量使用Page Cache。

CPU规划

是否启用了压缩。

在服务器端,通过副本机制提供冗余和高可靠性,通过领导者选举机制实现负载均衡。

参考

《Apache Kafka实战》

你可能感兴趣的:(Kafka 基础)