Kafka是一个分布式的消息投递系统,使用TCP协议进行网络通信,包含三个关键功能:

  1. 发布和订阅功能:能够连续的导入/导出来自其他系统的数据
  2. 持久化数据存储:
  3. 记录发生时或回顾性的处理事件流

Kafka通常应用于两大场景:

  1. 系统间或者应用程序间构建实时流数据管道
  2. 转换或响应数据流的实时流应用程序

Kafak相对于传统MQ,具有更好的吞吐量和容错性,更适合大规模数据场景;

 

Kafka特点

     分布式、高扩展、可持久化、高吞吐量、高容错性、高并发

 

Kafka主要概念

  1. Broker : 一个节点就是一个Broker,一个或多个Broker组成一个集群;
  2. Topic: 主题;一个主题可以被多个消费者消费
  3. Partition:分区,一个topic可以有多个Partition,每个Partition内部数据是有序的
  4. Producer:生产者,用于生产消息,向broker发送消息,一个生产者可以向多个Topic发送消息
  5. Consumer:消费者,负责从broker读取消息,一个消费者可以消费多个Topic
  6. 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