1. Kafka 介绍

Kafka是一个分布式流处理平台和消息队列系统,最初由LinkedIn开发,后来成为Apache软件基金会的一个开源项目。它被设计用于高吞吐量、可扩展性和持久性的数据流处理。

1.1. 了解生产者与消费者模型

生产者与消费者模型是一种常见的并发编程模型,用于解决生产者和消费者之间的数据交换和协作问题。在该模型中,生产者负责生成数据,并将其放入共享的缓冲区中,而消费者则负责从缓冲区中获取数据并进行处理。
生产者与消费者模型可以应用于各种场景,例如多线程编程、并发网络编程、消息队列系统等。它提供了一种有效的方式来解耦生产者和消费者之间的关系,并实现数据的安全交换和处理。
生产者-消费者模型特点:

  • 解耦生产者和消费者:生产者和消费者之间通过共享的缓冲区进行通信,彼此之间解耦。生产者可以独立地生成数据,而消费者可以独立地处理数据,它们之间不需要直接的交互。
  • 异步通信:生产者和消费者可以以异步的方式进行通信。生产者可以在任何时间生成数据,并将其放入缓冲区中,而消费者可以在任何时间从缓冲区中获取数据进行处理。
  • 缓冲区:生产者和消费者之间共享一个缓冲区,用于存储生产者生成的数据。缓冲区可以是有限大小的队列,用于控制生产者和消费者之间的数据流量。
  • 生产者:生产者负责生成数据,并将其放入缓冲区中。如果缓冲区已满,生产者可能需要等待,直到有空间可用。
  • 消费者:消费者负责从缓冲区中获取数据,并进行相应的处理。如果缓冲区为空,消费者可能需要等待,直到有数据可用。
  • 数据处理能力不匹配:生产者和消费者之间的数据处理能力可能不匹配。例如,生产者可能以较快的速度生成数据,而消费者可能以较慢的速度处理数据。通过使用缓冲区,可以平衡生产者和消费者之间的速度差异。

1.2. Kafka 的优良特性

  • 高吞吐量:Kafka能够处理大规模的实时数据流,并具有很高的吞吐量。它可以每秒处理数百万条消息,适用于需要处理大量数据的场景。
  • 可扩展性:Kafka可以在集群中水平扩展,以处理大量的数据和高并发的请求。它支持分区和副本机制,以实现数据的分布和冗余存储,从而实现高可用性和可扩展性。
  • 持久性:Kafka使用持久性存储来保证数据的可靠性和持久性。它将消息存储在磁盘上,并支持数据的持久化和回放。这使得Kafka非常适合需要可靠数据传递和数据重放的场景。
  • 实时流处理:Kafka不仅可以作为消息队列系统,还可以用于构建实时流处理应用程序。它提供了流处理的原语,如流-表连接、窗口聚合等,以便进行实时数据处理和分析。
  • 可靠性:Kafka具有高度的可靠性和容错性。它使用副本机制来保证数据的冗余存储和故障恢复。即使在节点故障的情况下,Kafka仍然可以保证数据的可用性。
  • 分布式架构:Kafka采用分布式架构,可以在多个节点上进行部署和运行。这样可以提高系统的可靠性、可扩展性和容错性。
  • 生态系统支持:Kafka拥有丰富的生态系统,包括连接器(Connectors)用于与其他系统集成,流处理框架(如Apache Flink、Apache Spark)用于实时数据处理,以及工具和监控系统用于管理和监控Kafka集群。
  • 灵活性:Kafka支持多种编程语言和客户端库,使开发人员可以使用自己熟悉的编程语言进行与Kafka的交互和集成。

1.3. Kafka 的应用场景

  • 实时日志收集:Kafka可以用作实时日志收集系统的中间件。应用程序可以将日志消息发送到Kafka的主题中,然后消费者可以实时地从主题中消费日志消息,并进行处理、存储或分析。
  • 事件流处理:Kafka可以用于处理实时事件流。事件产生者可以将事件数据发送到Kafka的主题中,而事件消费者可以实时地从主题中消费事件数据,并进行实时处理、转换或分析。
  • 消息队列:Kafka作为消息队列系统,可以用于实现异步通信和解耦系统组件。生产者可以将消息发送到Kafka的主题中,而消费者可以从主题中消费消息,并进行相应的处理。
  • 大数据处理:Kafka可以与大数据处理框架(如Apache Spark、Apache Flink)集成,用于实时数据流处理和批处理。Kafka作为数据源和数据接收器,可以实现数据的高效传输和处理。
  • 指标收集和监控:Kafka可以用于收集和传输系统指标和监控数据。应用程序可以将指标数据发送到Kafka的主题中,而监控系统可以实时地从主题中消费指标数据,并进行监控和分析。
  • 流式ETL(Extract, Transform, Load):Kafka可以用于构建流式ETL系统,实现数据的提取、转换和加载。数据源可以将数据发送到Kafka的主题中,而数据处理程序可以实时地从主题中消费数据,并进行转换和加载到目标系统。
  • 分布式系统协调:Kafka的分布式特性使其成为分布式系统中的协调和通信中间件。它可以用于实现分布式锁、分布式事务和分布式事件驱动等场景。

1.4. 引入消息队列的缺点

尽管消息队列(如Kafka)在许多场景下具有许多优点,但也存在一些缺点和挑战。以下是一些常见的消息队列的缺点:

  • 复杂性:引入消息队列会增加系统的复杂性。需要设计和管理消息生产者、消费者和消息队列本身,以确保消息的可靠传递和处理。这可能需要额外的开发和维护工作。
  • 系统延迟:由于消息队列的引入,系统中的消息传递变为异步操作。这可能会导致一定的延迟,因为消息需要在生产者和消费者之间进行传递和排队。对于某些实时性要求较高的应用场景,这种延迟可能是不可接受的。
  • 数据一致性:在分布式系统中,保持数据的一致性可能是一个挑战。由于消息队列的异步性质,消息的传递和处理可能会导致数据的不一致性。需要采取适当的措施来确保数据的一致性,如使用事务或采用幂等性操作。
  • 系统复杂性:引入消息队列可能会增加系统的复杂性。需要考虑消息的序列化和反序列化、消息的路由和分发、消息的持久化和回放等方面的问题。这可能需要额外的开发和维护工作,并增加系统的复杂性。
  • 高可用性和故障处理:消息队列需要具备高可用性和故障处理能力,以确保消息的可靠传递和处理。这可能需要进行复杂的配置和设置,并需要监控和处理可能的故障情况。
  • 系统依赖性:引入消息队列会使系统对消息队列的依赖性增加。如果消息队列出现故障或性能问题,整个系统的可用性和性能可能会受到影响。因此,需要对消息队列进行适当的容量规划和监控。

2. 部署 Kafka

# 环境准备
setenforce 0
iptables -F
sed -i 's#enforcing#disabled#g' /etc/selinux/config
systemctl disable --now firewalld

# 安装docker的依赖的系统包 
yum install -y yum-utils device-mapper-persistent-data lvm2

# 安装docker引擎
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y

# 为docker引擎配置镜像加速站
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://u5l3r88m.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

# 下载镜像
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka

# 启动容器镜像
# 启动zookeeper
docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper  

# 启动kafka
docker run -d --name kafka --publish 9092:9092 --link zookeeper \
--env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
--env KAFKA_ADVERTISED_HOST_NAME=192.168.2.50 \
--env KAFKA_ADVERTISED_PORT=9092 \
wurstmeister/kafka:latest 
Bash

3. Kafka 构架与名词解释

  • Broker(代理):Kafka 集群中的每个服务器节点都被称为代理。每个代理都是一个独立的 Kafka 服务器,负责存储和处理消息。
  • Topic(主题):主题是 Kafka 中消息的分类或流的名称。消息被发布到特定的主题,并且消费者可以订阅一个或多个主题来接收消息。
  • Partition(分区):主题可以被分成多个分区,每个分区是主题的一个子集。每个分区都是一个有序的、不可变的消息序列。分区允许 Kafka 集群水平扩展,以提供更高的吞吐量。
  • Offset(偏移量):偏移量是消息在分区中的唯一标识符。它表示消息在分区中的位置。消费者可以通过指定偏移量来读取消息。
  • Producer(生产者):生产者是向 Kafka 主题发布消息的客户端应用程序。它负责将消息发送到指定的主题。
  • Consumer(消费者):消费者是从 Kafka 主题订阅消息的客户端应用程序。它负责从指定的主题读取消息。
  • Consumer Group(消费者组):消费者组是一组具有相同组ID的消费者的集合。每个消费者组可以独立地消费一个或多个主题的消息。Kafka 使用消费者组来实现消息的负载均衡和容错性。
  • Replication(复制):复制是指将主题的分区副本复制到多个代理上。复制提供了数据的冗余和容错性,以确保即使某个代理发生故障,数据仍然可用。
  • Leader(领导者)和 Follower(追随者):每个分区都有一个领导者和零个或多个追随者。领导者负责处理读写请求,而追随者只是复制领导者的数据。如果领导者发生故障,一个追随者将被选举为新的领导者。

4. Kafka 工作流程