kafka入门
缘起
公司业务订单中心(ordercenter)模块中,会将用户的订单订单信息输入到kafkaz中,然后在消息处理(messageHandle)中心进行统一处理。
什么是kafka
kafka来源
- LinkedIn开发
- 2011年初开源,加入Apache基金会
- 2012年从Apache Incubator毕业(成熟)
- Apache顶级开源项目
什么是kafka
Kafka是一种分布式的,基于发布/订阅的消息系统。主要设计目标如下:
- 以时间复杂度为O(1)的方式提供消息持久化能力,并保证即使对TB级以上数据也能保证常数时间的访问性能
- 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输
- 支持Kafka Server间的消息分区,及分布式消息消费,同时保证每个partition内的消息顺序传输
- 同时支持离线数据处理和实时数据处理
kafka结构介绍
kafka基本概念
- Producer
消息和数据的生产者,向kafka的一个topic发布消息的进程/代码/服务 - Consumer
消息和数据的消费者,订阅数据(topic)并且处理其发布的消息的进程/代码/服务 - Consumer Group
逻辑概念,对于同一个topic,会广播给不同的group,一个group中,只有一个consumer可以消费该消息 - Broker
物理概念,kafka集群中的每个kafka节点 - Topic
逻辑概念,kafka消息的类别,对数据进行区分、隔离 - Partition
物理概念,kafka下数据存储的基本单元。一个Topic数据,会被分散存储到多个Partition,每一个Partition是有序的
。kafka会将一个Partition放在一个Broker上 - Replication
同一个Partition可能会有多个Replica(备份),多个Replica之间数据是一样的 - Partition Leader
一个Partition的多个Replica上,需要一个Leader负责该Partition与Producer和consumer交互,有且只有一个Leader,其他的Replica只负责备份 - ReplicaManager
负责管理当前Broker所有分区和副本的信息,处理kafkaControler发起的一些请求,副本状态的切换、添加/读取信息等
kafka基本概念延伸
Partition
- 每一个Topic被切分为多个Partition
- 消费者数目少于或等于Partition的数目
- Broker Group中的每一个Broker保存Topic的一个或多个Partition
- Consumer Group中的仅有一个Consumer读取Topic的一个或多个Partition,并且是唯一的Consumer
Replication
- 当集群中有Broker挂掉的情况,系统可以主动的使用Replicas提供服务
- 系统默认设置每一个Topic的Replication的系数为1(没有副本),可以在创建Topic时单独设置
- Replication的基本单位是Partition
- 所有的读和写都从Leader进,Followers只是作为备份
- Follower必须能够及时复制Leader的数据
- 增加容错性与可扩展性
kafka基本结构
提供了四种类型Api: Producer Api、Consumer Api、Streams Api、Connectors Api
- kafka强依赖与ZooKeeper
kafka消息结构
- Offset
记录当前消息的偏移 - Length
消息的长度 - CRC32
校验字段,校验当前信息的完整性,避免信息不完整而导致数据消费或正常失败 - Magic
固定的数字,判断是不是kafka的消息,如与kafka设定的Magic不一致,那么消息就可以丢弃,不需要其他校验 - attributes
可选字段,存放当前消息的一些属性,会有一个枚举值 - Timestamp
当前消费的时间戳 - key与value
长度不限制
kafka特点
分布式
- 多分区,有多个Partition
- 多副本,有多个Replication
- 多订阅者,数量少于或等于partition
- 基于Zookeeper调度,Broker/Partition等很多信息存放与Zookeeper上
高性能
- 高吞吐量:可以达到每秒几十万
- 低延迟
- 高并发
- 时间复杂度为O(1)
持久性与扩展性
- 数据可持久化
- 容错性:多副本,按组消费
- 支持在线水平扩展:Broker/Topic有一个或多个Partition,消费者按组划分,增加新的机器新的Topic
- 消息自动平衡:将消息在服务端进行平衡,避免过于集中在某几台服务器;在消费者订阅时进行连接的自动平衡
kafka场景与应用
kafka应用场景
- 消息队列
- 行为跟踪
- 元数据监控
- 日志收集
- 流处理
- 事件源
- 持久性日志(commit log)
kafka环境启动
ZooKeeper下载
- 地址:https://www.apache.org/dyn/closer.cgi/zookeeper/
- 修改conf/zoo_sample.cfg
重命名为“zoo.cfg”,编辑dataDir=D:/SoftwareDevelop/zookeeper-3.4.13/data - 设置环境变量
添加系统变量:ZOOKEEPER_HOME=D:\Kafka\zookeeper-3.4.13
编辑path系统变量,添加路径:%ZOOKEEPER_HOME%\bin - 启动ZooKeeper
打开cmd,输入“zkServer“,运行Zookeeper
Kafka下载
- 地址:http://kafka.apache.org/downloads
血的教训。。此处一定要下载二进制版本,否则会报找不到主加载类kafka.kafka
一开始下的源码,然后报错,按照网上的说法是什么jdk版本等原因,后来找到这篇文档在Windows安装运行Kafka,发现是下载错压缩包了 - 修改config/server.properties
log.dirs=D:/SoftwareDevelop/kafka_2.12-2.1.0/kafka-logs - 启动kafka
进入Kafka安装目录D:\Kafka\kafka_2.12-0.11.0.0,按下Shift+右键,选择“打开命令窗口”选项,打开命令行,输入:
.\bin\windows\kafka-server-start.bat .\config\server.properties
kafka简单测试
创建topic
- 进入Kafka安装目录,输入
.\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic yukang-kafka-test
查询topic
- 进入Kafka安装目录,输入
.\bin\windows\kafka-topics.bat --list --zookeeper localhost:2181
ZooKeeper中查看
创建生产者
- 进入Kafka安装目录,输入
.\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic
yukang-kafka-test
进入命令交互式界面,意味着启动了生产者
创建消费者
- 进入Kafka安装目录,输入
.\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic yukang-kafka-test --from-beginning
测试
- 在producer端输入信息
- from-beginning
从头开始消费,会获取生产者里的所有信息,不指定则只获取实时的信息