Kafka 互換の高効率なデータストリーミングプラットフォーム Redpanda
はじめに
#Redpanda は Kafka 互換のイベントストリーミングプラットフォームです。
Redpanda | The streaming data platform for developers
ロゴは Red Panda(レッサーパンダ)になっています。
JVM で動作する Kafka と異なり C++ で書かれており[1]、シングルバイナリで実行可能です。ZooKeeper のようなリソース管理サービスなどにも依存しません。
Kafka に比べて6倍のコスト効率が謳われています。
Redpanda vs. Apache Kafka: A Total Cost of Ownership comparison
セルフホストでもクラウドサービスでも利用できます。
メニーコア CPU 時代に対応したアーキテクチャを実現しています。
Thread-per-core buffer management for a modern Kafka-API storage system
Kafka との互換性
#Kafka の 0.11 - 3.1 との互換性があります。メジャーな Kafka Client は互換性が検証されています。
- Apache Kafka Java Client(Java)
- librdkafka (C/C++)
- franz-go (Go)
- kafka-python (Python)
- KafkaJS (Node.js)
- kafka-rust (Rust)
Kafka のいくつかの機能はサポートされていません。詳しくは以下のドキュメントを参照してください。
Node.js 用の Kafka Client KafkaJS については以下の記事で紹介しています。
ローカル環境構築
#docker compose で簡単に試すことができます。公式ドキュメントからシングルノードのクラスターを構築する YAML をコピーして compose.yml ファイルとして保存します。
compose.yml を保存したディレクトリで起動します。
docker compose up -d
Redpanda クラスターと console(Web アプリ) の2つのコンテナが起動します。
[+] Running 14/14
✔ console 7 layers [⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 16.5s
✔ edb6bdbacee9 Pull complete 1.3s
✔ 7f1fcdde94d6 Pull complete 1.0s
✔ 14ee393e44da Pull complete 1.2s
✔ 4912f5d8102b Pull complete 10.6s
✔ 3435b9b0f2e8 Pull complete 3.8s
✔ 5793ecade4d8 Pull complete 2.6s
✔ 4fa930a9b4e0 Pull complete 4.0s
✔ redpanda-0 5 layers [⣿⣿⣿⣿⣿] 0B/0B Pulled 24.5s
✔ 4ee097f9a366 Pull complete 9.3s
✔ dbd5afc41ce1 Pull complete 7.7s
✔ 3559f853e5db Pull complete 8.9s
✔ be25f6d46e45 Pull complete 14.9s
✔ 6420bec47ce0 Pull complete 18.5s
[+] Running 4/4
✔ Network redpanda-quickstart_redpanda_network Created 0.0s
✔ Volume "redpanda-quickstart_redpanda-0" Created 0.0s
✔ Container redpanda-0 Started 0.1s
✔ Container redpanda-console Started 0.0s
Redpanda クラスターの管理には管理コンソール以外に rpk という CLI が提供されています。以下の用途があります。
- クラスターの管理
- トピックの管理、トピックへの送信、トピックからの受信
- ホストのデバッグとチューニング
- Redpand クラウドとのやりとり
記事では Redpanda のコンテナにインストールされている rpk を docker exec で使用しています。rpk をホストマシンにインストールしておけば、直接実行できます。macOS の場合 Homebrew でインストールできます。
brew install redpanda-data/tap/redpanda
rpk の動作確認をしておきます。
$ rpk version
v23.2.11 (rev f170affee)
試運転
#Redpanda のクラスター情報を表示します。Broker が1台で、初期状態ではシステム用のトピックが存在するだけです。
$ docker exec -it redpanda-0 rpk cluster info
CLUSTER
=======
redpanda.34a62130-8a81-4d2e-8c18-20e857618759
BROKERS
=======
ID HOST PORT
0* redpanda-0 9092
TOPICS
======
NAME PARTITIONS REPLICAS
_schemas 1 1
トピックを作成。create サブコマンドを使用します。
$ docker exec -it redpanda-0 rpk topic create chat-room
TOPIC STATUS
chat-room OK
トピックにメッセージを送信。produce サブコマンドを使用します。
docker exec -it redpanda-0 rpk topic produce chat-room
以下のようにメッセージを入力します。
Pandas are fabulous!
トピックにメッセージが送信されます。
Produced to partition 0 at offset 0 with timestamp 1663282629789.
送信されたメッセージを受信します。consume サブコマンドを使用します。
docker exec -it redpanda-0 rpk topic consume chat-room --num 1
メッセージがメタデータと共に受信されました。
{
"topic": "chat-room",
"value": "Pandas are fabulous!",
"timestamp": 1695168283296,
"partition": 0,
"offset": 0
}
コンソール画面
#Kafka には公式のコンソール画面はありません[2]が Redpanda には付属しています。
docker compose で起動した状態で http://127.0.0.1:8080/overview
に接続すると Web UI でクラスターの情報を見ることができます。
Topics タブでトピック一覧が表示されます。
Kafka では kafka-ui というサードパーティ製の Web UI が開発されています。以下の記事で紹介しています。
Kafka Client からアクセス
#Kafka Client からの接続を試してみます。kafka-console-consumer を使います。Redpanda の docker compose では Redpanda クラスターの外部ポートは19092に設定されていますので、bootstrap-server オプションにこのポートを指定して chat-room トピックからメッセージを取得します。
$ kafka-console-consumer --bootstrap-server 127.0.0.1:19092 --topic chat-room --from-beginning
Pandas are fabulous!
無事に取得できました。
Kafka に対する優位性
#Redpanda のシングルバイナリによる利点は以下のブログ記事で解説されています。
Exploring the benefits of single-binary architecture
Kafka はブローカー、スキーマレジストリ、ZooKeeper などのサービスを個別にデプロイする必要があります。Redpanda はこれらの機能が1つのバイナリになっています。そのため以下のような利点があります。
- デプロイの簡素化: Kafka では相互依存する複数のサービスの開始・停止など複雑で非効率なプロセスが必要
- 管理の簡素化
- エッジ/IoT への展開: フットプリントが小さいことでランタイム環境の範囲が広がる
- CI/CD での高速な起動・シャットダウン
- 障害からの回復力の向上
最後に
#以上、シングルバイナリによるストリーミングプラットフォーム Redpanda の紹介でした。ドキュメントやブログでアーキテクチャについて詳細に記述されており開発者の熱量を感じます。コンテナ、IoT、エッジコンピューティングに Kafka プロトコルが広がっていくのは未来を感じます。