A replicator copies topics, and optionally consumer group offsets, from one Kafka cluster to another: between two Streamtime clusters, or between a Streamtime cluster and an external one. Use it for disaster recovery, migrations, or to bring data closer to its readers.
Key Features
MirrorMaker 2 or Cluster Link, chosen as the Provider.
Active-passive or active-active replication.
Choose what to copy: topic and consumer group allow and deny lists (comma-separated names or patterns).
Offset translation and checkpoints, so consumers can fail over.
Lag alerts: an alert fires when replication falls behind by a threshold you set, in messages, bytes or seconds.
Settings
Basic Configuration: Identifier, Provider (MirrorMaker2 or Cluster Link).
Source Cluster and Destination Cluster: a Streamtime Kafka Cluster, or an External Cluster with its bootstrap servers, security protocol, authentication and the secret holding its credentials.
Replication Settings: Replication Mode, Topic Whitelist / Topic Blacklist, Groups Whitelist / Groups Blacklist, and the Lag Alert Threshold with its unit.
Advanced Configuration: MirrorMaker 2 or Cluster Link tuning, such as checkpoints, heartbeats, offset sync topics and producer and consumer settings.
Before you start
A fleet in Healthy state with room for the Kafka Replicator workload (see Fleet management).
For the API: an access token in STREAMTIME_TOKEN and your organization identifier in place of <org>. Replace api.example.com with your Streamtime API address.
packagemainimport("bytes""crypto/rand""encoding/hex""encoding/json""net/http""os")constapi="https://api.example.com/organizations/<org>"// newKey returns a random idempotency key.funcnewKey()string{b:=make([]byte,16)rand.Read(b)returnhex.EncodeToString(b)}// call sends one request with the access token and a JSON body (or none).// An optional idempotency key is sent as the Idempotency-Key header.funccall(method,pathstring,bodyany,idempotencyKey...string)(*http.Response,error){varbufbytes.Bufferifbody!=nil{iferr:=json.NewEncoder(&buf).Encode(body);err!=nil{returnnil,err}}req,err:=http.NewRequest(method,api+path,&buf)iferr!=nil{returnnil,err}req.Header.Set("Authorization","Bearer "+os.Getenv("STREAMTIME_TOKEN"))req.Header.Set("Content-Type","application/json")iflen(idempotencyKey)>0{req.Header.Set("Idempotency-Key",idempotencyKey[0])}returnhttp.DefaultClient.Do(req)}
Saving a Kafka Replicator resource and provisioning it are separate steps in the API: create or change it, then reconcile its new generation. The reconcile returns 202 with the operation it started; the same Idempotency-Key returns that operation again, and a 409 means the generation is out of date.
Create a replicator
In the sidebar, select Replicators, then Add Replicator.
Basic Configuration: enter the Identifier and choose the Provider.
Source Cluster and Destination Cluster: choose a Streamtime Kafka Cluster for each, or enter an External Cluster’s connection details.
Replication Settings: choose the Replication Mode, the topics and groups to copy, and the Lag Alert Threshold.
Advanced Configuration: tune the replication if you need to, then create it. It shows Pending, then Provisioning, then Healthy.
# 1. Save it. The response includes "generation".
curl -X POST "$API/kafka-replicator/"\-H"Authorization: Bearer $STREAMTIME_TOKEN"\-H"Content-Type: application/json"\-d'{
"identifier": "orders-dr",
"provider": "MirrorMaker2",
"source_kafka_id": "<source-cluster>",
"destination_kafka_id": "<destination-cluster>",
"replication_mode": "active-passive",
"topic_whitelist": "orders.*",
"lag_alert_threshold": 10000,
"lag_alert_threshold_unit": "messages"
}'# 2. Provision it
curl -X POST "$API/kafka-replicator/orders-dr/reconcile/"\-H"Authorization: Bearer $STREAMTIME_TOKEN"\-H"Content-Type: application/json"\-H"Idempotency-Key: $(uuidgen)"\-d'{"generation": 1}'
For an external cluster, send source_connection_details (or destination_connection_details) and the matching …_secret_path instead of the …_kafka_id. replication_mode is active-passive or active-active; lag_alert_threshold_unit is messages, bytes or seconds.
resp,err:=call("GET","/kafka-replicator/orders-dr/",nil)// Decode "status" from resp.Body.
streamtime kafka-replicator list
streamtime kafka-replicator get orders-dr
Not available in MCP yet. Check the status from the UI, API or CLI.
Change the configuration or upgrade
Change the replicated topics or groups, the lag threshold, or the advanced replication settings. Replication lag shows on the replicator’s Monitoring tab, and the lag alert fires when it passes the threshold.
Open it from Replicators and select Configuration (or Edit).
Change the settings, then save. Streamtime applies the change, and the status shows Updating, then Healthy.
# 1. Save the change. The response includes the new "generation".GEN=$(curl -s-X PATCH "$API/kafka-replicator/orders-dr/"\-H"Authorization: Bearer $STREAMTIME_TOKEN"\-H"Content-Type: application/json"\-d'{"topic_whitelist": "orders.*,payments.*", "lag_alert_threshold": 5000}' | jq .generation)# 2. Apply it
curl -X POST "$API/kafka-replicator/orders-dr/reconcile/"\-H"Authorization: Bearer $STREAMTIME_TOKEN"\-H"Content-Type: application/json"\-H"Idempotency-Key: $(uuidgen)"\-d"{\"generation\": $GEN}"
The SDK has no typed call for this update yet, so save it with the SDK’s HTTP client, then apply it:
Not available in the CLI yet. Change the configuration from the UI or API.
Not available in MCP yet. Change the configuration from the UI or API.
View metrics, logs and alerts
Open it from Replicators and select Monitoring for its metrics and logs, and Alert Rules (where shown) for the alerts that watch it. Alerts that fire also appear on the fleet’s Monitoring tab.
Metrics and logs are read through the fleet that runs it: