什么是Kafka?如何构建和Dockerize一个Kafka集群?

135 阅读8分钟

什么是Kafka?如何构建并Docker化一个Kafka集群

Kafka是一个开源的、分布式的事件流平台。它使开发者能够收集、存储和处理数据,从而大规模地构建实时事件驱动的应用程序。它允许开发者构建连续产生和消费数据记录流的应用,使应用成为高性能的数据管道。

Kafka应用是如何工作的?

假设一家公司有一个源系统和一个目标系统,目的是为了交换数据。在这种情况下,一家公司没有使用Kafka架构。然而,当这家公司发展壮大后,它将有许多目标系统和源系统需要相互交换数据。

这意味着公司需要配置更多的交互环境,比如选择网络协议和数据格式来确定数据形状和数据演变。

如果一个公司有十个这样的源系统和十五个目标系统,公司至少需要有150个完善的连接来实现这些系统之间的数据交互。因此,每当你把一个源系统和一个目标系统整合在一起的时候,你就会有一个应用程序需要的连接的负载增加。

让我们以传统的HTTP网络协议为例,客户端向服务器发送一个信息。由于连接的负载,这意味着服务器有很大的可能对客户端的响应很慢。在这种情况下,客户端与服务器是耦合的。如果服务器很慢,我们会得到低延迟。如果服务器死了,请求就会失败,必须重试。这就是Kafka来拯救的地方。

Kafka服务器的工作方式就像这个消息传递系统一样。然而,Kafka服务器是作为一个消息代理使用的。在Kafka服务器中,我们有两个主要的抽象概念,一个是生产者,一个是消费者。生产者生产内容并将其发布到Kafka服务器上。消费者从Kafka服务器上消费这些内容。在这种情况下,每个生产者都可以产生一些消息并将其发布到Kafka服务器上。然后,一个消费者可以直接从Kafka服务器上消费这些消息。这样一来,Kafka就充当了两者之间的中介。

apache-kafka-diagram

而通常,Kafka服务器被称为经纪人。它充当了一个可以存储消息的系统。一个可能对消息感兴趣的消费者会从Kafka经纪人那里得到消息。这创造了很多具有可扩展性和高可用性的架构优势。我们可以扩展生产者(客户端)以产生更多的消息,更多的经纪人(Kafka)来处理消息,并扩展消费者(服务器)来处理消息。

为什么我们需要Kafka

Kafka被称为是一个分布式应用。由于Kafka是一个分布式平台,在生产环境中,Kafka将被称为Kafka集群。一个Kafka集群包括一个以上的Kafka代理。这样一来,数据就分布在几个不同经纪商的网络中。

与传统的HTTP网络不同,Kafka集群是容错的。只要有一个组件出现故障,系统仍然会运行。此外,Kafka可以在几个经纪商之间复制数据。当一个生产者产生一个消息时,Kafka将使用复制因子在不同的Kafka经纪商之间发布这些消息。

在每个经纪商中,消息被存储为一个主题。主题可以被划分为分区,而消息则进入一个分区。我们可以告诉Kafka将该消息的副本存储在不同分区的不同经纪商上。这样一来,当一个经纪人死亡时,消息就不会丢失。

此外,感兴趣的消费者可以订阅这些主题,并开始按顺序接收消息,并为每个消息分配一个索引号。此外,如果消费者失败或崩溃,它可以使用索引号重试,并继续它离开的地方。

apache-kafka-partitions

主题和分区的概念使Kafka集群更具可扩展性。这意味着你可以根据你的低要求和用户数量来扩展Kafka应用。这样一来,你就可以在必要时增加新的经纪人。或者通过扩展经纪商中的分区数量来增加消费者的数量并推送更多的消息。

本指南将讨论Kafka和Docker的一些基本概念,最后使用Docker对Kafka应用进行docker化。这样一来,它就变得与平台无关了。这样一来,它就变得与平台无关了。这使得我们可以在任何操作系统上运行我们的服务,而不需要对操作系统做任何改变或安装新的依赖。

前提条件

要跟上这篇文章,关键是要具备以下条件。

  • 有过[使用Docker的工作]经验

  • 在你的电脑上安装了[Docker和docker-compose]。

  • 确保你的电脑上安装了[git bash]。

你可以通过分别运行以下命令来检查上述安装情况。

docker --version

和。

docker-compose --version

如果其中一个产生了错误,请务必在继续之前安装它。

目标

在本教程中,我们将。

  • 使用docker-compose 建立一个Kafka集群。
  • 在Kafka集群中创建一个主题。
  • 查看Kafka集群内所有创建的主题。

第1步:添加一个docker-compose脚本

我们将首先创建一个项目目录,然后在项目的根部创建一个docker-compose.yml 文件,以dockerize一个Kafka集群。在这个docker-compose.yml ,我们将定义我们要运行的版本和服务,具体如下。

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - '2181:2181'
  kafka:
    image: wurstmeister/kafka
    container_name: Kafka
    ports:
      - '9092:9092'
    environment:
      KAFKA_ADVERTISED_HOST_NAME: localhost
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

从上面的脚本中,我们是。

  • 定义我们要使用的版本docker-compose
  • 定义我们要运行的两个服务。这就是Zookeeper和Kafka。
    • Kafka - 要创建Kafka实例。
    • Zookeeper - Kafka依赖它来提供各种级别的管理,如元数据存储、领导者选举、健康检查等。

kafka broker

每个服务都有以下属性

  • 来自DockerHub的服务的镜像。
  • 容器的名称。
  • 容器运行的端口号,以便于访问。
  • 一个将在Docker创建过程中被替换的环境变量。

第2步:执行docker-compose.yml脚本

从你的项目文件夹中打开终端,运行以下命令来启动我们在docker-compose.yml脚本中设置的容器。

docker-compose -f docker-compose.yml up -d

上述命令将安装所有需要的依赖项,并在后台模式下启动容器。然后,你可以验证这些容器是否已经启动并运行。运行这个命令。

docker ps

running-containers

第3步:执行Kafka容器

通过执行下面的命令进入Kafka容器。

docker exec -it kafka /bin/sh

上述命令将使用bash在交互式模式下执行Kafka容器。

在产生的bash终端中,我们将创建一个主题。要做到这一点,我们将遵循以下步骤。

  1. 首先,导航到opt 文件夹内的kafka 文件夹。下面这个命令将帮助你这样做。
cd opt/kafka
  1. 执行bin文件夹内的kafka-topics.sh 脚本,用下面的命令创建一个主题。
./bin/kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic test

在上面的命令中,我们正在创建一个具有以下声明的主题。

  1. --create - 来暗示我们正在创建一个主题。
  2. --zookeeper - 正在运行的zookeeper容器和它的端口。
  3. --replication-factor - 我们希望这个主题在集群中的副本数量。
  4. --partitions - 为了生产者-消费者的可扩展性,该主题的划分数量。
  5. --topic - 我们想要创建的主题的名称。

一旦你执行了上述命令,应该会返回主题的名称。要检查你的主题,请运行。

./bin/kafka-topics.sh --list --zookeeper zookeeper:2181

从上面来看,我们正在执行bin文件夹中的kafka-topics.sh 脚本,将--list 传递给list和--zookeeper ,这是正在运行的容器及其端口。

在这一点上,你有一个工作的Kafka集群及其Zookeeper。要想停止这些容器,你可以运行这个命令。

docker-compose down

总结

当你把消息从A点移动到B点时,Kafka代理对于数据复制很有用。Kafka建立在一个高性能的架构上,确保低延迟、可扩展性和吞吐量。事件流和处理系统依靠Kafka作为其骨干。这通过提供统一的实时数据反馈来确保系统健康。

Kafka的一些日常用例包括每日新闻馈送,如《纽约时报》。它使用Apache Kafka流存储并向其读者发布实时新闻。信息传递应用,例如LinkedIn,估计每天要处理五万亿条信息。

Kafka被Netflix用于实时监控和事件处理。Cloudflare使用Kafka进行日志处理和分析管道。他们现在可以从各种服务器上收集到数千亿的事件。Uber、Adidas、PayPal、Cisco和Pinterest等等,都是使用Kafka的公司。