Orbit
Replicate and migrate Kafka clusters.
Last updated
Was this helpful?
Replicate and migrate Kafka clusters.
Last updated
Was this helpful?
Orbit is a feature of the WarpStream BYOC product that can automatically replicate data and metadata from any source Kafka-compatible cluster to a destination WarpStream cluster. Orbit is built directly into the WarpStream Agents, and doesn't require any additional deployments or binaries, it runs directly in the destination WarpStream cluster.
Orbit can perfectly mirror Kafka records (including headers and preserving offsets), topic configurations, cluster configurations, topic deletions, consumer group offsets, and more.
Records copied from source to destination are identical down to the offsets of the records. This, combined with the fact that Orbit can also copy consumer groups offsets, means that Orbit can be used to reliably migrate Kafka clients to the destination cluster without any duplicate consumption of data.
There are four primary use-cases for Orbit:
Replication from a source Kafka cluster into WarpStream for migrations.
Creating replicated copies of source Kafka clusters for disaster recovery.
Creating replicated copies of source Kafka clusters for scalable tiered storage.
Creating replicated copies of source Kafka clusters to provide additional read replicas, and isolate workloads. For example, analytical or batch consumers could read from the WarpStream replica cluster to avoid overloading the source Kafka cluster.
We highly recommend watching the overview video below, which provides a comprehensive overview of Orbit features.
Orbit is fully controllable from a single YAML file which can be edited through the WarpStream console or created programmatically through terraform.
Here's a quick summary of the YAML file above:
Orbit is set up to connect to a Kafka cluster with 2 source brokers.
It will connect to the source brokers using SASL PLAIN and will retrieve the username and password by reading the ORBIT_SASL_USERNAME_ENV_VAR
and ORBIT_SASL_PASSWORD_ENV_VAR
environment variables respectively in the Agent.
Topics which match the topic.*
regex in the source will be mirrored to the destination with their name unchanged (no prefix will be added to their name).
Cluster configurations will not be copied over.
Consumer group names and offsets will be replicated into the destination cluster. The consumer group names will be mirrored to the destination with their name unchanged (no prefix will be added to their name).
At most 2 concurrent fetches (globally, regardless of the number of Agents) will be executed in the WarpStream Agents at any given time.
Host address and port of the the source cluster Kafka brokers or Agents.
Source cluster brokers are listed under the source_bootstrap_brokers
in the YAML.
Each broker is defined as a hostname
and a port
.
The brokers must be reachable from your WarpStream Agents.
Credentials used by the destination WarpStream agents to connect to the source cluster.
Credentials for the brokers are defined under the source_cluster_credentials
section in the YAML.
Since the Agents runs in your VPC, WarpStream does not have access to your credentials.
To force the Agents to use TLS when connecting to your source clusters, use the use_tls
flag in the source_cluster_credentials
section.
If you have ACLs enabled in the source cluster, then you need to make sure the principal associated with Orbit credentials used to connect with the source has the following permissions:
Describe
DescribeConfigs
and Read
operations for the Topic resources which you want mirrored by Orbit.
Describe
and DescribeConfigs
for the Cluster resource.
Describe
and Read
operations for the Group resource (consumer groups).
Both the SASL_USERNAME_ENV_VAR
and the SASL_PASSWORD_ENV_VAR
fields refer to environment variables. The Agents will append a ORBIT_
prefix to the values of the fields before using the environment variables, so the environment variables in the Agent should be configured as ORBIT_SASL_USERNAME_ENV_VAR
and ORBIT_SASL_PASSWORD_ENV_VAR
respectively.
By default Orbit uses the plain
SASL mechanism. To specify the SASL mechanism add the sasl_mechanism
field in the source_cluster_credentials
section. Supported mechanisms include:
plain
scram-256
scram-512
The MTLS_CERT_PATH_ENV
, MTLS_KEY_PATH_ENV
, and MTLS_SERVER_CA_CERT_PATH_ENV
fields refer to environment variables. The Agents will append a ORBIT_
prefix to the values of the fields before using the environment variables, so the environment variables in the Agent should be configured as ORBIT_MTLS_CERT_PATH_ENV
, ORBIT_MTLS_KEY_PATH_ENV
, and ORBIT_MTLS_SERVER_CA_CERT_PATH_ENV
respectively.
Note that these environment variables should point to file paths for the respective PEM encoded certificate files and must not encode the certificates directly.
mtls_server_ca_cert_env
is an optional field. However, it is highly recommended to set the environment variable to the public keys of the certificate authorities that sign your server certificates. If this environment variable is not set, WarpStream defaults to trusting all server certificates from your Operating System's root certificate store.
Topics can be replicated by adding mappings under the topic_mappings
section of the YAML.
To replicate a topic from the source cluster to the destination, add a topic mapping to the topic_mappings
section with a source_regex
which will match the source topic which should be replicated.
For example in the above regex, topics in the source cluster with prefixes foo_topic
and bar_topic
would be replicated.
Note that topics being actively replicated by Orbit cannot receive writes from external Kafka clients until the irreversible_disable_orbit_management
field in the topic mapping is set to true.
Leave destination_prefix
empty if you want topic names to be perfectly preserved when topics are replicated, or set it to a non-empty string if you want Orbit to add a prefix to Orbit-replicated topics.
For example, if the source cluster has a topic bar_topicA
, then it will be replicated in WarpStream as baz_bar_topicA
, but a topic with name foo_topicB
will be replicated with its name unmodified.
To pause replication for a topic, remove the mapping which matches the topic from the YAML.
Detailed rules about the topic mappings which indicates which topics mappings match which topics.
Each mapping consists of source_regex
, destination_prefix
, and irreversible_disable_orbit_management
fields.
Orbit will create a new topic in the destination only if there exists a topic mapping with a source_regex
which matches the source cluster topic.
To determine if a topic in the source cluster matches a topic mapping, it must match a source_regex
in at least one topic mapping. For example, the topic foo_topicA
matches the first topic mapping.
The value of the destination_prefix
field is appended as a prefix to the topic name for the topic which will be created in the destination cluster. Empty string is a valid value for destination_prefix
if you want the topics to have the same name in the destination WarpStream cluster as they did in the source cluster.
To determine if a topic which has been created by Orbit in the destination cluster matches a topic matching, it must match the destination_prefix
+ source_regex
in at least one of the topic mappings. For example, bar_topicB
is created as baz_bar_topicB
in the destination, and baz_bar_topicB
in the destination, matches the second topic mapping.
A topic in either the source or the destination cluster will match the mappings in the topic_mappings
section in the order in which the topic mappings are listed, and only a single topic mapping will apply (the first one).
Orbit will keep the topic configurations in sync for a source/destination topic pair only if the destination topic matches a topic mapping.
Orbit will keep deleted topics in sync for a source/destination topic pair only if the destination topic matches a topic mapping.
Orbit will replicate records for a source/destination topic pair only if the destination topic matches a topic mapping.
topic_config_overrides
overrides values of specified topic configurations for a given topic mapping. For example, if topics which match the bar_topic.*
regex in the source cluster have a retention.ms
value of 60000000
, the corresponding topics which will be created in the destination will have a retention.ms
value of 72000000
.
begin_fetch_at_latest_offset
can be set to true
for a topic mapping to begin fetches at the latest offset of a topic partition rather than the earliest.
By default this field is set to false
and records are copied starting from the earliest topic partition offsets in the source cluster.
When set to true
, any topics created in the destination Orbit cluster which match that topic mapping will begin fetching records starting from the latest offsets in the source cluster.
As an example if some topic topic_A
partition 0
, has records from offsets 100
to 1000
in the source cluster, then Orbit will start mirroring topic_A
beginning at offset 1000
rather than 100
. Every records after offset 1000
will be mirrored identically.
Orbit will copy topic configurations from the source cluster for all of the topics which Orbit is managing in the destination cluster. Note that only the following configuration values are considered relevant to WarpStream and will be copied by Orbit:
cleanup.policy
message.timestamp.type
retention.ms
delete.retention.ms
min.compaction.lag.ms
Orbit can sync offsets of consumer groups which exist in the source cluster to the destination cluster.
Set copy_offsets_enabled
to true
under the consumer_groups
section and Orbit will start mirroring consumer groups from the source cluster to the destination.
Similar to topic names, consumer group replication can optionally be configured to add a destination group prefix to the replicated consumer group names. Leave destination_group_prefix
empty if you want consumer group names to be replicated as-is.
Orbit will copy cluster configurations from the source cluster to the destination if the copy_source_cluster_configuration
flag under the cluster_config
section is set to true
.
Note that Orbit only copies cluster configurations which are relevant to WarpStream. These include:
num.partitions
which is used to determine the default number of partitions a new topic should be created with. This is referring to new topics created by a Kafka client, and not Orbit.
auto.create.topics.enable
which indicates if new topics should be created automatically when the client performs a metadata request for a topic which does not exist.
log.retention.ms
log.retention.minutes
log.retention.hours
which indicate the default retention used by the topics.
offsets.retention.minutes
which indicates the expiration duration of the offsets committed by a consumer group.
You can prevent Orbit from copying any records from the source to the destination cluster for every single topic mapping by setting the above cluster config.
You can edit the Orbit YAML, view the offset lag for topic partitions being mirrored, and view which topics Orbit is mirroring all from the WarpStream UI.
Select your virtual cluster from the WarpStream console and navigate to the Orbit tab. You'll see a text editor which can be used to create and edit the Orbit YAML file.
Edit the YAML, and hit Save. Note that the pipeline is paused by default. You can start it by hitting the toggle next to the word PAUSED.
Once the pipeline is running, you'll see the topics which are mirrored by Orbit show up under the Orbit tab. In the image below, Orbit created a topic called test_topic
with a prefix orbit_
as expected.
To modify the YAML, hit the edit button, edit the YAML, and hit Save again. Orbit will create a new configuration for the pipeline. In the image below, I've set copy_offsets_enabled
to true
so that consumer group offsets will be copied from the source cluster to the destination. Note: You will have to hit the Deploy button on the new version before it will take effect. You can also deploy older versions to "rollback".
You can view the lag between the source and destination cluster topic partitions from the Consumers tab. The orbit_source_cluster_offsets
consumer group will include every topic and partition that is being mirrored by Orbit. The offset lag indicates how far behind Orbit is compared to the source cluster. Note: This group will always have a time lag of 0.
Orbit can be used to migrate existing Kafka compatible clusters to WarpStream.
First, follow the instructions above to configure WarpStream to replicate all of the topics and consumer groups from the source cluster. Monitor the lag of the orbit_source_cluster_offsets
consumer group to wait for WarpStream to "catch up" on all the source Kafka topics.
The following migration flow will ensure that your Kafka consumer clients can be migrated to WarpStream without duplicate processing of records. The Orbit YAML must have the following config.
Orbit will periodically sync committed offsets for consumer groups to WarpStream.
Let's say you want to migrate some consumer group X
.
First, shut down the consumers belonging to this group in the source cluster.
Restart consumers but point them to the destination WarpStream cluster instead by changing their bootstrap URL. The consumers will start reading from the offsets which were last committed in the source cluster, picking up where they left off.
The following migration flow will ensure that your Kafka producer clients can be cut over to WarpStream seamlessly. Using the irreversible_disable_orbit_management
field in a topic mapping will disable Orbit management of the topic. The following example shows how and when to use the field.
Let's say you have the following topic mapping in the Orbit YAML, and you have decided that you want to move the topic topic0
matched by this mapping from the source to the destination. To make the example more complicated, let's assume that a topic1
also exists in the source cluster which is also being mirrored by Orbit.
First shut down the producer clients producing to topic0
in the source.
Create a new topic mapping to migrate the test0_topic
topic. Note the irreversible_disable_orbit_management
field. This field indicates that Orbit should stop managing the topic which will allow Kafka Producer clients to write to the topic. This decision is irreversible.
Since topic mappings match topics in order, the test0_topic0
will now accept writes from regular Kafka clients, and Orbit will no longer copy records from source for this topic. Note that test0_topic1
is unaffected because it does not match the topic mapping.
Restart your producer clients by pointing them to the destination WarpStream cluster. Since topic0
is known as test0_topic0
in the destination due to the prefix, you'll have to write to test0_topic0
instead.
Orbit will also emit some additional metrics:
You can use the warpstream_agent_kafka_produce_with_offset_uncompressed_bytes_counter
metric to view the data successfully written by Orbit to the destination WarpStream cluster.
warpstream_agent_kafka_source_cluster_connections_counter
metric is a counter which is incremented for short lived Orbit connections made against the source cluster. It can be used to estimate the rate at which Orbit is creating connections against the source cluster.
Orbit is tuneable using the following section which can be added to the Orbit YAML.
The above YAML controls how Orbit executes fetches which grab data from the source cluster.
The key field is the cluster_fetch_concurrency
under the warpstream
section. It can be used to control the approximate concurrency of fetches which will be executed against the source cluster and is the field you'd want to experiment with to find an appropriate setting for your workload.
Higher values will replicate data faster but put more load on the source cluster and vice versa.
Note that it is expected that the topics replicated by Orbit have unclean.leader.election.enable
set to false
. If this configuration is set to true
there can be data loss in the source cluster, and Orbit won't retroactively delete data in the destination WarpStream cluster which has been replicated using Orbit, but is lost in the source cluster.
See the section for details on how to use this field.
topic_config_overrides
can be used be used to override the value of the specified topic configurations in the source cluster which will be copied to the destination. Currently, only the retention.ms
topic configuration is supported for override. See the section for further details.
By default, Orbit will copy all records starting from the earliest topic partition offsets in the source cluster for a given topic. If begin_fetch_at_latest_offset
is set to true
, then Orbit will copy all records beginning at the latest topic partition offsets in the source cluster. See the section for further details.
The irreversible_disable_orbit_management
will only be respected if a destination topic matches the topic mapping with the flag set to true
. See more details on topic migration in the where the meaning of this configuration option is explained.
Wait 1 minute for Orbit to copy the consumer group offsets for group X
to the destination cluster. You can use the warpstream_consumer_group_max_offset
metric emitted from the agents to view the offsets copied by Orbit to the destination. See the page for more details on this metric. You can also see the currently committed offsets in the consumers tab in the WarpStream UI.
Wait for the offset lag between the source topic topic0
and destination topic test0_topic0
to become 0. You can view the lag for the topic from the orbit_source_cluster_offsets
group in the Consumer view in the Warpstream console. The lag for all of the partitions of the topic are also emitted as the warpstream_consumer_group_lag
metric from the Agents. See the page for more details on this metric. You can also see the currently committed offsets in the consumers tab in the WarpStream UI.
You can monitor Orbit using the metrics built into the WarpStream Agents. See our documents for more details.
You can use the warpstream_consumer_group_lag
and filter for the group orbit_source_cluster_offsets
and the topics you care about to determine the lag between your topics in the source cluster and WarpStream. View the page for more details on this metric.
You can use the warpstream_consumer_group_max_offset
metric emitted from the agents to view the offsets copied by Orbit to the consumer group in the destination. See the page for more details on this metric.