Kafka学习笔记(一)基础入门

简介

Kafka是由LinkedIn使用Scala语言开发的分布式消息引擎系统,目前已被捐献给Apache基金会,它以高吞吐量、可持久化、流数据处理等特性而被广泛使用。它主要有以下三种主要功能:

  • 消息中间件:具备常见的消息队列功能:系统解耦、冗余存储、流量削峰填谷、缓冲、异步通信,同时具备消息顺序性保障、回溯消费等功能。
  • 数据存储系统:Kafka可以把消息持久化到磁盘。
  • 流数据处理平台:具备一个完整的流式处理平台。

Kafka支持两种常见消息传输模型:

  • 点对点模型:也称为消息队列模型,系统A发送的消息只能被系统B接收,其它系统读取不到。
  • 发布/订阅模型:使用Topic接收消息,PublisherSubscriber都可以有多个,可以同时向Topic发送接收消息。

基本概念

  • Kafka体系结构:一个Kafka集群包括若干Producer、Customer、Broker,以及一个Zookeeper集群。
    • Broker:服务端由被称为Broker的服务进程构成,Broker负责接受和处理客户端请求,以及对消息进行持久化。
      • 多个Broker可以运行在同一台机器,常见做法是不同Broker放在不同机器
    • Producer:客户端节点,发送消息的一方。
    • Customer:客户端节点,接收消息的一方。
    • Zookeeper集群:负责元数据管理,集群选举。 目前最新版3.1.0提供了KRaft模式,集群不再依赖ZK。
  • Topic:逻辑概念,Kafka中消息以主题为单位进行分类,生产者将消息发送到特定的主题,消费者订阅主题进行消费。
  • Partition:主题可以分为多个分区,分区在物理存储层面可以看作一个可Append的Log文件,消息被Append到Log中会分配一个offset,这个属性是消息的唯一标识 ,Kafka通过它来保证消息在分区内的顺序性,因此Kafka保证分区有序而不是主题有序。
    • 主题中的分区可以分布在不同的Broker中。
  • 多副本机制:一个Leader,多个Follower节点。
    • Leader:负责处理客户端的读写请求。
    • Follower:只负责与Leader的消息同步,当Leader发生故障,从Follower中选举新的Leader。
    • 所有副本被称为AR(Assigned Replicas),所有与Leader副本数据一致性差距过多的副本组成OSR(Out-of-Sync Replicas),其他称为ISR(In-Sync Replicas)。
    • Leader故障后,从ISR中选举新的Leader。
    • 高水位(HW-High Watermark):消费者能消费的最大offset位置,相当于所有副本中都存在的消息(木桶效应)
    • LEO(Log End Offset):标识当前日志文件中下一条待写入消息的offset,每个副本都会维护自身的LEO,ISR中最小的LEO即为分区的HW

部署

使用WSL 2环境进行单机部署。

1
2
zero@Pluto:~$ uname -a
Linux Pluto 4.19.128-microsoft-standard #1 SMP Tue Jun 23 12:58:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

Kafka需要Java环境,由于Kafka最新版本3.1.0不再支持Java8,故使用Java11。

1
2
3
4
zero@Pluto:~$ java -version
openjdk version "11.0.15" 2022-04-19
OpenJDK Runtime Environment (build 11.0.15+10-Ubuntu-0ubuntu0.18.04.1)
OpenJDK 64-Bit Server VM (build 11.0.15+10-Ubuntu-0ubuntu0.18.04.1, mixed mode, sharing)
1
2
3
4
cd /opt
wget https://dlcdn.apache.org/kafka/3.1.0/kafka_2.13-3.1.0.tgz
tar -zxvf kafka_2.13-3.1.0.tgz
cd kafka_2.13-3.1.0

运行下面命令单机部署:

1
bin/kafka-server-start.sh config/server.properties

创建主题测试

创建一个topic名称为test,副本因子为1,分区个数为1的Topic。

1
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test

通过--describe可以进行查看。

1
2
3
zero@Pluto:/opt/kafka_2.13-3.1.0$ bin/kafka-topics.sh --describe --topic test --bootstrap-server localhost:9092
Topic: test TopicId: Zb5Tr1MpS1ukdX22mnoBoQ PartitionCount: 1 ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0

发送/消费消息测试

bin/kafka-console-producer.sh可以通过命令行输入消息并发送给Kafka,每一行是一条消息。

1
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

同时提供了bin/kafka-console-consumer.sh提供消费消息的功能。

1
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

配置参数

1
2
3
4
5
6
7
8
9
# 指明连接的Zookeeper集群服务地址,使用逗号进行分割
#
zookeeper.connect=localhost:2181

# 指定kakfa集群中broker的唯一标识
broker.id=0

# Kafka日志文件位置
log.dirs=/tmp/kafka-logs

应用场景

  • 消息队列:可以替代传统消息队列,比如ActiveMQ、RabbitMQ等。
  • 流处理平台:对数据进行实时流处理。
  • 网站活动追踪:用户活动(浏览网页、搜索等)、网站活动发布到不同的主题,进行实时处理监测,可替代Hadoop或其他离线数仓。
  • 日志聚合
  • 事件采集

使用


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!