Apache Kafka互換のRedpandaに触れる
この記事はDistributed computing (Apache Spark, Hadoop, Kafka, ...) Advent Calendar 2022および気にはなってるけど触ってないビッグデータ系のツール・サービスを触る Advent Calendar 2022の15日目です。
こんにちは。Redpanda Dataでサポートエンジニアをしている @dice_redpanda です。
Redpandaは2019年創業のRedpanda Dataが開発・提供する分散ストリーミングエンジンです。
C++で開発されたRaftベースの分散ストレージの上にApache Kafka(以下Kafka)互換のAPIを提供するレイヤが組み込まれ、Kafkaの置き換えとして簡単・安全・速いを売りにしています。APIに互換性があるため、基本的には全ての既存のKafkaアプリケーションはRedpandaでも動作します(一部未実装のAPIもあります)。
またRedpanda Dataは、Redpanda本体とは別にGoで実装されたrpk(redpanda keeperの略)というCLIツールも提供しています。本記事では、Redpandaをローカルマシンにデプロイしrpkでクラスタとひととおり対話してみたいと思います。
インストール
オンプレミスにデプロイする場合のインストールオプションは、パッケージ(Linuxのみ)、Docker、あるいはKubernetesとなります。本番環境で運用するユーザーはパッケージかKubernetesでのデプロイとなるでしょう。
Redpandaが管理するクラウドサービスを利用する場合はサインアップが必要です。
MacOSの場合rpkが単体で動作するので、brewでredpandaのインストール後rpk container start -n 3
と実行すればDockerコンテナが起動して3ノードクラスタが立ち上がります。データのレプリケーションだけでなくクラスタの調停も全てRaftに乗っているのでZooKeeperも不要です。
$ brew install redpanda-data/tap/redpanda
$ rpk container start -n 3
Downloading latest version of Redpanda
Starting cluster
Waiting for the cluster to be ready...
NODE ID ADDRESS
0 127.0.0.1:58993
1 127.0.0.1:58986
2 127.0.0.1:58984
Cluster started! You may use rpk to interact with it. E.g:
rpk cluster info --brokers 127.0.0.1:58993,127.0.0.1:58986,127.0.0.1:58984
You may also set an environment variable with the comma-separated list of broker addresses:
export REDPANDA_BROKERS="127.0.0.1:58993,127.0.0.1:58986,127.0.0.1:58984"
rpk cluster info
以上でインストールからのデプロイが完了です。簡単ですね。一応ブローカーの一覧を確認しておきましょう。先頭にアスタリスクがついているブローカーがいわゆるコントローラー(Controller)のリーダーとなります。
$ export REDPANDA_BROKERS="127.0.0.1:58993,127.0.0.1:58986,127.0.0.1:58984"
$ rpk cluster info
CLUSTER
=======
redpanda.98744d6e-294c-4447-b041-d349fd4aa0fe
BROKERS
=======
ID HOST PORT
0* 127.0.0.1 58993
1 127.0.0.1 58986
2 127.0.0.1 58984
参考 https://docs.redpanda.com/docs/platform/quickstart/quick-start-macos/
topicの作成、produce、consumer groupまで
まずは複製3、パーティション数10のtopicを作りましょう。
$ rpk topic create test-topic -r 3 -p 10
topicを作ったら適当にデータをproduceしてみます。
$ rpk topic produce test-topic
hello
Produced to partition 7 at offset 0 with timestamp 1670427011278.
redpanda
Produced to partition 7 at offset 1 with timestamp 1670427018939.
!
Produced to partition 7 at offset 2 with timestamp 1670427020321.
^C
次にconsumeです。-g
オプションを指定すればconsumer groupを使用することもできます。
$ rpk topic consume test-topic -g group1
{
"topic": "test-topic",
"value": "hello",
"timestamp": 1670427011278,
"partition": 7,
"offset": 0
}
{
"topic": "test-topic",
"value": "redpanda",
"timestamp": 1670427018939,
"partition": 7,
"offset": 1
}
{
"topic": "test-topic",
"value": "!",
"timestamp": 1670427020321,
"partition": 7,
"offset": 2
}
^C
クラスタが把握しているconsumer groupの確認はrpk group list
です。特定のconsumer groupをチェックしてラグなどの確認をしたい場合はdescribeコマンドを使いましょう。
$ rpk group describe group1
GROUP group1
COORDINATOR 2
STATE Empty
BALANCER
MEMBERS 0
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG MEMBER-ID CLIENT-ID HOST
test-topic 0 - 0 -
test-topic 1 - 0 -
test-topic 2 - 0 -
test-topic 3 - 0 -
test-topic 4 - 0 -
test-topic 5 - 0 -
test-topic 6 - 0 -
test-topic 7 3 3 0
test-topic 8 - 0 -
test-topic 9 - 0 -
特定の範囲のオフセットだけconsumeしたい場合は-o
を(時刻指定も可)、出力のフォーマットを制御したい場合は-f
により細かく指定することができます。以下の例では、オフセット範囲が0以上2未満
のレコードを値
のみ取得するコマンドです。
$ rpk topic consume test-topic -o 0:2 -f '%v\n'
hello
redpanda
クラスタ管理関連
これまでのコマンドはRedpandaが提供するKafkaのAPIを叩くものでしたが、Redpandaは別途クラスタ管理タスク用のAPIを用意しています。以下の例では管理用APIを使って確認できることを見てみましょう。
バージョン確認
$ docker exec -ti 0f rpk redpanda admin brokers list
NODE-ID NUM-CORES MEMBERSHIP-STATUS IS-ALIVE BROKER-VERSION
0 2 active true v22.3.4 - 5be3e8e1454ab75da3f27f571c09e625570bebb2-dirty
1 2 active true v22.3.4 - 5be3e8e1454ab75da3f27f571c09e625570bebb2-dirty
2 2 active true v22.3.4 - 5be3e8e1454ab75da3f27f571c09e625570bebb2-dirty
設定変更
Redpandaでは多くのプロパティが再起動不要で変更できます。rpk cluster config edit
を実行するとkubectl edit
と同じようにvimでインタラクティブにクラスタの設定を変更できます。内容を保存して終了すれば反映完了です。
$ docker exec -ti 0f rpk cluster config edit
PROPERTY PRIOR NEW
default_topic_partitions 1 20
Successfully updated configuration. New configuration version is 3.
設定が変更されていることを確認しましょう。
$ docker exec -ti 0f rpk cluster config get default_topic_partitions
20
再起動が必要かどうかもチェックします。
$ docker exec -ti 0f rpk cluster config status
NODE CONFIG-VERSION NEEDS-RESTART INVALID UNKNOWN
0 4 false [] []
1 4 false [] []
2 4 false [] []
最後に
以上、Kafka互換のプロトコルを提供するRedpandaで、ローカルマシンでのデプロイからrpkを使ったクラスタの管理が簡単にできることを紹介しました。興味があればあなたのKafkaクライアントもRedpandaで試してみてください。また、利用可能なrpkコマンドについては公式ドキュメントも参考にしてください。
Discussion