1. Kafka 介绍
Kafka是一个分布式流处理平台和消息队列系统,最初由LinkedIn开发,后来成为Apache软件基金会的一个开源项目。它被设计用于高吞吐量、可扩展性和持久性的数据流处理。本质上是一个分布式、持久化的消息队列系统。
1.1. 了解生产者与消费者模型
生产者与消费者模型是一种常见的并发编程模型,用于解决生产者和消费者之间的数据交换和协作问题。在该模型中,生产者负责生成数据,并将其放入共享的缓冲区中,而消费者则负责从缓冲区中获取数据并进行处理。
生产者与消费者模型可以应用于各种场景,例如多线程编程、并发网络编程、消息队列系统等。它提供了一种有效的方式来解耦生产者和消费者之间的关系,并实现数据的安全交换和处理。
生产者-消费者模型特点:
- 解耦生产者和消费者:生产者和消费者之间通过共享的缓冲区进行通信,彼此之间解耦。生产者可以独立地生成数据,而消费者可以独立地处理数据,它们之间不需要直接的交互。
- 异步通信:生产者和消费者可以以异步的方式进行通信。生产者可以在任何时间生成数据,并将其放入缓冲区中,而消费者可以在任何时间从缓冲区中获取数据进行处理。
- 缓冲区:生产者和消费者之间共享一个缓冲区,用于存储生产者生成的数据。缓冲区可以是有限大小的队列,用于控制生产者和消费者之间的数据流量。
- 生产者:生产者负责生成数据,并将其放入缓冲区中。如果缓冲区已满,生产者可能需要等待,直到有空间可用。
- 消费者:消费者负责从缓冲区中获取数据,并进行相应的处理。如果缓冲区为空,消费者可能需要等待,直到有数据可用。
- 数据处理能力不匹配:生产者和消费者之间的数据处理能力可能不匹配。例如,生产者可能以较快的速度生成数据,而消费者可能以较慢的速度处理数据。通过使用缓冲区,可以平衡生产者和消费者之间的速度差异。
1.2. Kafka 作为共享缓冲区的关键特性
- 解耦生产者和消费者
- 生产者只管发送消息到 Kafka,不关心谁消费。
- 消费者按自己的节奏消费消息,不会影响生产者。
- 即使消费者宕机,数据仍然保留在 Kafka 中,不会丢失。
- 高吞吐、低延迟
- Kafka 采用顺序 I/O(顺序写入磁盘)和零拷贝(Zero-Copy)技术,使得它比传统消息队列(如 RabbitMQ)吞吐量更高(可达百万级 QPS)。
- 适用于实时流处理(如日志收集、实时监控、事件驱动架构)。
- 持久化存储(Buffer + Storage)
- Kafka 不像传统消息队列(如 Redis Pub/Sub)那样只做临时缓存,而是持久化存储消息(可配置保留时间,如 7 天、30 天)。
- 消费者可以回溯(rewind)或重放(replay)历史数据,而不会丢失。
- 分布式、可扩展
- Kafka 采用分区(Partition)机制,每个 Topic 可以分成多个 Partition,分布在不同的 Broker(服务器)上。
- 生产者可以并行写入不同 Partition,消费者可以并行消费(Consumer Group 机制)。
- 可以水平扩展,应对海量数据。
- 支持多消费者模式
- 点对点(Queue)模式:一个消息只能被一个消费者消费(适合任务分发)。
- 发布-订阅(Pub/Sub)模式:一个消息可以被多个消费者组消费(适合广播)。
- Kafka 通过 Consumer Group 机制实现灵活的消息分发。
- 灵活性
- 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 (基于docker)
# 环境准备
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
Bash3. Kafka 构架与名词解释
- Broker(代理):Kafka 集群中的每个服务器节点都被称为代理。每个代理都是一个独立的 Kafka 服务器,负责存储和处理消息。
- Topic(主题):主题是 Kafka 中消息的分类或流的名称。消息被发布到特定的主题,并且消费者可以订阅一个或多个主题来接收消息。
- Partition(分区):主题可以被分成多个分区,每个分区是主题的一个子集。每个分区都是一个有序的、不可变的消息序列。分区允许 Kafka 集群水平扩展,以提供更高的吞吐量。
- Offset(偏移量):偏移量是消息在分区中的唯一标识符。它表示消息在分区中的位置。消费者可以通过指定偏移量来读取消息。
- Producer(生产者):生产者是向 Kafka 主题发布消息的客户端应用程序。它负责将消息发送到指定的主题。
- Consumer(消费者):消费者是从 Kafka 主题订阅消息的客户端应用程序。它负责从指定的主题读取消息。
- Consumer Group(消费者组):消费者组是一组具有相同组ID的消费者的集合。每个消费者组可以独立地消费一个或多个主题的消息。Kafka 使用消费者组来实现消息的负载均衡和容错性。
- Replication(复制):复制是指将主题的分区副本复制到多个代理上。复制提供了数据的冗余和容错性,以确保即使某个代理发生故障,数据仍然可用。
- Leader(领导者)和 Follower(追随者):每个分区都有一个领导者和零个或多个追随者。领导者负责处理读写请求,而追随者只是复制领导者的数据。如果领导者发生故障,一个追随者将被选举为新的领导者。
4. Kafka 工作流程
未完待续~~