kafka入门

来源:互联网 发布:淘宝750海报图片 编辑:程序博客网 时间:2024/05/17 09:26

使用kafka有一段时间了,最近有点空闲。把kafka总结下。


一.简介

官网

  Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消费。


  Kafka 是 linkedin 用于日志处理的分布式消息队列,同时支持离线和在线日志处理。kafka 对消息保存时根据 Topic 进行归类,发送消息者成为 Producer,消息接受者成为 Consumer,此外 kafka 集群有多个 kafka 实例组成,每个实例(server)称为 broker。无论是 kafka集群,还是 producer 和 consumer 都依赖于 zookeeper 来保证系统可用性,为集群保存一些 meta 信息。


二. 基本概念

  1. Topic(话题):Kafka中用于区分不同类别信息的类别名称。由producer指定

  2. Producer(生产者):将消息发布到Kafka特定的Topic的对象(过程)

  3. Consumers(消费者):订阅并处理特定的Topic中的消息的对象(过程)

  4. Broker(Kafka服务集群):已发布的消息保存在一组服务器中,称之为Kafka集群。集群中的每一个服务器都是一个代理(Broker). 消费者可以订阅一个或多个话题,并从Broker拉数据,从而消费这些已发布的消息。

  5. Partition(分区):Topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)

  6. Message:消息,是通信的基本单位,每个producer可以向一个topic(主题)发布一些消息。

    1. Topic

  一个 Topic 可以认为是一类消息,每个 topic 将被分成多个partition(区),每个 partition 在存储层面是 append log 文件。任何发布到此 partition 的消息都会被直接追加到 log 文件的尾部,每条消息在文件中的位置称为 offset(偏移量),offset 为一个 long型数字,它是唯一标记一条消息。kafka 并没有提供其他额外的索引机制来存储 offset,因为在 kafka 中几乎不允许对消息进行“随机读写”。

  在 kafka 中,即使消息被消费,消息仍然不会被立即删除。日志文件将会根据 broker 中的配置要求,保留一定的时间之后删除;比如log 文件保留 2 天,那么两天后,文件会被清除,无论其中的消息是否被消费。kafka 通过这种简单的手段,来释放磁盘空间,以及减少消息消费之后对文件内容改动的磁盘 IO 开支。

  对于consumer而言,它需要保存消费消息的offset,对于offset的保存和使用,由 consumer 来控制;当 consumer 正常消费消息时,offset 将会”线性”的向前驱动,即消息将依次顺序被消费。事实上 consumer 可以使用任意顺序消费消息,它只需要将 offset 重置为任意值。(offset 将会保存在 zookeeper 中,参见下文)

  kafka集群几乎不需要维护任何consumer和producer状态信息,这些信息由 zookeeper 保存;因此 producer 和 consumer 的客户端实现非常轻量级,它们可以随意离开,而不会对集群造成额外的影响。

  partitions 的设计目的有多个。最根本原因是 kafka 基于文件存储。通过分区,可以将日志内容分散到多个 server 上,来避免文件尺寸达到单机磁盘的上限,每个 partiton 都会被当前 server(kafka实例)保存;可以将一个 topic 切分多任意多个 partitions 来保存消息。此外越多的 partitions 意味着可以容纳更多的 consumer,有效提升并发消费的能力。(具体原理参见下文)。


2. Distribution

  一个 Topic 的多个 partitions,被分布在 kafka 集群中的多个server 上;每个 server(kafka 实例)负责 partitions 中消息的读写操作;此外kafka还可以配置partitions需要备份的个数(replicas),每个 partition 将会被备份到多台机器上,以提高可用性。

  基于 replicated 方案,那么就意味着需要对多个备份进行调度;每个 partition 都有一个 server 为”leader”;leader 负责所有的读写操作,如果 leader 失效,那么将会有其他 follower 来接管(成为新的 leader);follower 只是单调的和 leader 跟进,同步消息即可。由此可见作为 leader 的 server 承载了全部的请求压力,因此从集群的整体考虑,有多少个 partitions 就意味着有多少个”leader”,kafka会将”leader”均衡的分散在每个实例上,来确保整体的性能稳定。

  • 发送到 partitions 中的消息将会按照它接收的顺序追加到日志 中。

  • 对于消费者而言,它们消费消息的顺序和日志中消息顺序一致。

  • 如果 Topic 的”replication factor”为 N,那么允许 N-1 个 kafka 实例失效

3.consumer

  本质上 kafka 只支持 Topic。每个 consumer 属于一个 consumer group;反过来说,每个 group 中可以有多个 consumer。发送到 Topic的消息,只会被订阅此 Topic 的每个 group 中的一个 consumer 消费。

  如果所有的 consumer 都具有相同的 group,这种情况和 queue 模式很像;消息将会在 consumers 之间负载均衡。

  如果所有的 consumer 都具有不同的 group,那这就是”发布-订阅”,消息将会广播给所有的消费者。

  在 kafka 中,一个 partition 中的消息只会被 group 中的一个consumer 消费;每个 group 中 consumer 消息消费互相独立;我们可以认为一个 group 是一个”订阅”者,一个 Topic 中的每个 partions,只会被一个”订阅者”中的一个 consumer 消费,不过一个 consumer 可以消费多个 partitions 中的消息。kafka 只能保证一个 partition 中的消息被某个 consumer 消费时,消息是顺序的。事实上,从 Topic 角度来说,消息仍不是有序的。

  kafka 的设计原理决定,对于一个 topic,同一个 group 中不能有多于 partitions 个数的 consumer 同时消费,否则将意味着某些consumer 将无法得到消息。

2 0