Kafka是一个分布式的消息投递系统,使用TCP协议进行网络通信,包含三个关键功能:
- 发布和订阅功能:能够连续的导入/导出来自其他系统的数据
- 持久化数据存储:
- 记录发生时或回顾性的处理事件流
Kafka通常应用于两大场景:
- 系统间或者应用程序间构建实时流数据管道
- 转换或响应数据流的实时流应用程序
Kafak相对于传统MQ,具有更好的吞吐量和容错性,更适合大规模数据场景;
Kafka特点
分布式、高扩展、可持久化、高吞吐量、高容错性、高并发
Kafka主要概念
- Broker : 一个节点就是一个Broker,一个或多个Broker组成一个集群;
- Topic: 主题;一个主题可以被多个消费者消费
- Partition:分区,一个topic可以有多个Partition,每个Partition内部数据是有序的
- Producer:生产者,用于生产消息,向broker发送消息,一个生产者可以向多个Topic发送消息
- Consumer:消费者,负责从broker读取消息,一个消费者可以消费多个Topic
- ConsumerGroup: 消费者组,可以有多个消费者,同一条消息只能由同一个组内的一个消费者消费
Kafka架构设计
Kafka架构设计主要分成2部分,即客户端和服务端,客户端就是分布式应用程序或者应用系统,服务端是由一个或多个机器组成的集群,具有高度的扩展性和容错性;
客户端可以分成消费者和生产者;
生产者:
生产者采用异步的方式发送消息,这里涉及到一个主线程、一个sender线程和一个缓冲区(RecordAccumulator)
RecordAccumulator: 内存缓冲区域,当该区域满了,生产者会被阻塞或者抛出异常,这个缓冲区内部维护了一个队列,消息写入缓存时,会被追加到这个队列的尾部;
主线程:将消息发送到缓冲区,在这个中间会经过拦截器、序列化、分区器;
sender线程:不断的从缓冲区队列头部拉取消息并发送到broker;
Batch.size : 数据积累到这个大小时,sender才会发送到broker;
Linger.ms: 数据迟迟未达到batch.size,但达到这个时间时,sender发送数据到broker
Buffer.memory: RecordAccumulator缓冲区大小
分区原则
kafka发送消息是面向分区的,消息发送的时候已经确定要发送到哪个分区;
创建ProducerRecord时,指定partition的情况下,直接作为对应分区,没有指定partition,但是有key,就通过key的hash与partition数进行取模;既没有partition又没有key的情况下,采用轮询算法
Kafka集群设计
一台Kafka服务器就是一个broker,多个broker配置同一组zk就构成一个集群;
broker内部以topic对消息进行管理,生产与消费消息都是面向topic的,topic是逻辑上的概念,真实存储数据的是partition,partition是物理隔离的,同一个topic下的多个partition正常情况会被分配在不同的broker中,并且一个分区只能被一个消费者组中的一个消费者消费;
每个partition单独维护offset,可以保证分区内数据的顺序性,每个分区通常会配置一个leader和2个flower,leader负责处理生产者和消费者的请求,flower作为数据备份,当leader挂掉时,默认会在副本中选择偶发offset最大的副本作为leader,副本机制保证了集群的高可靠性和数据安全性
Kafka的所有消息都是持久化到磁盘的,保证Kafka消息的持久性;
Kafka还采用了顺序写和零拷贝技术,这也是高吞吐量的一个保证;
Kafka消费者设计
消费者分成消费者组和消费者,一个消费者组可以包含多个消费者,一个topic中的一条消息可以被多个消费者组各消费一次,同一个消费者组中,正常情况下一条消息只会被一个消费者消费;
消费者分区分配策略:轮询等。。。
常用命令
创建TOPIC
./bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092
./bin/kafka-topics.sh --bootstrap-server broker_host:port --create --topic my_topic_name --partitions 20 --replication-factor 3 --config x=y
修改topic
./bin/kafka-topics.sh --bootstrap-server broker_host:port --alter --topic my_topic_name --partitions 40
查看Topic
./bin/kafka-topics.sh --describe --topic quickstart-events --bootstrap-server localhost:9092
打开生产者
./bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:9092
监听消费者
./bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:9092
创建Topic -- 带配置 --config
./bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic my-topic --partitions 1 --replication-factor 1 --config max.message.bytes=64000 --config flush.messages=1
查看组
./bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list
重置偏移量
./bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --reset-offsets --group consumergroup1 --topic topic1 --to-latest