著者は、Write for DOnationsプログラムの一部として寄付を受け取るためにFree and Open Source Fundを選択しました。
前書き
Apache Kafkaは、大量のリアルタイムデータを効率的に処理するように設計された人気のある分散メッセージブローカーです。 Kafkaクラスターは、拡張性とフォールトトレラント性が高いだけでなく、ActiveMQやRabbitMQなどの他のメッセージブローカーと比較してはるかに高いスループットを備えています。 一般にpublish/subscribeメッセージングシステムとして使用されますが、公開されたメッセージの永続的なストレージを提供するため、多くの組織がログの集約にも使用しています。
パブリッシュ/サブスクライブメッセージングシステムにより、1人または複数のプロデューサーが、コンシューマの数やメッセージの処理方法を考慮せずにメッセージをパブリッシュできます。 登録されたクライアントには、更新および新しいメッセージの作成が自動的に通知されます。 このシステムは、クライアントが定期的にポーリングして新しいメッセージが利用可能かどうかを判断するシステムよりも効率的でスケーラブルです。
このチュートリアルでは、Ubuntu 18.04にApache Kafka 2.1.1をインストールして使用します。
前提条件
従うには、次のものが必要です。
-
1つのUbuntu 18.04サーバーと、sudo特権を持つ非rootユーザー。 root以外のユーザーを設定していない場合は、このguideで指定されている手順に従ってください。
-
サーバー上に少なくとも4GBのRAM。 この量のRAMを使用せずにインストールすると、Kafkaサービスが失敗し、起動時にJava virtual machine (JVM)が「メモリ不足」例外をスローする可能性があります。
-
OpenJDK8がサーバーにインストールされています。 このバージョンをインストールするには、OpenJDKの特定のバージョンをインストールする際にthese instructionsに従ってください。 KafkaはJavaで記述されているため、JVMが必要です。ただし、その起動シェルスクリプトにはバージョン検出のバグがあり、8以上のJVMバージョンでは起動に失敗します。
[[step-1 -—- creating-a-user-for-kafka]] ==ステップ1—Kafkaのユーザーを作成する
Kafkaはネットワーク経由でリクエストを処理できるため、専用のユーザーを作成する必要があります。 これにより、Kafkaサーバーが侵害された場合のUbuntuマシンへの損傷が最小限に抑えられます。 このステップでは専用のkafkaユーザーを作成しますが、Kafkaのセットアップが完了したら、このサーバーで他のタスクを実行するために別の非rootユーザーを作成する必要があります。
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バイナリのダウンロードと抽出に進みます。
[[step-2 -—- downloading-and-extracting-the-kafka-binaries]] ==ステップ2—Kafkaバイナリのダウンロードと抽出
Kafkaバイナリをダウンロードして、kafkaユーザーのホームディレクトリの専用フォルダに抽出しましょう。
まず、ダウンロードを保存するためのDownloads
というディレクトリを/home/kafka
に作成します。
mkdir ~/Downloads
curl
を使用して、Kafkaバイナリをダウンロードします。
curl "https://www.apache.org/dist/kafka/2.1.1/kafka_2.11-2.1.1.tgz" -o ~/Downloads/kafka.tgz
kafka
というディレクトリを作成し、このディレクトリに移動します。 これは、Kafkaインストールのベースディレクトリになります。
mkdir ~/kafka && cd ~/kafka
tar
コマンドを使用してダウンロードしたアーカイブを抽出します。
tar -xvzf ~/Downloads/kafka.tgz --strip 1
--strip 1
フラグを指定して、アーカイブの内容が~/kafka/
自体に抽出され、アーカイブ内の別のディレクトリ(~/kafka/kafka_2.11-2.1.1/
など)には抽出されないようにします。
バイナリのダウンロードと抽出が正常に完了したので、トピックの削除を許可するための設定をKafkaに進めます。
[[step-3 -—- configuring-the-kafka-server]] ==ステップ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ユニットファイルを作成して実行し、有効化することに進みます。
[[step-4 -—- creating-systemd-unit-files-and-starting-the-kafka-server]] ==ステップ4—Systemdユニットファイルの作成とKafkaサーバーの起動
このセクションでは、Kafkaサービスのsystemd unit filesを作成します。 これは、他のLinuxサービスと一貫した方法でKafkaの開始、停止、再起動などの一般的なサービスアクションを実行するのに役立ちます。
Zookeeperは、Kafkaがクラスターの状態と構成を管理するために使用するサービスです。 通常、多くの分散システムで不可欠なコンポーネントとして使用されます。 詳細については、公式の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
次のような出力が表示されます。
OutputJul 17 18:38:59 kafka-ubuntu systemd[1]: Started kafka.service.
これで、ポート9092
でリッスンしているKafkaサーバーができました。
kafka
サービスを開始しているときに、サーバーを再起動した場合、サーバーは自動的に開始されません。 サーバーの起動時にkafka
を有効にするには、次のコマンドを実行します。
sudo systemctl enable kafka
サービスを開始して有効にしたので、インストールを確認しましょう。
[[step-5 -—- testing-the-installation]] ==ステップ5—インストールのテスト
Kafkaサーバーが正しく動作していることを確認するために、“Hello World”メッセージを公開して消費しましょう。 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のインストールに進みましょう。
[[step-6 -—- install-kafkat-optional]] ==ステップ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]
...
...
TutorialTopic
と、クライアント関連情報を格納するためにKafkaが使用する内部トピックである__consumer_offsets
が表示されます。 __consumer_offsets
で始まる行は無視してかまいません。
KafkaTの詳細については、そのGitHub repositoryを参照してください。
[[step-7 -—- setting-up-a-multi-node-cluster-optional]] ==ステップ7—マルチノードクラスターのセットアップ(オプション)
より多くのUbuntu 18.04マシンを使用してマルチブローカークラスターを作成する場合は、新しい各マシンでステップ1、ステップ4、およびステップ5を繰り返す必要があります。 さらに、それぞれのserver.properties
ファイルに次の変更を加える必要があります。
-
broker.id
プロパティの値は、クラスター全体で一意になるように変更する必要があります。 このプロパティは、クラスター内の各サーバーを一意に識別し、値として任意の文字列を使用できます。 たとえば、"server1"
、"server2"
などです。 -
zookeeper.connect
プロパティの値は、すべてのノードが同じZooKeeperインスタンスを指すように変更する必要があります。 このプロパティは、Zookeeperインスタンスのアドレスを指定し、<HOSTNAME/IP_ADDRESS>:<PORT>
形式に従います。 たとえば、"203.0.113.0:2181"
、"203.0.113.1:2181"
などです。
クラスタに複数のZooKeeperインスタンスが必要な場合、各ノードのzookeeper.connect
プロパティの値は、すべてのZooKeeperインスタンスのIPアドレスとポート番号をリストする同一のコンマ区切りの文字列である必要があります。
[[step-8 -—- restricting-the-kafka-user]] ==ステップ8—Kafkaユーザーを制限する
すべてのインストールが完了したので、kafkaユーザーの管理者権限を削除できます。 その前に、ログアウトしてから、他の非ルートsudoユーザーとしてログインし直してください。 このチュートリアルを開始したのと同じシェルセッションをまだ実行している場合は、単にexit
と入力します。
kafkaユーザーをsudoグループから削除します。
sudo deluser kafka sudo
Kafkaサーバーのセキュリティをさらに向上させるには、passwd
コマンドを使用してkafkaユーザーのパスワードをロックします。 これにより、このアカウントを使用して誰もサーバーに直接ログインできなくなります。
sudo passwd kafka -l
この時点で、rootまたはsudoユーザーのみが次のコマンドを入力してkafka
としてログインできます。
sudo su - kafka
将来、ロックを解除する場合は、-u
オプションを指定してpasswd
を使用します。
sudo passwd kafka -u
これで、kafkaユーザーの管理者権限が正常に制限されました。
結論
これで、Apache KafkaがUbuntuサーバーで安全に実行されました。 ほとんどのプログラミング言語で使用可能なKafka clientsを使用して、Kafkaプロデューサーとコンシューマーを作成することにより、プロジェクトでそれを利用できます。 Kafkaの詳細については、そのdocumentationを参照することもできます。