---
title: "Kafka Simulator v1.9 - プラットフォーム層と公開 URL フォーマット"
date: 2026-10-09T00:00:00.000Z
author: "michal"
excerpt: "Multi-Region Cluster のオブザーバー、Cluster Linking、階層ストレージが、12 本のシナリオで DR とストレージの物語を締めくくります。さらにプレイグラウンドの URL フォーマットが公開され、稼働中のクラスタや AI エージェントの記述をリンクに変える monedula-sim-link も登場します。"
---
v1.9 は**12 本の新しいシナリオ**を追加します。dr モジュールにさらに 10 本、新しい tiered-storage モジュールに 2 本です。これで [Kafka Simulator](/kafka-simulator/) のカリキュラムは **134 本中 112 本**に到達します。あわせて、シミュレータが当初から頼ってきたもの、つまりリンクのフォーマットも公開します。

## v1.9 の内容

**さらなるディザスタリカバリ（`dr`、10 本）。** v1.8 が MirrorMaker 2 で提起した問題に対する、プラットフォームとしての 2 つの答えです。

- **[Multi-Region Cluster のオブザーバー](/kafka-simulator/scenarios/mrc-observers/)** - ISR に加わらずにログを追うレプリカなので、リモートコピーを持っても書き込みパスのコストはゼロです。[どれだけ遅れるのか](/kafka-simulator/scenarios/observer-lag/)、[どこに置くのか](/kafka-simulator/scenarios/durability-vs-latency/)、[どのように昇格するのか](/kafka-simulator/scenarios/observer-promotion/)。[昇格に必要なリーダーにもう到達できないケース](/kafka-simulator/scenarios/observer-promotion-reachable-leader/)も含めて扱います。
- **[Cluster Linking](/kafka-simulator/scenarios/cluster-linking-offset-preserving/)** - オフセットを保つバイト単位のミラーなので、フェイルオーバーしたコンシューマーにオフセット変換は不要です。[ミラートピックは昇格されるまで読み取り専用のままです](/kafka-simulator/scenarios/mirror-read-only-promote-writable/)。[コミット済みのコンシューマーオフセットはリンク越しにそのまま同期され](/kafka-simulator/scenarios/consumer-offset-sync-link/)、[リンクはその場で向きを反転してきれいにフェイルバックできます](/kafka-simulator/scenarios/bidirectional-links-failback/)。さらに 1 本のシナリオでは、[同じトポロジー上で MirrorMaker 2 と並べて動かします](/kafka-simulator/scenarios/cluster-linking-vs-mm2/)。フリープレイにも対応する操作が加わります。2 リージョンのトポロジーで使えるリージョンとミラーリンクのエディターで、各リンクは MirrorMaker 2 にも Cluster Linking にもでき、向きを反転させることもできます。

**階層ストレージ（`tiered-storage`、2 本）。** 古いセグメントをオブジェクトストレージへオフロードします。[オフロード、読み戻し、期限切れまでのライフサイクル全体](/kafka-simulator/scenarios/confluent-tiered-lifecycle/)を、`localStartOffset` と `logStartOffset` が離れていく様子とともに追います。そして[無期限のリテンション](/kafka-simulator/scenarios/infinite-retention-tiered/)では、古くなったセグメントがローカルディスクを離れても、遅れているコンシューマーはそれらを 1 つ残らず読み戻します。

## すべてのセッションがリンクになる

プレイグラウンドは状態のすべてを URL に保持します。リンクは、台本のあるシナリオを特定のステップで開くことも、一連のクラスタ操作を再生することも、カスタムのフリープレイクラスタを立ち上げることもできます。シミュレータのあらゆる「共有」ボタンは、この仕組みで動いています。

v1.9 から、そのフォーマットは[公開され、ドキュメント化されました](/flock/docs/kafka-simulator/reference/url-format/)（英語）。対象は、クエリパラメータ、アクションログの文法、クラスタ形状のエンコーディング、そしてプレイグラウンドが解析できないエントリをどう処理するかです。仕様に載っているすべての例はシミュレータ自身のテストスイートでデコードされるため、ドキュメントがコードからずれていくことはありません。

フォーマットがドキュメント化されたことで、リンクはプレイグラウンド以外の場所からも生まれるようになります。スクリプト、CI ジョブ、あるいは AI エージェントです。その最初のジェネレーターが、このリリースとともに登場します。

## monedula-sim-link: 実際のクラスタをリンクに

本当に関心のあるクラスタを、ブローカーごと、トピックごとに手で記述するのは、面倒でミスも起きやすい作業です。[monedula-sim-link](/ja/flock/sim-link/) は、実際の Kafka クラスタに**読み取り専用**で接続し、そのクラスタを可視化するプレイグラウンドのリンクを出力する小さな Go 製 CLI です。

```bash
$ 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`](https://github.com/monedula-dev/monedula-sim-link/blob/main/snapshot/kafka.go) に収まっており、失敗した lookup がトピックを自動作成しないこと、そしてグループのオフセットを読んでもオフセットが決して変わらないことを、テストで証明しています。

**クラスタのセキュリティ構成に合わせられる。** TLS、mutual TLS、SASL/SCRAM をサポートしています。パスワードは `MONEDULA_SIM_LINK_PASSWORD` から読み込まれるので、シェルの履歴に残りません。

```bash
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 行で済みます。

```bash
claude mcp add monedula-sim-link -- monedula-sim-link mcp
```

Claude Desktop の場合は、`claude_desktop_config.json` に追加します。

```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`](https://github.com/modelcontextprotocol/go-sdk) の上に構築されています。

monedula-sim-link は、GitHub 上の独立したオープンソースリポジトリ [monedula-dev/monedula-sim-link](https://github.com/monedula-dev/monedula-sim-link) にあります。Apache-2.0 ライセンスの自己完結した Go モジュールで、`go install` でインストールするか、[リリースページ](https://github.com/monedula-dev/monedula-sim-link/releases)から Linux、macOS、Windows 向けのビルド済みバイナリとして入手できます。テレメトリは一切送信せず、URL フォーマットのリファレンスジェネレーターでもあります。monedula-sim-link が生成したリンクは、プレイグラウンドで、monedula-sim-link が書き出したログそのものに正確にデコードされます。

## Kafka と同じやり方でクラスタをスケールする

フリープレイは、実際のクラスタと同じやり方でブローカー数を変えるようになりました。v1.9 までは、ブローカーを追加すると、パーティションがそのブローカーへ黙ってリバランスされていました。ある読者が[指摘してくれた](https://github.com/monedula-dev/monedula-kafka-simulator-issues/issues/1)とおり、これは Kafka の動作ではありません。追加したブローカーは、いまでは空の状態で参加します。パーティションがひとりでにそこへ移ることはなく、クラスタインスペクターにもその旨が表示され、横に **Rebalance partitions** ボタンがあります。ターミナルでは、`kafka-reassign-partitions --generate` がトピックのリストとブローカーのリストから計画を提案し、`--execute` がそれを開始し、`--verify` がそれを確認します。逆方向も同じルールに従います。まだパーティションを保持しているブローカーは、削除する前にドレインしなければなりません。実際のブローカーを廃止するときと同じ順序です。

[シミュレータ](/kafka-simulator/)を開き、Cluster Linking でリージョンをフェイルオーバーさせて、そのリンクを共有してみてください。