📑

Apache Kafka互換のRedpandaに触れる

2022/12/16に公開

この記事はDistributed computing (Apache Spark, Hadoop, Kafka, ...) Advent Calendar 2022および気にはなってるけど触ってないビッグデータ系のツール・サービスを触る Advent Calendar 2022の15日目です。


こんにちは。Redpanda Dataでサポートエンジニアをしている @dice_redpanda です。

Redpandaは2019年創業のRedpanda Dataが開発・提供する分散ストリーミングエンジンです。

https://redpanda.com/

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が管理するクラウドサービスを利用する場合はサインアップが必要です。

https://redpanda.com/deployment-options

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コマンドについては公式ドキュメントも参考にしてください。

https://docs.redpanda.com/docs/platform/reference/rpk/

Discussion