kafka(一)介绍

kafka介绍

官网:(http://kafka.apache.org/intro.html)
Kafka是用于构建实时数据管道和分部式流媒体应用程序的。它的特点:水平可扩展的,可容错,速度快.
什么是分布式流媒体平台?
    一个流媒体平台有三个关键功能:

  1. 发布和订阅记录流,类似于消息队列或企业消息传递系统。
  2. 以一种容错的持久方式存储记录流。
  3. 在发生的过程中处理记录流。

kafka通常被用于两大类应用:

  1. 构建实时的流数据管道,可靠地在系统或应用程序之间获取数据
  2. 构建能够转换或响应数据流的实时流媒体应用程序

kafka它有如下几个概念:

  1. kafka可以运行在一个或多个服务器上,可以跨越多个数据中心。
  2. kafka的集群存储了被称为topics的类别的记录流。
  3. 每条记录由一个 key键、一个value和一个timestamp组成。

kafka有四个核心的API:

  1. 应用程序使用producer API发布消息到1个或多个topic中。
  2. 应用程序使用consumer API来订阅一个或多个topic,并处理产生的消息。
  3. 应用程序使用streams API充当一个流处理器,从1个或多个topic消费输入流,并产生一个输出流到1个或多个topic,有效地将输入流转换到输出流。
  4. connector API允许构建或运行可重复使用的生产者或消费者,将topic链接到现有的应用程序或数据系统。 

在kafka中,客户端和服务器之间的通信是通过一个简单的、高性能的、语言无关的TCP协议来完成的。这个协议是版本化的,并且与旧版本保持向后兼容。我们为kafka提供了一个Java客户端,但是客户端可以使用多种语言。

Topics和Logs:
Topics是消息发布的类别或提要名称,是对一级消息 的归纳,对每个topic,kafka对它的日志进行了分区,一个Topic可以有零个,一个,或者多个订阅了写入它的数据的消费者。
对于第一个topic,kafka对对它进行了分区,就是一个topic有多个分区,如下图所示:

kafka(一)介绍
       每个分区都是一个有序的、不可变的消息序列,这些消息被连续的追加到分区中。分区中的记录都被分配了一个顺序id号,称为偏移量,唯一标识分区内的每个记录.在一个可配置的时间内,kafka集群保留所有的发布的消息,不管这些消息有没有被消费,比如消息的保存策略被设置为2天,那么在一个消息被发布的2天时间内,它都是可以被消费的,之后它就被丢弃以释放空间,kafka的性能是和数据量无关的,所以保留太多的数据不成问题.
             kafka(一)介绍
        实际上,每个consumer维护的是消息在区分当中的位置,也就是offset,一般情况下,消费者会在读取消息时线性地增加偏移量,也就是offset,但由于这个位置是由消费者控制的,所以可以按照可以通过设置offset来任意的读取消息。例如,消费者可以重置为旧的偏移量,以重新处理过去的数据,或者跳过最近的记录,并开始从现在的位置开始读取。所以kafka是非常轻量级的,它们可以在不对集群和其他consumer造成影响的情况下读取消息,例如,可以通过工具使用命令行"tail"来跟踪任何topic,而还会对正在读取消息的consumer造成影响.
将日志分区的目的:允许日志的规格超出单个服务器的大小,每个分区有适合它的服务器,但是一个topic可能有多个分区,所以它可以处理任意数量的数据,并且他们是并行的,也就是每个分区可以单独发布和消费.


分布式:
       日志的分区分布在kafka集群中的服务器上,每个服务器都可以处理数据和请求共享分区。每个分区都在可配置数量的服务器上进行复制,以实现容错。
所有的分区中都会有一个服务器作为Leader,1个或多个服务器作为followers,leader用于处理数据的读写功能,followers则被动的复制这些数据,如果leader down了,followers中的其中一台会自动成为leader,每个服务器都会同时扮演Leader和follower的角色,来实现负载均衡.
Producers:
producer将消息发布到它指定的秋topic中,并负责决定分布到哪个分区,通常简单的由负载均衡机制随机选择分区,也可以通过分区函数来完成,不过大多还是使用方式二.
Consumers:
发布消息有两种方式:

队列模式(queuing)

发布-订阅模式

队列模式:consumer可以同时从服务端获取信息,每个消息只能被一个consumers读取,在各个consumer中实现负载均衡
发布-订阅模式:所有的consumer都不是在同一个组中,就是发布-订阅模式,这时候的消息是被广播到所有的consumer中
kafka(一)介绍
    相比传统的消息系统,kafka有很好的时序性
    通过分区的特性,kafka可以在多个consumers级并发的情况下提供较好的有序性,和负载均衡,将每个区分只分发给一个consumer组,这样一个分区只能被一个consumer消费,就可以顺序的消费这个分区的消息,这里需要注意的是consumer组的数量不能多于分区的数量,也就是说有 多少分区就允许有多少并发消费.kafka可以保证一个分区内消息的有序性,在不同的分区之间是不可以的,如果topic中所有的消息都要有序,那就只能让这个topic有一个分区,也就是只有一个consumer组消费这个信息.

 

kafka实现高吞吐率的原理:

顺序读写:

        kafka的消息是不断追加到文件中的,这个特性使kafka可以充分利用磁盘的顺序读写性能

        顺序读写不需要硬盘磁头的寻道时间,只需很少的扇区旋转时间,所以速度远快于随机读写

        Kafka官方给出了测试数据:  顺序 I/O: 600MB/s  ,  随机 I/O: 100KB/s

零拷贝:

        "零拷贝(zero-copy)"系统调用机制,就是跳过“用户缓冲区”的拷贝,建立一个磁盘空间和内存的直接映射,数据不再复制到“用户态缓冲区”

文件分段:

       kafka的队列topic被分为了多个区partition,每个partition又分为多个段segment,所以一个队列中的消息实际上是保存在N多个片段文件中

批量发送:

        Kafka允许进行批量发送消息,先将消息缓存在内存中,然后一次请求批量发送出去,这种策略将大大减少服务端的I/O次数.

数据压缩:

       Kafka还支持对消息集合进行压缩,Producer可以通过GZIP或Snappy格式对消息集合进行压缩,压缩的好处就是减少传输的数据量,减轻对网络传输的压力,Producer压缩之后,在Consumer需进行解压,虽然增加了CPU的工作,但在对大数据处理上,瓶颈在网络上而不是CPU,所以这个成本很值得