---
title: "Symulator Kafki v1.9 - warstwa platformy i publiczny format URL"
date: 2026-10-09T00:00:00.000Z
author: "michal"
excerpt: "Observery Multi-Region Cluster, Cluster Linking i tiered storage domykają w dwunastu scenariuszach wątek DR i przechowywania danych - a format URL playgroundu staje się publiczny, razem z monedula-sim-link, który zamienia w link działający klaster albo opis od agenta AI."
---
v1.9 dodaje **12 nowych scenariuszy** - dziesięć kolejnych w module dr i dwa w nowym module tiered-storage - a program [Symulatora Kafki](/kafka-simulator/) sięga **112 ze 134**. To wydanie publikuje też coś, na czym symulator opiera się od samego początku: format jego linków.

## Co jest w v1.9

**Więcej disaster recovery (`dr`, 10 scenariuszy).** Dwie odpowiedzi platformy na problemy, które v1.8 postawiło przy MirrorMaker 2:

- **[Observery Multi-Region Cluster](/kafka-simulator/scenarios/mrc-observers/)** - repliki, które podążają za logiem, nie dołączając do ISR, więc zdalna kopia nic nie kosztuje na ścieżce zapisu. [Jak bardzo zostają w tyle](/kafka-simulator/scenarios/observer-lag/), [gdzie je umieścić](/kafka-simulator/scenarios/durability-vs-latency/) i [jak są awansowane](/kafka-simulator/scenarios/observer-promotion/) - łącznie z [przypadkiem, w którym awans wymaga lidera, do którego nie może już dotrzeć](/kafka-simulator/scenarios/observer-promotion-reachable-leader/).
- **[Cluster Linking](/kafka-simulator/scenarios/cluster-linking-offset-preserving/)** - mirror bajt w bajt, który zachowuje offsety, więc konsument po failoverze nie potrzebuje żadnej translacji. [Tematy lustrzane pozostają tylko do odczytu, dopóki nie zostaną awansowane](/kafka-simulator/scenarios/mirror-read-only-promote-writable/), [zatwierdzone offsety konsumentów synchronizują się przez link w niezmienionej postaci](/kafka-simulator/scenarios/consumer-offset-sync-link/), [link odwraca się w miejscu, co daje czysty failback](/kafka-simulator/scenarios/bidirectional-links-failback/), a [jeden scenariusz uruchamia Cluster Linking obok MirrorMaker 2](/kafka-simulator/scenarios/cluster-linking-vs-mm2/) na tej samej topologii. Free play zyskuje odpowiadającą temu kontrolkę: edytor regionów i linków mirrorujących w topologiach dwuregionowych, gdzie każdy link to MirrorMaker 2 albo Cluster Linking i można go odwrócić.

**Tiered storage (`tiered-storage`, 2 scenariusze).** Stare segmenty zrzucane do object storage: [pełny cykl życia zrzutu, odczytu z powrotem i wygaśnięcia](/kafka-simulator/scenarios/confluent-tiered-lifecycle/), w którym `localStartOffset` i `logStartOffset` się rozjeżdżają - oraz [nieskończona retencja](/kafka-simulator/scenarios/infinite-retention-tiered/), w której postarzałe segmenty opuszczają dysk lokalny, a konsument z zaległościami wciąż odczytuje z powrotem każdy z nich.

## Każda sesja to link

Playground trzyma cały swój stan w URL-u. Link może otworzyć scenariusz pisany z góry na wybranym kroku, odtworzyć sekwencję operacji na klastrze albo postawić własny klaster w free play - i właśnie tak działa każdy przycisk „udostępnij” w symulatorze.

Od v1.9 ten format jest [publiczny i udokumentowany](/flock/docs/kafka-simulator/reference/url-format/) (po angielsku): parametry zapytania, gramatyka logu akcji, kodowanie kształtu klastra oraz to, co playground robi z wpisem, którego nie potrafi sparsować. Każdy przykład ze specyfikacji jest dekodowany przez własny zestaw testów symulatora, więc dokument nie może rozjechać się z kodem.

Udokumentowany format oznacza, że linki mogą pochodzić z innego miejsca niż playground - ze skryptu, z zadania CI albo od agenta AI. Pierwszy generator wychodzi razem z tym wydaniem.

## monedula-sim-link: prawdziwy klaster jako link

Ręczne opisywanie klastra, na którym naprawdę ci zależy - broker po brokerze, temat po temacie - jest żmudne i podatne na błędy. [monedula-sim-link](/pl/flock/sim-link/) to małe CLI w Go, które łączy się z prawdziwym klastrem Kafki **wyłącznie do odczytu** i wypisuje link do playgroundu wizualizujący ten klaster:

```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=…
```

Link otwiera działający klaster jako symulację: brokery, tematy, rozmieszczenie partycji, współczynnik replikacji, brokery offline, luki ISR, grupy konsumentów wraz z ich członkami, konfiguracje tematów i próbkę wolumenu danych - obraz, który możesz zatrzymać, przejść krok po kroku, zepsuć bez dotykania produkcji i wysłać koledze z zespołu w środku incydentu zamiast akapitu z opisem.

**Tylko do odczytu i do zweryfikowania w jednym pliku.** Skierowanie narzędzia na produkcyjny klaster to decyzja o zaufaniu, więc gwarancja jest wąska i jawna. `connect` wysyła wyłącznie żądania odczytu - ApiVersions, Metadata, ListOffsets, a dla grup i konfiguracji ListGroups, DescribeGroups, OffsetFetch i DescribeConfigs. Żądanie Metadata ustawia `AllowAutoTopicCreation=false`, więc nawet wyszukanie tematu nigdy go nie utworzy. `connect` nie produkuje żadnych rekordów, nie zmienia konfiguracji, nie dołącza do żadnej grupy i nie zatwierdza żadnego offsetu. Cała powierzchnia klienta mieści się w jednym pliku, [`snapshot/kafka.go`](https://github.com/monedula-dev/monedula-sim-link/blob/main/snapshot/kafka.go), wraz z testami dowodzącymi, że nieudane wyszukanie nie tworzy automatycznie tematu i że odczyt offsetów grupy nigdy ich nie zmienia.

**Pasuje do tego, jak zabezpiecza się klastry.** Obsługiwane są TLS, mutual TLS i SASL/SCRAM, a hasło jest odczytywane z `MONEDULA_SIM_LINK_PASSWORD`, więc nie trafia do historii powłoki:

```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
```

Tematy wybiera się po dokładnej nazwie, wyrażeniem regularnym albo na oba sposoby, a `--dry-run` wypisuje mapowania prawdziwych nazw na nazwy w symulatorze oraz wyliczony rozmiar klastra, zanim poda ci URL. Wszystko, co koduje link, to zwięzły opis kształtu i próbka wolumenu; symulator nie ma backendu, więc twoje dane nigdy nie opuszczają twojej maszyny.

## Serwer MCP dla agentów AI

`monedula-sim-link mcp` komunikuje się przez stdio w protokole **Model Context Protocol**, więc Claude Code, Claude Desktop albo dowolny inny klient MCP może budować linki na żądanie. Poproś: „pokaż mi klaster z 6 brokerami, w którym umiera lider dla `orders`” albo „zwizualizuj nasz klaster stagingowy”, a agent zwróci link, który otwiera dokładnie to. Serwer udostępnia cztery narzędzia:

- **`build_playground_url`** - sesja free-play z deklaratywnego opisu: topologia, kształt klastra (brokery; tematy z partycjami, RF, `min.insync.replicas`, polityką czyszczenia; świadomość racków) i uporządkowana lista akcji z określonym czasem - produkowanie rekordów, ubijanie i restartowanie brokerów, dodawanie producentów i grup konsumentów, zmiany konfiguracji, realokacja, zrzut do tiered storage, dławienie.
- **`open_scenario`** - link do jednego z wyselekcjonowanych scenariuszy pisanych z góry, według jego identyfikatora z kropkami (np. `00.1.3`).
- **`validate_actions`** - co playground *faktycznie* wczytałby z surowego ciągu `actions` albo pełnego URL-a: akcje, które przetrwały, każdy odrzucony wpis wraz z powodem oraz długość i liczba w zestawieniu z limitami kodeka.
- **`cluster_to_url`** - migawka z `connect` w postaci narzędzia, z tą samą gwarancją tylko do odczytu.

Oddanie budowania URL-i w ręce LLM to dokładnie to miejsce, w którym coś niepostrzeżenie idzie nie tak - zniekształcony separator, ścieżka konfiguracji, której symulator nie akceptuje, wartość `actions` ponad limitem długości - a playground po cichu odrzuca to, czego nie potrafi sparsować. Dlatego każde narzędzie przechodzi przez ten sam kodek fail-fast co CLI i żaden URL nie zostaje zwrócony, jeśli jego wartość `actions` nie dekoduje się z powrotem do identycznego logu. Gdy walidacja się nie powiedzie, błąd wskazuje problematyczne pole, separator albo ścieżkę konfiguracji, więc agent może poprawić swoje dane wejściowe, zamiast oddać ucięty link.

Zarejestrowanie serwera w Claude Code to jedna linia:

```bash
claude mcp add monedula-sim-link -- monedula-sim-link mcp
```

W Claude Desktop dodaj go do `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` jest opcjonalny; ustaw go na `http://localhost:4321/kafka-simulator/playground`, żeby generować linki prowadzące do lokalnego serwera deweloperskiego. Serwer jest zbudowany na oficjalnym [`modelcontextprotocol/go-sdk`](https://github.com/modelcontextprotocol/go-sdk).

monedula-sim-link ma własne repozytorium open source, [monedula-dev/monedula-sim-link](https://github.com/monedula-dev/monedula-sim-link) na GitHubie - samodzielny moduł Go na licencji Apache-2.0, instalowany przez `go install` albo jako gotowy plik binarny dla Linuksa, macOS i Windows ze [strony wydań](https://github.com/monedula-dev/monedula-sim-link/releases). Narzędzie nie wysyła telemetrii i jest generatorem referencyjnym formatu URL: link, który generuje, dekoduje się w playgroundzie dokładnie do logu, który ono zapisało.

## Skalowanie klastra tak, jak robi to Kafka

Free play zmienia teraz liczbę brokerów tak, jak robi to prawdziwy klaster. Przed v1.9 dodanie brokera po cichu przerzucało na niego partycje - a, jak [zauważył](https://github.com/monedula-dev/monedula-kafka-simulator-issues/issues/1) jeden z czytelników, Kafka tak nie robi. Dodany broker dołącza teraz pusty: żadna partycja nie przenosi się na niego sama, a inspektor klastra mówi o tym wprost i pokazuje obok przycisk **Rebalance partitions**. W terminalu `kafka-reassign-partitions --generate` proponuje plan na podstawie listy tematów i listy brokerów, `--execute` go uruchamia, a `--verify` potwierdza. W drugą stronę obowiązuje ta sama zasada: broker, który wciąż trzyma partycje, trzeba zdrenować, zanim będzie można go usunąć, w tej samej kolejności, w jakiej wycofywałbyś z eksploatacji prawdziwy broker.

Otwórz [symulator](/kafka-simulator/), zrób failover regionu przez Cluster Linking i udostępnij link.