Kafka介绍
Kafka是用scala语言编写,最初由Linkedin公司开发,后贡献给了Apache基金会并成为顶级开源项目。是一个分布式、支持分区的(partition)、多副本的(replication),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等。
Kafka的特性
- 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition,consumer group 对 partition 进行consume操作。
- 可扩展性:kafka集群支持热扩展
- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
- 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
- 高并发:支持数千个客户端同时读写
- 顺序性:由生产者发送到一个特定的主题分区的消息将被以他们被发送的顺序来追加。也就是说,如果一个消息M1和消息M2都来自同一个生产者,M1先发,那么M1将有一个低于M2的偏移,会更早在日志中出现。消费者看到的记录排序就是记录被存储在日志中的顺序。
Kafka的使用场景:
- 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如Hadoop、Hbase、Solr等。
- 消息系统:解耦生产者和消费者、缓存消息等。
- 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
- 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
- 流式处理:比如 Spark Streaming 和 Storm。
- 事件源
基本概念
- 生产者(Producer):向Kafka发送消息,生产者会根据topic分发消息。生产者也负责把消息关联到Topic上的哪一个分区。最简单的方式从分区列表中轮流选择,也可以根据某种算法依照权重选择分区,算法可由开发者定义。
- 消费者(Consumer):Consermer实例可以是独立的进程,负责订阅和消费消息。消费者用consumerGroup来标识自己。同一个消费组可以并发地消费多个分区的消息,同一个partition也可以由多个consumerGroup并发消费,但是在consumerGroup中一个partition只能由一个consumer消费。
- 消费者组(Consumer Group):kafka当中多个消费者可以组成一个消费者组。消费者组的主要作用是用来实现单播和广播。一个消费者组可以确保其订阅的topic每个分区只能被从属于该消费者组当中的一个消费者所消费。如果不同的消费者组订阅了同一个topic,那么这些消费者组之间是彼此独立的,不会受到干扰。如果我们希望一个消息,被多个消费者所消费,可以将这些消费者放在不同的消费者组中,这个就是广播。如果一个消息只能被一个消费者所消费,那么可以将这些消费者放在同一个组当中,这就是单播。
- 代理(Broker):Kafka server,用来存储消息,Kafka集群中的每一个服务器都是一个Broker,消费者将从broker拉取订阅的消息。
- 当集群中有Broker挂掉的时候,系统可以主动的使用Replicas提供服务;
- 系统默认设置每一个Topic的Replication的系数为1,可以在创建Topic的时候单独设置;
- Replication的基本单位是Topic的Partition,增加容错性与可扩展性;
- 所有的读和写都从Leader进,Followers只是作为备份;
- Follower必须能够及时的复制Leader的数据;
- 主题(Topic):消息的主题、队列,每一个消息都有它的topic,Kafka通过topic对消息进行归类。Kafka中可以将Topic从物理上划分成一个或多个分区(Partition),每个分区在物理上对应一个文件夹,以”topicName_partitionIndex”的命名方式命名,该dir包含了这个分区的所有消息(.log)和索引文件(.index),这使得Kafka的吞吐率可以水平扩展。
- 分区(Partition):每个主题都可以被划分成多个分区(每个主题至少有一个分区),在同一个主题下,不同分区所包含的内容是不同的,每个消息再被添加到分区当中时,都会被分配一个偏移量(offset),它是消息在分区当中的唯一编号,kafka是通过offset来确保一个分区内的消息顺序的,offset的顺序并不跨越分区,也就是说,在一个分区内消息是顺序的,在不同的分区之间,kafka并不保证消息的顺序。
- 每一个Topic被切分为多个Partitions;
- 消费者数量要小于等于Partition的数量;
- Broker Group中的每一个Broker保存Topic的一个或多个Partitions;
- Consumer Group中的仅有一个Consumer读取Topic的一个或多个Partions,并且是唯一的Consumer。因此消费群组中多余分区数的消费者会空闲没用,所以一般消费者数要小于等于分区数。