Debian 9にApache Kafkaをインストールする方法

著者はhttps://www.brightfunds.org/funds/foss-nonprofits [無料およびオープンソース基金]を選択して、https://do.co/w4do-cta [Donationsのために書く]の一部として寄付を受け取りましたプログラム。

前書き

Apache Kafkaは、大量のリアルタイムデータを効率的に処理するように設計された人気のある分散メッセージブローカーです。 Kafkaクラスターは、非常にスケーラブルで耐障害性があるだけでなく、http://activemq.apache.org/ [ActiveMQ]やhttps://www.rabbitmqなどの他のメッセージブローカーと比較してスループットがはるかに高くなっています。 com / [RabbitMQ]。 一般に_publish / subscribe_メッセージングシステムとして使用されますが、公開されたメッセージの永続的なストレージを提供するため、多くの組織がログの集約にも使用しています。

パブリッシュ/サブスクライブメッセージングシステムにより、1人または複数のプロデューサーが、コンシューマの数やメッセージの処理方法を考慮することなく、メッセージをパブリッシュできます。 登録されたクライアントには、更新および新しいメッセージの作成が自動的に通知されます。 このシステムは、クライアントが定期的にポーリングして新しいメッセージが利用可能かどうかを判断するシステムよりも効率的でスケーラブルです。

このチュートリアルでは、Apache Kafka 2.1.1をDebian 9にインストールして使用します。

前提条件

従うには、次のものが必要です。

  • 1台のDebian 9サーバーと、sudo特権を持つ非rootユーザー。 非rootユーザーが設定されていない場合は、このhttps://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9 [ガイド]で指定されている手順に従ってください。

  • サーバー上に少なくとも4GBのRAM。 この量のRAMなしでインストールすると、起動時にhttps://en.wikipedia.org/wiki/Java_virtual_machine[Java仮想マシン(JVM)]が「メモリ不足」例外をスローして、Kafkaサービスが失敗する場合があります。

  • OpenJDK 8がサーバーにインストールされています。 このバージョンをインストールするには、https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-on-debian-9#installing-the-default-jrejdk [これらの手順]に従ってくださいOpenJDKの特定のバージョンをインストールします。 KafkaはJavaで記述されているため、JVMが必要です。ただし、その起動シェルスクリプトにはバージョン検出のバグがあり、8以上のJVMバージョンでは起動に失敗します。

ステップ1-Kafkaのユーザーの作成

Kafkaはネットワーク経由でリクエストを処理できるため、専用のユーザーを作成する必要があります。 これにより、Kafkaサーバーが危険にさらされた場合のDebianマシンへの損傷が最小限に抑えられます。 このステップでは専用の* kafka *ユーザーを作成しますが、Kafkaのセットアップが完了したら、このサーバーで他のタスクを実行するために別の非rootユーザーを作成する必要があります。

非ルートsudoユーザーとしてログインし、 `+ useradd +`コマンドで* kafka *というユーザーを作成します。

sudo useradd kafka -m

`+ -m `フラグは、ユーザーのホームディレクトリが作成されることを保証します。 このホームディレクトリ ` / home / kafka +`は、以下のセクションのコマンドを実行するためのワークスペースディレクトリとして機能します。

`+ passwd +`を使用してパスワードを設定します。

sudo passwd kafka

`+ adduser `コマンドを使用して* kafka *ユーザーを ` sudo +`グループに追加し、Kafkaの依存関係をインストールするために必要な権限を付与します。

sudo adduser kafka sudo

これで、* kafka *ユーザーの準備が整いました。 `+ su +`を使用してこのアカウントにログインします。

su -l kafka

Kafka固有のユーザーを作成したので、Kafkaバイナリのダウンロードと抽出に進みます。

ステップ2-Kafkaバイナリのダウンロードと抽出

Kafkaバイナリをダウンロードして、* kafka *ユーザーのホームディレクトリ内の専用フォルダーに抽出しましょう。

開始するには、 `+ Downloads `という名前のディレクトリを ` / home / kafka +`に作成してダウンロードを保存します:

mkdir ~/Downloads

リモートファイルをダウンロードできるように、「+ apt-get 」を使用して「 curl +」をインストールします。

sudo apt-get update && sudo apt-get install -y curl

`+ curl +`がインストールされたら、それを使用してKafkaバイナリをダウンロードします。

curl "https://www.apache.org/dist/kafka//kafka_.tgz" -o ~/Downloads/kafka.tgz

`+ kafka +`というディレクトリを作成し、このディレクトリに移動します。 これは、Kafkaインストールのベースディレクトリになります。

mkdir ~/kafka && cd ~/kafka

`+ tar +`コマンドを使用して、ダウンロードしたアーカイブを解凍します。

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

`-strip 1 +`フラグを指定して、アーカイブのコンテンツが別のディレクトリ( `〜/ kafka / kafka _ / `など)ではなく、 `〜/ kafka / +`自体に抽出されるようにします。それの。

バイナリのダウンロードと抽出が正常に完了したので、トピックの削除を許可するためのKafkaの構成に進むことができます。

ステップ3-Kafkaサーバーの構成

Kafkaのデフォルトの動作では、topic、メッセージを公開できるカテゴリ、グループ、またはフィード名を削除することはできません。 これを変更するには、構成ファイルを編集しましょう。

Kafkaの設定オプションは、「+ server.properties」で指定されます。 このファイルを `+ nano +`またはお気に入りのエディターで開きます。

nano ~/kafka/config/server.properties

Kafkaトピックを削除できる設定を追加しましょう。 ファイルの最後に次を追加します。

〜/ kafka / config / server.properties

delete.topic.enable = true

ファイルを保存し、「+ nano +」を終了します。 Kafkaを構成したので、起動時にsystemdユニットファイルを作成して実行し、有効化することに進みます。

ステップ4-Systemdユニットファイルの作成とKafkaサーバーの起動

このセクションでは、Kafkaサービス用のhttps://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files[systemd unit files]を作成します。 これは、他のLinuxサービスと一貫した方法でKafkaの開始、停止、再起動などの一般的なサービスアクションを実行するのに役立ちます。

ZooKeeperは、Kafkaがクラスターの状態と構成を管理するために使用するサービスです。 通常、多くの分散システムで不可欠なコンポーネントとして使用されます。 詳細については、https://zookeeper.apache.org/doc/current/index.html [ZooKeeper docs]をご覧ください。

`+ 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 +`シェルファイルを使用することを指定します。 また、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 `に依存することを指定します。 これにより、 ` kafka `サービスの開始時に ` zookeeper +`が自動的に開始されます。

`+ [Service] `セクションは、systemdがサービスの開始と停止に ` kafka-server-start.sh `と ` kafka-server-stop.sh +`シェルファイルを使用することを指定します。 また、異常終了した場合にKafkaを自動的に再起動するように指定します。

ユニットが定義されたので、次のコマンドでKafkaを起動します。

sudo systemctl start kafka

サーバーが正常に起動したことを確認するには、 `+ kafka +`ユニットのジャーナルログを確認します。

sudo journalctl -u kafka

次のような出力が表示されます。

OutputMar 23 13:31:48 kafka systemd[1]: Started kafka.service.

これで、ポート `+ 9092 +`でリッスンするKafkaサーバーができました。

`+ kafka `サービスを開始しましたが、サーバーを再起動しても、自動的には開始されません。 サーバーの起動時に ` kafka +`を有効にするには、次を実行します:

sudo systemctl enable kafka

サービスを開始して有効にしたので、インストールを確認しましょう。

ステップ5-インストールのテスト

*「Hello World」*メッセージを公開および使用して、Kafkaサーバーが正しく動作していることを確認しましょう。 Kafkaでメッセージを公開するには、次のものが必要です。

  • producer。レコードおよびデータをトピックに公開できます。

  • トピックからメッセージとデータを読み取る_consumer_。

まず、次のように入力して、「+ TutorialTopic +」という名前のトピックを作成します。

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

`+ kafka-console-producer.sh +`スクリプトを使用して、コマンドラインからプロデューサーを作成できます。 引数として、Kafkaサーバーのホスト名、ポート、トピック名が必要です。

次のように入力して、文字列 `" Hello、World "`を `+ TutorialTopic +`トピックに公開します。

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

次に、 `+ kafka-console-consumer.sh +`スクリプトを使用してKafkaコンシューマーを作成できます。 ZooKeeperサーバーのホスト名とポート、および引数としてのトピック名が必要です。

次のコマンドは、 `+ TutorialTopic `からのメッセージを消費します。 `-from-beginning +`フラグの使用に注意してください。これにより、コンシューマーが開始される前に発行されたメッセージを消費できます。

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

設定に問題がない場合は、ターミナルに「+ Hello、World」と表示されるはずです。

OutputHello, World

スクリプトは引き続き実行され、トピックにさらにメッセージが発行されるのを待ちます。 新しいターミナルを開いてプロデューサーを開始し、さらにいくつかのメッセージを公開してください。 これらすべてを消費者の出力で見ることができるはずです。

テストが終了したら、 `+ CTRL + C +`を押してコンシューマスクリプトを停止します。 インストールのテストが完了したので、KafkaTのインストールに進みましょう。

ステップ6-KafkaTのインストール(オプション)

KafkaTは、Airbnbのツールで、Kafkaクラスターに関する詳細を表示し、コマンドラインから特定の管理タスクを実行しやすくします。 Ruby gemであるため、使用するにはRubyが必要です。 また、依存する他のgemをビルドするには、 `+ build-essential `パッケージも必要です。 ` apt +`を使用してインストールします。

sudo apt install ruby ruby-dev build-essential

gemコマンドを使用して、KafkaTをインストールできるようになりました。

sudo gem install kafkat

KafkaTは、設定ファイルとして「+ .kafkatcfg +」を使用して、Kafkaサーバーのインストールディレクトリとログディレクトリを決定します。 また、KafkaTをZooKeeperインスタンスにポイントするエントリが必要です。

`+ .kafkatcfg +`という新しいファイルを作成します。

nano ~/.kafkatcfg

次の行を追加して、KafkaサーバーとZookeeperインスタンスに関する必要な情報を指定します。

〜/ .kafkatcfg

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

これで、KafkaTを使用する準備が整いました。 まず、すべてのKafkaパーティションに関する詳細を表示する方法を示します。

kafkat partitions

次の出力が表示されます。

OutputTopic                 Partition   Leader      Replicas        ISRs
TutorialTopic         0             0         [0]             [0]
__consumer_offsets    0               0           [0]                           [0]
...
...

クライアント関連情報を保存するためにKafkaが使用する内部トピックである「+ TutorialTopic 」と「 consumer_offsets 」が表示されます。 ` consumer_offsets`で始まる行は安全に無視できます。

KafkaTの詳細については、https://github.com/airbnb/kafkat [GitHub repository]を参照してください。

手順7-マルチノードクラスターのセットアップ(オプション)

さらに多くのDebian 9マシンを使用してマルチブローカークラスターを作成する場合は、新しいマシンのそれぞれでステップ1、ステップ4、およびステップ5を繰り返す必要があります。 さらに、それぞれの `+ server.properties`ファイルで次の変更を行う必要があります。

  • + broker.id +`プロパティの値は、クラスター全体で一意になるように変更する必要があります。 このプロパティは、クラスター内の各サーバーを一意に識別し、値として任意の文字列を使用できます。 たとえば、 `+" server1 "+、 `" server2 "`など。

  • + zookeeper.connect +`プロパティの値は、すべてのノードが同じZooKeeperインスタンスを指すように変更する必要があります。 このプロパティは、ZooKeeperインスタンスのアドレスを指定し、 `+ <HOSTNAME / IP_ADDRESS>:<PORT> +`形式に従います。 たとえば、 `+":2181 "+、 `":2181 "`など。

クラスターに複数のZooKeeperインスタンスが必要な場合、各ノードの `+ zookeeper.connect +`プロパティの値は、すべてのZooKeeperインスタンスのIPアドレスとポート番号をリストした同一のコンマ区切り文字列である必要があります。

ステップ8-Kafkaユーザーの制限

すべてのインストールが完了したので、* kafka *ユーザーの管理者権限を削除できます。 その前に、ログアウトしてから、他の非ルートsudoユーザーとしてログインし直してください。 このチュートリアルを開始したときと同じシェルセッションをまだ実行している場合は、単に「+ exit +」と入力します。

sudoグループから* kafka *ユーザーを削除します。

sudo deluser kafka sudo

Kafkaサーバーのセキュリティをさらに向上させるには、「+ passwd +」コマンドを使用して* kafka *ユーザーのパスワードをロックします。 これにより、このアカウントを使用して誰もサーバーに直接ログインできないようになります。

sudo passwd kafka -l

この時点で、rootまたはsudoユーザーのみが次のコマンドを入力して「+ kafka +」としてログインできます。

sudo su - kafka

将来、ロックを解除する場合は、「+ passwd 」と「 -u +」オプションを使用します。

sudo passwd kafka -u

これで、* kafka *ユーザーの管理者権限が正常に制限されました。

結論

これで、Apache KafkaがDebianサーバーで安全に実行されました。 Kafkaクライアントを使用してKafkaプロデューサーとコンシューマーを作成することで、プロジェクトでそれを利用できます。これはほとんどのプログラミング言語で利用可能です。 Kafkaの詳細については、http://kafka.apache.org/documentation.html [documentation]をご覧ください。