前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站

如何在 Ubuntu 20.04 上安装 Apache Kafka

介绍

[Apache Kafka]是一种分布式消息代理,旨在处理大量实时数据。Kafka 集群具有高度可扩展性和容错性。与ActiveMQ和RabbitMQ等其他消息代理相比,它还具有更高的吞吐量。尽管它通常用作发布/订阅消息传递系统,但许多项目也将其用于日志聚合,因为它为已发布的消息提供持久存储。

发布/订阅消息系统允许一个或多个生产者发布消息,而无需考虑消费者的数量或他们将如何处理消息。订阅的客户端会自动收到有关更新和新消息创建的通知。该系统比客户端定期轮询以确定是否有新消息可用的系统更高效且可扩展。

在本文中,我们将在 Ubuntu 20.04 上安装和配置 Apache Kafka 2.8.2。

先决条件

要继续操作,需要:

  • 具有至少 4 GB RAM 和具有sudo权限的非 root 用户的Ubuntu 20.04服务器。如果没有设置非 root 用户,可以按照我的使用 Ubuntu 20.04 进行初始服务器设置进行设置。RAM 小于 4GB 的安装可能会导致 Kafka 服务失败。
  • OpenJDK 11 。Kafka是用Java编写的,因此需要JVM。

第 1 步 — 为 Kafka 创建用户

由于 Kafka 可以通过网络处理请求,因此第一步是为该服务创建专用用户。如果有人破坏 Kafka 服务器,这可以最大限度地减少对 Ubuntu 计算机的损害。在此步骤中创建一个专用kafka的用户。

以非 root的sudo用户身份登录到服务器,然后创建一个名为kafka 的用户:

sudo adduser kafka

按照提示设置密码并创建kafka用户。

接下来,使用命令将kafka用户添加到组中。我们需要这些权限来安装 Kafka 的依赖项:

sudo adduser kafka sudo

现在kafka用户现在已准备就绪。使用以下方式登录帐户:

su -l kafka

现在我们已经创建了 Kafka 特定的用户,可以下载并提取 Kafka 二进制文件了。

第 2 步 — 下载并解压 Kafka 二进制文件

在此步骤中,将下载 Kafka 二进制文件并将其解压到kafka用户主目录中的专用文件夹中。

首先,在/home/kafka创建一个目录Downloads来存储下载:

mkdir ~/Downloads

curl下载 Kafka 二进制文件:

curl "https://downloads.apache.org/kafka/2.8.2/kafka_2.13-2.8.2.tgz" -o ~/Downloads/kafka.tgz

创建一个名为 kafka的目录并移动到该目录。下来将使用此目录作为 Kafka 安装的基本目录:

mkdir ~/kafka && cd ~/kafka

使用以下命令提取下载的存档:

tar -xvzf ~/Downloads/kafka.tgz --strip 1

指定该--strip 1标志以确保存档的内容是在~/kafka/其自身中提取的,而不是在其中的另一个目录(例如~/kafka/kafka_2.13-2.8.2/)中提取的。

现在已成功下载并提取二进制文件,可以开始配置 Kafka 服务器。

第 3 步 — 配置 Kafka 服务器

Kafka[主题]是可以发布消息的类别、组或主题名称。但是,Kafka 的默认行为不允许删除主题。要修改此设置,必须编辑配置文件,下来将在此步骤中执行此操作。

Kafka 的配置选项在server.properties 中指定。使用最喜欢的编辑器nano打开此文件:

nano ~/kafka/config/server.properties

首先,添加一个允许删除 Kafka 主题的设置。将以下行添加到文件底部:

〜/ kafka / config / server.properties

delete.topic.enable = true

其次,将通过修改属性来更改存储 Kafka 日志的目录log.dirs。找到该log.dirs属性并将现有路线替换为突出显示的路线:

〜/ kafka / config / server.properties

log.dirs=/home/kafka/logs

保存并关闭文件。

现在我们已经配置了 Kafka,可以创建systemd用于在启动时运行和启用 Kafka 服务器的单元文件。

第 4步 — 创建systemd单元文件并启动 Kafka 服务器

在本部分中,我们将为Kafka 服务创建systemd单元文件。这些文件将帮助我们与其他 Linux 服务一致的方式执行常见的服务操作,例如启动、停止和重新启动 Kafka。

Kafka 使用Zookeeper来管理其集群状态和配置(最新版的可以选择是否是ZK)。它被用于许多分布式系统中,我们可以在官方 Zookeeper 文档中阅读有关该工具的更多信息。下面演示将使用 Zookeper 作为这些单元文件的服务。

创建单元文件zookeeper

sudo nano /etc/systemd/system/zookeeper.service

在文件中输入以下单位定义:

/etc/systemd/system/zookeeper.service

[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target

[Service]
Type=simple
User=kafka
ExecStart=/home/kafka/kafka/bin/zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties
ExecStop=/home/kafka/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

[Unit]部分指定 Zookeeper 需要网络和文件系统准备好才能启动。

[Service]部分指定systemd应使用zookeeper-server-start.shzookeeper-server-stop.shshell 文件来启动和停止服务。它还指定如果Zookeeper异常退出则应重新启动。

添加此内容后,保存并关闭文件。

接下来,创建kafka systemd 服务文件:

sudo nano /etc/systemd/system/kafka.service

在文件中输入以下单位定义:

/etc/systemd/system/kafka.service

[Unit]
Requires=zookeeper.service
After=zookeeper.service

[Service]
Type=simple
User=kafka
ExecStart=/bin/sh -c '/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/server.properties > /home/kafka/kafka/kafka.log 2>&1'
ExecStop=/home/kafka/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

[Unit]部分指定该单元文件依赖于zookeeper.service,这将确保在服务启动zookeeper时自动启动kafka

[Service]部分指定systemd应使用kafka-server-start.shkafka-server-stop.shshell 文件来启动和停止服务。它还指定如果Kafka异常退出则应重新启动。

保存并关闭文件。

现在已经定义了单位,使用以下命令启动 Kafka:

sudo systemctl start kafka

要确保服务器已成功启动,请检查该kafka单元的日志日志:

sudo systemctl status kafka

将收到如下输出:

Output● kafka.service
     Loaded: loaded (/etc/systemd/system/kafka.service; disabled; vendor preset>
     Active: active (running) since Wed 2023-02-01 23:44:12 UTC; 4s ago
   Main PID: 17770 (sh)
      Tasks: 69 (limit: 4677)
     Memory: 321.9M
     CGroup: /system.slice/kafka.service
             ├─17770 /bin/sh -c /home/kafka/kafka/bin/kafka-server-start.sh /ho>
             └─17793 java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMill>

现在有一个 Kafka 服务器正在侦听端口9092,这是 Kafka 服务器使用的默认端口。

现在已启动该kafka服务。但是如果要重新启动服务器,Kafka将不会自动重新启动。要在服务器启动时启用该kafka服务,请运行以下命令:

sudo systemctl enable zookeeper

将收到已创建符号链接的响应:

OutputCreated symlink /etc/systemd/system/multi-user.target.wants/zookeeper.service → /etc/systemd/system/zookeeper.service.

然后运行这个命令:

sudo systemctl enable kafka

将收到已创建符号链接的响应:

OutputCreated symlink /etc/systemd/system/multi-user.target.wants/kafka.service → /etc/systemd/system/kafka.service.

在此步骤中,我们启动并启用了kafkazookeeper服务。在下一步中,将检查 Kafka 安装。

第 5 步 — 测试 Kafka 安装

在此步骤中,将测试 Kafka 安装。我们将发布并使用一条Hello World消息,以确保 Kafka 服务器按预期运行。

在 Kafka 中发布消息需要:

  • 生产者*,*能够将记录和数据发布到主题。
  • 消费者,从主题读取消息和数据。

首先,创建一个名为TutorialTopic 的主题:

~/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic TutorialTopic

我们使用脚本从命令行创建生产者kafka-console-producer.sh。它需要 Kafka 服务器的主机名、端口和主题作为参数。

将收到主题已创建的响应:

OutputCreated topic TutorialTopic.

现在将字符串发布"Hello, World"TutorialTopic主题:

echo "Hello, World" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null

接下来,使用该脚本创建一个 Kafka 消费者kafka-console-consumer.sh。它需要 ZooKeeper 服务器的主机名和端口以及主题名称作为参数。以下命令使用来自TutorialTopic 的消息。请注意该标志的使用--from-beginning,它允许消费在消费者启动之前发布的消息:

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

如果没有配置问题,将Hello, World在终端中收到响应:

OutputHello, World

该脚本将继续运行,等待更多消息发布。要对此进行测试,请打开一个新的终端窗口并登录到您的服务器。请记住以你的用户身份登录kafka

su -l kafka

在这个新终端中,启动生产者来发布第二条消息:

echo "Hello World from Sammy at DigitalOcean!" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null

此消息将加载到原始终端中消费者的输出中:

OutputHello, World
Hello World from Sammy at DigitalOcean!

完成测试后,按CTRL+C停止原始终端中的消费者脚本。

到此现在已经在 Ubuntu 20.04 上安装并配置了 Kafka 服务器。在下一步中,我们将执行一些快速任务来强化 Kafka 服务器的安全性。

第 6 步 — 强化 Kafka 服务器

安装完成后,可以删除kafka用户的管理权限并强化 Kafka 服务器。

执行此操作之前,请注销并以任何其他非 rootsudo用户身份重新登录。如果仍在运行开始本教程时使用的同一个 shell 会话,请输入exit

从 sudo 组中删除用户kafka

sudo deluser kafka sudo

为了进一步提高 Kafka 服务器的安全性,请使用该命令锁定用户的密码passwd。此操作可确保任何人都无法使用此帐户直接登录服务器:

sudo passwd kafka -l

-l标志锁定更改用户密码的命令 ( passwd)。

此时,只有一个root或一个用户可以使用以下命令sudo登录:

sudo su - kafka

将来,如果想解锁更改密码的功能,请使用passwd下的-u选项:

sudo passwd kafka -u

现在已成功限制kafka用户的管理员权限。现在可以选择执行下一步,这会将 Kafka 添加到你的系统中。

第 7 步 — 安装 KafkaT(可选)

开发KafkaT 的目的是提高查看 Kafka 集群详细信息以及从命令行执行某些管理任务的能力。需要 Ruby 才能使用它。还需要build-essential包来构建其它所需依赖。

build-essential使用以下命令安装 Ruby 和软件包:

sudo apt install ruby ruby-dev build-essential

现在可以使用以下命令安装 KafkaT :

sudo CFLAGS=-Wno-error=format-overflow gem install kafkat

Wno-error=format-overflow需要编译标志来抑制 Zookeeper 在安装过程中的警告和错误。

安装完成后,将收到安装完成的响应:

Output...
Done installing documentation for json, colored, retryable, highline, trollop, zookeeper, zk, kafkat after 3 seconds
8 gems installed

KafkaT用作.kafkatcfg配置文件来确定Kafka服务器的安装和日志目录。它还应该有一个将 KafkaT 指向我们的 ZooKeeper 实例的条目。

创建一个名为的新文件.kafkatcfg

nano ~/.kafkatcfg

添加以下行以指定有关 Kafka 服务器和 Zookeeper 实例的所需信息:

〜/.kafkatcfg

{
  "kafka_path": "~/kafka",
  "log_path": "/home/kafka/logs",
  "zk_path": "localhost:2181"
}

保存并关闭文件。

要查看有关所有 Kafka 分区的详细信息,请尝试运行以下命令:

kafkat partitions

将收到以下输出:

Output[DEPRECATION] The trollop gem has been renamed to optimist and will no longer be supported. Please switch to optimist as soon as possible.
/var/lib/gems/2.7.0/gems/json-1.8.6/lib/json/common.rb:155: warning: Using the last argument as keyword parameters is deprecated
...
Topic                 Partition   Leader      Replicas        ISRs
TutorialTopic         0             0         [0]             [0]
__consumer_offsets	  0		          0		      [0]							[0]
...
...

输出将包括TutorialTopic__consumer_offsets,这是 Kafka 用于存储客户端相关信息的内部主题。可以安全地忽略以 __consumer_offsets开头的行。

要了解有关 KafkaT 的更多信息,请参阅其GitHub 存储库

结论

现在,Apache Kafka 在 Ubuntu 服务器上安全运行。