前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。
Apache Kafka是一种分布式消息代理,旨在处理大量实时数据。Kafka 集群具有高度可扩展性和容错性。与ActiveMQ和RabbitMQ等其他消息代理相比,它还具有更高的吞吐量。尽管它通常用作发布/订阅消息传递系统,但许多项目也将其用于日志聚合,因为它为已发布的消息提供持久存储。
发布/订阅消息系统允许一个或多个生产者发布消息,而无需考虑消费者的数量或他们将如何处理消息。订阅的客户端会自动收到有关更新和新消息创建的通知。该系统比客户端定期轮询以确定是否有新消息可用的系统更高效且可扩展。
在本文中,我们将在 Ubuntu 20.04 上安装和配置 Apache Kafka 2.8.2。
要继续操作,需要:
由于 Kafka 可以通过网络处理请求,因此第一步是为该服务创建专用用户。如果有人破坏 Kafka 服务器,这可以最大限度地减少对 Ubuntu 计算机的损害。在此步骤中创建一个专用kafka
的用户。
以非 root的sudo
用户身份登录到服务器,然后创建一个名为kafka
的用户:
sudo adduser kafka
按照提示设置密码并创建kafka
用户。
接下来,使用命令将kafka
用户添加到组中。我们需要这些权限来安装 Kafka 的依赖项:
sudo adduser kafka sudo
现在kafka
用户现在已准备就绪。使用以下方式登录帐户:
su -l kafka
现在我们已经创建了 Kafka 特定的用户,可以下载并提取 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 服务器。
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 服务器的单元文件。
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.sh
和zookeeper-server-stop.sh
shell 文件来启动和停止服务。它还指定如果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.sh
和kafka-server-stop.sh
shell 文件来启动和停止服务。它还指定如果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.
在此步骤中,我们启动并启用了kafka
和zookeeper
服务。在下一步中,将检查 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 服务器的安全性。
安装完成后,可以删除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 添加到你的系统中。
开发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 服务器上安全运行。