v1.9 は12 本の新しいシナリオを追加します。dr モジュールにさらに 10 本、新しい tiered-storage モジュールに 2 本です。これで Kafka Simulator のカリキュラムは 134 本中 112 本に到達します。あわせて、シミュレータが当初から頼ってきたもの、つまりリンクのフォーマットも公開します。
v1.9 の内容
さらなるディザスタリカバリ(dr、10 本)。 v1.8 が MirrorMaker 2 で提起した問題に対する、プラットフォームとしての 2 つの答えです。
- Multi-Region Cluster のオブザーバー - ISR に加わらずにログを追うレプリカなので、リモートコピーを持っても書き込みパスのコストはゼロです。どれだけ遅れるのか、どこに置くのか、どのように昇格するのか。昇格に必要なリーダーにもう到達できないケースも含めて扱います。
- Cluster Linking - オフセットを保つバイト単位のミラーなので、フェイルオーバーしたコンシューマーにオフセット変換は不要です。ミラートピックは昇格されるまで読み取り専用のままです。コミット済みのコンシューマーオフセットはリンク越しにそのまま同期され、リンクはその場で向きを反転してきれいにフェイルバックできます。さらに 1 本のシナリオでは、同じトポロジー上で MirrorMaker 2 と並べて動かします。フリープレイにも対応する操作が加わります。2 リージョンのトポロジーで使えるリージョンとミラーリンクのエディターで、各リンクは MirrorMaker 2 にも Cluster Linking にもでき、向きを反転させることもできます。
階層ストレージ(tiered-storage、2 本)。 古いセグメントをオブジェクトストレージへオフロードします。オフロード、読み戻し、期限切れまでのライフサイクル全体を、localStartOffset と logStartOffset が離れていく様子とともに追います。そして無期限のリテンションでは、古くなったセグメントがローカルディスクを離れても、遅れているコンシューマーはそれらを 1 つ残らず読み戻します。
すべてのセッションがリンクになる
プレイグラウンドは状態のすべてを URL に保持します。リンクは、台本のあるシナリオを特定のステップで開くことも、一連のクラスタ操作を再生することも、カスタムのフリープレイクラスタを立ち上げることもできます。シミュレータのあらゆる「共有」ボタンは、この仕組みで動いています。
v1.9 から、そのフォーマットは公開され、ドキュメント化されました(英語)。対象は、クエリパラメータ、アクションログの文法、クラスタ形状のエンコーディング、そしてプレイグラウンドが解析できないエントリをどう処理するかです。仕様に載っているすべての例はシミュレータ自身のテストスイートでデコードされるため、ドキュメントがコードからずれていくことはありません。
フォーマットがドキュメント化されたことで、リンクはプレイグラウンド以外の場所からも生まれるようになります。スクリプト、CI ジョブ、あるいは AI エージェントです。その最初のジェネレーターが、このリリースとともに登場します。
monedula-sim-link: 実際のクラスタをリンクに
本当に関心のあるクラスタを、ブローカーごと、トピックごとに手で記述するのは、面倒でミスも起きやすい作業です。monedula-sim-link は、実際の Kafka クラスタに読み取り専用で接続し、そのクラスタを可視化するプレイグラウンドのリンクを出力する小さな Go 製 CLI です。
$ go install github.com/monedula-dev/monedula-sim-link/cmd/monedula-sim-link@latest
$ monedula-sim-link connect --brokers localhost:9092 --topics orders,payments
https://monedula.dev/kafka-simulator/playground?scenario=free&actions=…&size=…
このリンクは、稼働中のクラスタをシミュレータとして開きます。ブローカー、トピック、パーティションの配置、レプリケーションファクター、オフラインのブローカー、ISR のギャップ、メンバーを含むコンシューマーグループ、トピックの設定、そしてデータ量のサンプルまで。一時停止も、ステップ実行も、本番環境に触れずに壊すこともできる 1 枚の絵であり、インシデントの最中に、それを説明する文章の代わりにチームメイトへ送れるものです。
読み取り専用で、1 つのファイルで監査できる。 本番クラスタにツールを向けるのは信頼にかかわる判断なので、保証の範囲は狭く、明示的にしてあります。connect が発行するのは読み取りリクエストだけです。ApiVersions、Metadata、ListOffsets、そしてグループと設定については ListGroups、DescribeGroups、OffsetFetch、DescribeConfigs。Metadata では AllowAutoTopicCreation=false を設定するので、トピックを調べるだけでトピックが作られてしまうことは決してありません。レコードの produce も、設定の変更も、グループへの参加も、オフセットのコミットも一切ありません。クライアントの表面全体は 1 つのファイル snapshot/kafka.go に収まっており、失敗した lookup がトピックを自動作成しないこと、そしてグループのオフセットを読んでもオフセットが決して変わらないことを、テストで証明しています。
クラスタのセキュリティ構成に合わせられる。 TLS、mutual TLS、SASL/SCRAM をサポートしています。パスワードは MONEDULA_SIM_LINK_PASSWORD から読み込まれるので、シェルの履歴に残りません。
export MONEDULA_SIM_LINK_PASSWORD='…'
monedula-sim-link connect --brokers broker1:9093,broker2:9093 \
--tls --ca-cert ./cluster-ca.pem \
--sasl-mechanism scram-sha-512 --username viewer
トピックは完全一致の名前、正規表現、またはその両方で選択でき、--dry-run は URL を渡す前に、実際の名前からシミュレータ上の名前へのマッピングと、導出されたクラスタサイズを表示します。リンクがエンコードするのは、形状のコンパクトな記述とデータ量のサンプルだけです。シミュレータにはバックエンドがないので、あなたのデータがあなたのマシンから出ていくことはありません。
AI エージェントのための MCP サーバー
monedula-sim-link mcp は stdio 上で Model Context Protocol を話すので、Claude Code、Claude Desktop、その他任意の MCP クライアントが、リクエストに応じてリンクを構築できます。「orders のリーダーが落ちる 6 ブローカーのクラスタを見せて」や「うちのステージングクラスタを可視化して」と頼めば、エージェントはまさにそれを開くリンクを返します。公開しているツールは 4 つです。
build_playground_url- 宣言的な記述から作るフリープレイセッション。記述するのは、トポロジー、クラスタの形(ブローカー、パーティション数・RF・min.insync.replicas・クリーンアップポリシーを持つトピック、ラックアウェアネス)、そしてタイミング付きアクションの順序付きリストです。アクションには、レコードの produce、ブローカーの kill と再起動、プロデューサーとコンシューマーグループの追加、設定変更、再割り当て、階層ストレージへのオフロード、スロットリングがあります。open_scenario- ドット区切りの ID(例:00.1.3)で指定した、厳選された台本のあるシナリオの 1 つへのリンク。validate_actions- 生のactions文字列や完全な URL から、プレイグラウンドが実際に読み込む内容。残ったアクション、ドロップされたすべてのエントリとその理由、そしてコーデックの上限に対する長さと件数を示します。cluster_to_url-connectのスナップショットをツールにしたもので、読み取り専用の保証も同じです。
URL の組み立てを LLM に任せるのは、まさに物事が静かにおかしくなる場面です。崩れた区切り文字、シミュレータが受け付けない設定パス、長さの上限を超えた actions の値。そしてプレイグラウンドは、解析できないものを黙ってドロップします。そこで、すべてのツールは CLI と同じ fail-fast コーデックを通り、actions の値がまったく同じログにデコードし戻せない限り、URL は返されません。検証に失敗すると、エラーが問題のあるフィールド、区切り文字、設定パスを名指しするので、エージェントは途中で切れたリンクを出してしまう代わりに、自分の入力を修正できます。
Claude Code への登録は 1 行で済みます。
claude mcp add monedula-sim-link -- monedula-sim-link mcp
Claude Desktop の場合は、claude_desktop_config.json に追加します。
{
"mcpServers": {
"monedula-sim-link": {
"command": "monedula-sim-link",
"args": ["mcp", "--base-url", "https://monedula.dev/kafka-simulator/playground"]
}
}
}
--base-url は省略可能です。http://localhost:4321/kafka-simulator/playground に向ければ、ローカルの開発サーバー向けのリンクを生成できます。サーバーは公式の modelcontextprotocol/go-sdk の上に構築されています。
monedula-sim-link は、GitHub 上の独立したオープンソースリポジトリ monedula-dev/monedula-sim-link にあります。Apache-2.0 ライセンスの自己完結した Go モジュールで、go install でインストールするか、リリースページから Linux、macOS、Windows 向けのビルド済みバイナリとして入手できます。テレメトリは一切送信せず、URL フォーマットのリファレンスジェネレーターでもあります。monedula-sim-link が生成したリンクは、プレイグラウンドで、monedula-sim-link が書き出したログそのものに正確にデコードされます。
Kafka と同じやり方でクラスタをスケールする
フリープレイは、実際のクラスタと同じやり方でブローカー数を変えるようになりました。v1.9 までは、ブローカーを追加すると、パーティションがそのブローカーへ黙ってリバランスされていました。ある読者が指摘してくれたとおり、これは Kafka の動作ではありません。追加したブローカーは、いまでは空の状態で参加します。パーティションがひとりでにそこへ移ることはなく、クラスタインスペクターにもその旨が表示され、横に Rebalance partitions ボタンがあります。ターミナルでは、kafka-reassign-partitions --generate がトピックのリストとブローカーのリストから計画を提案し、--execute がそれを開始し、--verify がそれを確認します。逆方向も同じルールに従います。まだパーティションを保持しているブローカーは、削除する前にドレインしなければなりません。実際のブローカーを廃止するときと同じ順序です。
シミュレータを開き、Cluster Linking でリージョンをフェイルオーバーさせて、そのリンクを共有してみてください。