前書き
Apache Kafkaは、大量のリアルタイムデータを効率的に処理するように設計された一般的な分散メッセージブローカーです。 Kafkaクラスターは、非常にスケーラブルでフォールトトレラントであるだけでなく、ActiveMQやRabbitMQなどの他のメッセージブローカーと比較してはるかに高いスループットも備えています。 一般にpub / subメッセージングシステムとして使用されますが、多くの組織は、公開されたメッセージの永続的なストレージを提供するため、ログの集計にも使用します。
このチュートリアルでは、Ubuntu 14.04にApache Kafka 0.8.2.1をインストールして使用する方法を学習します。
前提条件
従うには、次のものが必要です。
-
Ubuntu 14.04ドロップレット
-
少なくとも4GBのswap space
[[step-1 -—- create-a-user-for-kafka]] ==ステップ1—Kafkaのユーザーを作成します
Kafkaはネットワーク経由でリクエストを処理できるため、専用のユーザーを作成する必要があります。 これにより、Kafkaサーバーを構成する場合のUbuntuマシンへの損傷が最小限に抑えられます。
[.note]#Note: Apache Kafkaを設定した後、このサーバーで他のタスクを実行するために、root以外の別のユーザーを作成することをお勧めします。
#
rootとして、useradd
コマンドを使用してkafkaというユーザーを作成します。
useradd kafka -m
passwd
を使用してパスワードを設定します。
passwd kafka
これをsudo
グループに追加して、Kafkaの依存関係をインストールするために必要な権限を付与します。 これは、adduser
コマンドを使用して実行できます。
adduser kafka sudo
これで、Kafkaユーザーの準備が整いました。 su
を使用してログインします。
su - kafka
[[step-2 -—- install-java]] ==ステップ2—Javaをインストールします
追加のパッケージをインストールする前に、利用可能なパッケージのリストを更新して、リポジトリで利用可能な最新バージョンをインストールします。
sudo apt-get update
Apache KafkaにはJavaランタイム環境が必要なため、apt-get
を使用してdefault-jre
パッケージをインストールします。
sudo apt-get install default-jre
[[step-3 -—- install-zookeeper]] ==ステップ3—ZooKeeperをインストールします
Apache ZooKeeperは、分散システムに属するノードの構成情報を調整および同期するために構築されたオープンソースサービスです。 Kafkaクラスターは、ZooKeeperに依存して、特に障害ノードの検出やリーダーの選出などの操作を実行します。
ZooKeeperパッケージはUbuntuのデフォルトのリポジトリで利用できるため、apt-get
を使用してインストールします。
sudo apt-get install zookeeperd
インストールが完了すると、ZooKeeperはデーモンとして自動的に開始されます。 デフォルトでは、ポート2181でリッスンします。
動作していることを確認するには、Telnet経由で接続します。
telnet localhost 2181
Telnetプロンプトで、ruok
と入力し、ENTER
を押します。
すべて問題がなければ、ZooKeeperはimok
と言って、Telnetセッションを終了します。
[[step-4 -—- download-and-extract-kafka-binaries]] ==ステップ4—Kafkaバイナリをダウンロードして抽出する
JavaとZooKeeperがインストールされたので、Kafkaをダウンロードして抽出します。
まず、Downloads
というディレクトリを作成して、すべてのダウンロードを保存します。
mkdir -p ~/Downloads
wget
を使用して、Kafkaバイナリをダウンロードします。
wget "http://mirror.cc.columbia.edu/pub/software/apache/kafka/0.8.2.1/kafka_2.11-0.8.2.1.tgz" -O ~/Downloads/kafka.tgz
kafka
というディレクトリを作成し、このディレクトリに移動します。 これは、Kafkaインストールのベースディレクトリになります。
mkdir -p ~/kafka && cd ~/kafka
tar
コマンドを使用してダウンロードしたアーカイブを抽出します。
tar -xvzf ~/Downloads/kafka.tgz --strip 1
[[step-5 -—- configure-the-kafka-server]] ==ステップ5—Kafkaサーバーを構成します
次のステップは、Kafkaサーバーを構成することです。
vi
を使用してserver.properties
を開きます。
vi ~/kafka/config/server.properties
デフォルトでは、Kafkaではトピックを削除できません。 トピックを削除できるようにするには、ファイルの最後に次の行を追加します。
~/kafka/config/server.properties
delete.topic.enable = true
ファイルを保存し、vi
を終了します。
[[step-6 -—- start-the-kafka-server]] ==ステップ6—Kafkaサーバーを起動します
nohup
を使用してkafka-server-start.sh
スクリプトを実行し、シェルセッションから独立したバックグラウンドプロセスとしてKafkaサーバー(Kafkaブローカーとも呼ばれます)を起動します。
nohup ~/kafka/bin/kafka-server-start.sh ~/kafka/config/server.properties > ~/kafka/kafka.log 2>&1 &
開始するまで数秒待ちます。 ~/kafka/kafka.log
に次のメッセージが表示されたら、サーバーが正常に起動したことを確認できます。
〜/ kafka / kafka.logからの抜粋
...
[2015-07-29 06:02:41,736] INFO New leader is 0 (kafka.server.ZookeeperLeaderElector$LeaderChangeListener)
[2015-07-29 06:02:41,776] INFO [Kafka Server 0], started (kafka.server.KafkaServer)
これで、ポート9092でリッスンしているKafkaサーバーができました。
[[step-7 -—- test-the-installation]] ==ステップ7—インストールをテストします
ここで、“Hello World”メッセージを公開して消費し、Kafkaサーバーが正しく動作していることを確認しましょう。
メッセージを公開するには、Kafkaプロデューサーを作成する必要があります。 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は自動的に作成します。
メッセージを消費するには、kafka-console-consumer.sh
スクリプトを使用してKafkaコンシューマーを作成できます。 引数としてトピック名とともに、ZooKeeperサーバーのホスト名とポートが必要です。
次のコマンドは、発行したトピックからのメッセージを消費します。 --from-beginning
フラグの使用に注意してください。これは、コンシューマーが開始される前に公開されたメッセージを消費するために存在します。
~/kafka/bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic TutorialTopic --from-beginning
構成の問題がない場合は、出力にHello, World
が表示されるはずです。
スクリプトは引き続き実行され、トピックにさらにメッセージが発行されるのを待ちます。 新しいターミナルを開いてプロデューサーを開始し、さらにいくつかのメッセージを公開してください。 これらはすべて、消費者の出力ですぐに見ることができるはずです。
テストが完了したら、CTRL + Cを押してコンシューマスクリプトを停止します。
[[step-8 -—- install-kafkat-optional]] ==ステップ8— KafkaTをインストールします(オプション)
KafkaTは、Airbnbの便利な小さなツールです。これにより、Kafkaクラスターに関する詳細を表示し、コマンドラインからいくつかの管理タスクを実行しやすくなります。 Ruby gemであるため、使用するにはRubyが必要です。 また、依存する他のgemをビルドできるようにするには、build-essential
パッケージが必要になります。 apt-get
を使用してそれらをインストールします。
sudo apt-get install ruby ruby-dev build-essential
これで、gem
コマンドを使用してKafkaTをインストールできます。
sudo gem install kafkat --source https://rubygems.org --no-ri --no-rdoc
vi
を使用して、.kafkatcfg
という名前の新しいファイルを作成します。
vi ~/.kafkatcfg
これは、KafkaTがKafkaサーバーのインストールおよびログディレクトリを決定するために使用する構成ファイルです。 また、KafkaTがZooKeeperインスタンスを指すようにする必要があります。 したがって、次の行を追加します。
~/.kafkatcfg
{
"kafka_path": "~/kafka",
"log_path": "/tmp/kafka-logs",
"zk_path": "localhost:2181"
}
これで、KafkaTを使用する準備が整いました。 まずは、すべてのKafkaパーティションに関する詳細を表示するために使用する方法を次に示します。
kafkat partitions
次のような出力が表示されるはずです。
kafkatパーティションの出力
Topic Partition Leader Replicas ISRs
TutorialTopic 0 0 [0] [0]
KafkaTの詳細については、そのGitHub repositoryを参照してください。
[[step-9 -—- set-up-a-multi-node-cluster-optional]] ==ステップ9—マルチノードクラスターのセットアップ(オプション)
より多くのUbuntu 14.04マシンを使用してマルチブローカークラスターを作成する場合は、新しいマシンのそれぞれでステップ1、ステップ3、ステップ4、ステップ5を繰り返す必要があります。 さらに、それぞれのserver.properties
ファイルに次の変更を加える必要があります。
-
broker.id
プロパティの値は、クラスター全体で一意になるように変更する必要があります -
zookeeper.connect
プロパティの値は、すべてのノードが同じZooKeeperインスタンスを指すように変更する必要があります
クラスタに複数のZooKeeperインスタンスが必要な場合、各ノードのzookeeper.connect
プロパティの値は、すべてのZooKeeperインスタンスのIPアドレスとポート番号をリストする同一のコンマ区切りの文字列である必要があります。
[[step-10 -—- restrict-the-kafka-user]] ==ステップ10—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
結論
これで、Ubuntuサーバーで実行されている安全なApache Kafkaができました。 ほとんどのプログラミング言語で使用可能なKafka clientsを使用して、Kafkaのプロデューサーとコンシューマーを作成することにより、プロジェクトで簡単に利用できます。 Kafkaの詳細については、そのdocumentationを確認してください。