RSS2.0

Kafka Manager を構築してみたら Kafka 2.0.0 は対応していなかったお話

Kafka でクラスター中のノード(Broker)やパーティション、トピックを WEB ベースで管理するためのツールとして、Kafka Manager というものがあるそうです。
公式ページである Github リポジトリには、README.md 中に実際の WEB の UI が載っていました。表示されている情報としては、Kafka にバンドルされている kafka-topics.sh や kafka-consumer-groups.sh 等から取れるもののようですが、統計的に可視化されていたり、更新処理までできるようです。

Kafka Manager を構築する

公式ページからはバイナリや rpm パッケージ等は配布されていないようなので、自分でビルドしていきます。
まずは Github からソースコードを clone しておきましょう。
$ git clone git@github.com:yahoo/kafka-manager.git
ブランチは特に何も考えずに master を使うことにします。

ソースコードを取得したら、ビルドツールの sbt からビルドすることができます。
$ ./sbt clean dist
ビルドすると target/universal/ ディレクトリ配下に kafka-manager-1.3.3.21.zip ができあがります。これが Kafka Manager の実行バイナリを固めた zip ファイルです。

これを展開すると、bin ディレクトリ下に kafka-manager という実行バイナリがあります。これを使うと Kafka Manager が起動します。
$ bin/kafka-manager -Dkafka-manager.zkhosts=localhost:2181 -Dhttp.port=8080
システムプロパティ kafka-manager.zkhosts には Kafka の Zookeeper のホストを指定します。今回は localhsot で Kafka クラスターが動いているという前提で、同じマシンの Zookeeper を指定しました。 http.port 値は Kafka Manager 自体の待受ポートです。8080 ポートを指定しているので、http://localhost:8080 にアクセスすれば Kafka Manager を使うことができます。
続きを読む Kafka  コメント (0)  2018/10/05 19:54:32

Java から Kafka の Producer を利用してみる

前回 Java で Kafka の Consumer を試してみましたが、今回は Producer を実装してみました。
Consumer 側はパーティション分割された Topic からのメッセージの受け取りでだいぶ詰まっていたのですが、Producer 側はクラスター構成に対してもすんなりと動かせました。実装コードは接続先の Kafka ブローカーの設定値を書き換えるくらいで、同じコードが動いてくれました。

利用したのは前回と同じく Kafka の Java クライアント、kafka-clients です。
dependencies {
...
  compile group: 'org.apache.kafka', name: 'kafka-clients', version: '2.0.0'
...
}
Gradle を使う場合、build.gradle に追加する依存性は前回と同じです。Maven の場合はこの辺りを参考にしてください。

単一ノード構成で Producer を利用する

Producer のサンプルコードは以下の通りです。接続設定をして、Producer のインスタンスを作って、メッセージを送るだけというとてもシンプルな内容になりました。

続きを読む Kafka  コメント (0)  2018/10/03 19:20:04

Java から Kafka の Consumer を利用してみる

分散メッセージングシステムである Kafka を Java から利用してみました。手始めに今回は Consumer を使い、メッセージの受け取りを試してみることにします。

公式ドキュメントに記載せれている通り、Kafka には Java から接続するためのクライアントライブラリがあります。Maven Central Repository にも公開されているので、Maven や Gradle からすぐに利用することができます。
今回は実際にこの kafka-clients ライブラリを使って接続してみたのですが、単一ノード構成では問題ないものの、複数ノードでのクラスター構成への接続が一部意図通りに動作してくれませんでした。記事の内容としてはすっきり終わらないものの、現時点でのノウハウとして書いておこうと思います。

kafka-clients をプロジェクトの依存性に追加する

プロジェクト管理には Gradle 4.8.1 を使ってみます。プロジェクトを作ったら、build.gradle に以下の依存性を追加します。
dependencies {
...
  compile group: 'org.apache.kafka', name: 'kafka-clients', version: '2.0.0'
...
}
kafka-clients の現在の最新バージョンは 2.0.0 です。
続きを読む Kafka  コメント (0)  2018/10/02 19:47:35

Kafka 複数台でクラスターを組んでみる

kafka_quickstart.png
前回シングルノードでの Kafka 構築を試してみたわけですが、今回は引き続き Kafka 公式ページの Quick Start に従って、Kafka(Broker)複数台でのクラスター構築を試してみたいと思います。

Kafka の Broker が持つデータは Topic 毎にパーティションという単位で分割することができ、そのパーティションを別々の Broker (のプロセスやサーバー)に割り当てたり、コピーを置いておいたりすることで、データ分散による性能改善や冗長化を実現することができます。パーティション内のデータを参照するためのインデックスもパーティション単位で作られるようなので、複数のパーティションにわけておくことで、参照性能をあげられる仕組みになっているようです。分割や複製されたパーティションの管理は Kafka が自動で行ってくれるとのことなので、今回は障害時のフェールオーバーまで試してみたいと思います。

Kafka クラスターを構築する

Broker 2 つで Kafka クラスターを構築してみます。今回は 1 つのマシン内に各 Broker を別プロセスとして用意しようと思います。実際の運用では、サーバーを複数台用意して各マシンで 1 プロセスずつ動かすことになると思いますが、どのマシンで作業するかが変わるだけでやることは同じです。

前提として、Kafka のインストールまでは終わっているものとします。
Broker 毎の設定ファイルとして、server.properties をコピーして server-1.properties と server-2.properties を用意します。
# server-1.properties

# Kafka サーバー(Broker)の ID 値
broker.id=1
# Kafka サーバー(Broker)への接続 URI
listeners=PLAINTEXT://localhost:9093
# Kafka サーバー(Broker)の Zookeeper のホスト/ポート
zookeeper.connect=localhost:2181
# Kafka サーバー(Broker)のデータ保存ディレクトリ
log.dirs=/tmp/kafka-logs-1
# server-2.properties

# Kafka サーバー(Broker)の ID 値
broker.id=2
# Kafka サーバー(Broker)への接続 URI
listeners=PLAINTEXT://localhost:9094
# Kafka サーバー(Broker)の Zookeeper のホスト/ポート
zookeeper.connect=localhost:2181
# Kafka サーバー(Broker)のデータ保存ディレクトリ
log.dirs=/tmp/kafka-logs-2
broker.id 値は Broker 毎にユニークである必要があるため、別々の値を設定しています。1 と 2 です。
listeners 値については、今回は同じマシン内の別プロセスとして動かすので、異なるポート番号を指定しました。複数サーバーを用意して 1 サーバー 1 プロセスで動かす構成なら、ポートは同じでもいいと思います。また、ホスト名は localhost からの接続しか試さないので localhost にしていますが、複数サーバーでクラスターを組む場合は localhost 以外から触ることになるでしょうから、各サーバーのホスト名を書くことになると思います。
zookeeper.connect 値も、今回は同じマシン内で動いている Zookeeper を使うので localhost:2181 としていますが、複数サーバー構成でクラスターを組む場合には、Zookeeper の動いているサーバーのホスト名/ポート番号を設定することになるでしょう。
log.dirs 値は、Broker のデータの保存先ディレクトリです。今回は同じマシンで複数プロセスの Broker が動くので、異なるディレクトリを設定しました。複数サーバーを用意して 1 サーバー 1 プロセスで動かす構成なら、同じパスでもいいと思います。
続きを読む Kafka  コメント (0)  2018/08/27 15:12:18

Kafka を試してみる

kafka_quickstart.png
Kafka は分散メッセージングシステムです。メッセージを送る Producer、メッセージをためておく Broker、メッセージを受け取る Consumer という構成をとる RabbitMQ や ActiveMQ のようなメッセージングシステムですが、複数のサーバーインスタンスによる分散構成をとれる点も特徴で、特に大量のメッセージを扱うための速度性能、スケーラビリティ、耐障害性などに特化していると言われています。

今回は公式ページのクイックスタートを参考に、Kafka サーバーの構築とメッセージングについて試してみました。

Kafka をインストールする

まず前提として、Java が使えるようインストールしておきます。
java コマンドを叩いて動いていれば大丈夫です。
$ java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

Kafka 公式ページからリンクされているダウンロードページから、Kafka の最新版をダウンロードします。
$ wget http://ftp.riken.jp/net/apache/kafka/2.0.0/kafka_2.11-2.0.0.tgz

ダウンロードしたら、アーカイブを展開して適当なディレクトリに置いておきます。
$ tar xvfz kafka_2.11-2.0.0.tgz
# mv kafka_2.11-2.0.0 /usr/local/
# ln -s /usr/local/kafka_2.11-2.0.0 /usr/local/kafka

続きを読む Kafka  コメント (0)  2018/08/16 20:03:53
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2018, 12>>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345