kafka?kafaka! Kafka...
kafka是什么?
答:Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系统。(百度的,大白话一大句。读完一脸懵圈)
kafka的基本术语?
答:
- 消息:kafka中的数据单元被称为消息,也被成为记录们可以把它看做数据库表中的某一行的记录。
- 批次:为了提高效率,消息会分批次写入kafka,批次就代表的是一组消息。
- 主题:消息的中类成为主题(Topic),可以说一个主题代表了一类消息,相当于是对消息进行分类。主题就像是数据库中的表。
- 分区:主题可以被分为若干个分区(partition),同一个主题中的分区可以不再一个机器上,有可能会部署在多个机器上,由此来实现kafka的伸缩性,单一主题中的分区有序
- 生产者:向主题发布消息的客户端应用程序成为生产者(Producer),生产者用于持续不断的向某个主题发送消息。
- 消费者:订阅主题消息的客户端程序成为消费者(Consumer),消费者用于处理生产者产生的消息。
- 消费者群组:一个生产者对应多个消费者,消费者群组(Consumer Group)指的就是由一个或多个消费者组成的群体
- 偏移量:偏移量(Consumer Offset)是一种元数据,他是一个不断递增的整数值,用来记录消费者发生重平衡时候的位置,以便用来恢复数据。
- broker:一个独立的kafka服务器就被称为broker,broker接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘中。
- broker集群:broker是集群的组成部分,broker集群由一个或多个broker组成,每个集群都有一个broker同事充当了集群控制器的角色(自动从集群的活跃成员中选举出来)
- 副本:kafka中消息的备份又叫做副本(Replica),副本的数量是可以配置的,kafka定义了两类副本:领导者副本(Leader Replica) 和追随者副本(Follow Replica),前者对外提供服务,后者只是被动跟随
- 重平衡:Rebalance。消费者组内某个消费者实例挂掉的后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance是kafka消费者端实现高可用对的重要手段。
Kafka的特性(设计原则)
- 高吞吐、低延迟::kafka最大的特点就是收发消息非常快,kafka每秒可以处理几十万条消息,它的最低延迟只有几毫秒。
- 高伸缩性:每个主题(topic)包含多个分区(partition),主题中的分区可以费能不在不同的主机(broker)中。
- 持久性、可靠性:kafka能够允许数据的持久化存储,消息被持久化到磁盘,并支持数据备份防止数据丢失,kafka底层的数据存储是基于Zookeeper存储的,Zookeper我们知道它的数据能够持久存储。
- 容错性:允许集群中的节点失败,某个节点宕机,kafka集群能够正常工作。
- 高并发:支持竖数千个客户端的同事读写
kafka的使用场景
- 活动追踪:可以用来追踪用户的行为。
- 传递消息:应用程序向用户发送通知就是通过传递消息来实现的,这些应用组件可以生成消息,而不需要关心消息的格式,更不需要关心消息是怎么发送的。
- 度量指标:用来记录运营的监控数据。包括收集各种分布式应用的数据,生产各种操作的几种反馈,比如警报和报告
- 日志记录:kafka的基本盖面来源于提交日志,比如我们可以把数据库的更新发送到kafka上,用来记录数据库的更新时间,通过kafka以统一接口服务的方式开放给各种consumer、例如Hadoop、HBASE、Solr等
- 流式处理:流式处理有一个能够提供多种应用程序的领域
- 限制削峰:kafka多用于互联网领域某一时刻请求特别多的情况下,可以把请求写入kafka中,避免直接请求后端程序导致服务崩溃。
kafka的消息队列
- kafka的消息队列一般分为两种模式:点对点模式、发布订阅模式
- kafka是支持消费者群组的,也就是说kafka中会有一个或者多个消费者,如果一个生产者生产的消息是有一个消费者消费,这种模式就是点对点的模式。(消息被消费以后,queue中不在存储,所以消息消费者不可能消费到已
经被消费的消息。。但是Queue中支持存在多个消费者,但对同一个消息而言只会有一个消费者消费)
- 如果一个生产者或者多个生产者产生的消息能够被多个消费者同时消费的情况,这样的消息队列成为发布订阅模式的消息队列
- 一个典型的kafka集群中包含若干个Producer(可以是前端产生的PageView,或者是服务器日志,系统的CPU、Memory等),若干个broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干个Consumer Group,以及一个Zookeper集群。Kafka通过Zookeeper管理集群皮遏制,选举leader,以及Consumer Group发生变化时进行rebalance。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅消息。
核心API
四个核心API:Producer API、Consumer API、Stream API、Connector API
- Producer API,它允许应用程序向一个或多个topics上发送消息记录
- Consumer API,允许应用程序订阅一个或多个topics并处理为其生成的记录流
- Stream API,它允许应用程序作为流处理器,从一个或多个主题中消费输入流并为其生成输出流,有效的将输入流转换为输出流。
- Connector API,它允许构建和运行将kafka主题连接到吸纳有应用程序或数据系统的可用生产者和消费者。例如关系数据库的连接器可能会捕获对表的多有更改
Kafka嘛原因那么快
- 顺序读写
- 零拷贝
- 消息压缩
- 分批发送
Kafka实现了零拷贝原理来快速移动数据,避免了内核之间的切换。Kafka可以将数据记录分批发送,从生产者到文件系统到消费者,可以端到端的查看这些批次的数据
批处理能够进行更有效的数据压缩并减少I/O延迟,Kafka采取顺序写入磁盘的方式,避免了随机磁盘寻址的浪费。
Kafka的一些重要的配置
- broker.id:每个kafka broker都有一个唯一的标识来表示,这个唯一的标识即是:broker.id,他的默认值是0,这个值在kafka集群中必须是唯一的,这个值可以任意设定。
- port:如果使用配置样本来启动kafka,它会监听9092端口。如果修改配置参数可以改为任意的端口。但是改为1024的端口的时候需要是要root的权限启动kafka。
- zookeper.connect:用于保存broker的元数据是zookeper地址是通过zookeper.connect来指定的。
例如:localhost:2222表示这个zookeper是运行在本地的2222的端口上的。
例如:zk1:2222,zk2:2222,zk3:2222来指定zookeper.connect的多个参数值。该配置参数时使用冒号分割的一 组hostname:port/path。。
hostname:是zookeper服务器的机器名或者IP的值。
port:是zookeper客户端的端口号
/path:是可选择的zookeper路径,kafka路径是使用了chroot环境,如果不指定默认使用根路径
当有两套kafka的集群:kafka1、kafka2,两套的zookeper.connect参数可以这样指定:zk1:2222,zk2:2222.zk3:2222/kafka1和zk1:2222,zk2:2222.zk3:2222/kafka2
- log.dirs:kafka把所有的消息都保存到磁盘上,存放这些日志片段的目录是通过log.dirs来制定的,是使用逗号分隔的本地系统路径,log.dirs是没有默认值得,必须手动指定默认值。
- num.recovery.threads.per.data.dir 对于以下的三种情况,kafka会使用可配置IDE线程池来处理日志片段
- 服务器正常启动,用于打开每个分区的日志片段
- 服务器崩溃后重启,用于检查和截断每个分区的日志片段
- 服务器正常关闭,用于关闭日志片段
- auto.create.topics.enable
- kafak会使用三种方式来自动创建主题,
- 当一个生产者开始主题写入消息时
- 当一个消费者开始从主题读取消息时
- 当任意一个客户端向主题发送元数据请求时
- 当auto.create.topics.enable参数设置为false,表示不允许自动创建Topic。如果设置为true就可能引发有很多奇葩的名字
- kafak会使用三种方式来自动创建主题,