Chapter 11. Debezium Server (Technology Preview)


Debezium Server is a ready-to-use application that streams change events from a source database directly to messaging and storage systems without requiring Apache Kafka. You configure a source connector and a sink to define where events come from and where they are delivered.

Important

Debezium Server is a Technology Preview feature. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product features, enabling customers to test functionality and provide feedback during the development process. For more information about the support scope of Red Hat Technology Preview features, see Technology Preview Features Support Scope.

11.1. Debezium Server installation

Download and unpack the Debezium Server distribution to install the server on your system.

Procedure

  1. Open the Download red_hat_build_of_debezium page on the Red Hat Customer Portal.
  2. From the Releases tab, locate Debezium 3.6.3 Debezium Server and click Download Now to download the ZIP file.
  3. Extract the contents of the archive to the directory in which you want to install Debezium.

A directory named debezium-server is created with the following contents:

debezium-server/
    |-- config
    |-- debezium-server-dist-3.6.3.Final-redhat-00008-runner.jar
    |-- jmx
    |-- lib
    |-- lib_metrics
    |-- lib_opt
    |-- run.bat
    |-- run.sh

The lib directory stores dependencies, and the config directory contains configuration files. The run.bat or run.sh file starts the server.

Before you start the server, specify the source for the change events that you want to stream and the sink destination for those events. For details about how to configure Debezium Server, see the Configuration section.

11.1.1. Start the server

Run the Debezium Server startup script to begin streaming change events from your configured source connector to the configured sink.

Prerequisites

Procedure

  1. Open a command prompt or terminal window.
  2. Change to the <ServerInstallDirectory>/debezium-server directory.
  3. Start Debezium Server by entering one of the following commands:

    • On Linux, run the run.sh script:

      ./run.sh
    • On Windows, run the run.bat script:

      run.bat

11.2. Debezium Server configuration

Debezium Server uses MicroProfile Configuration for configuration. MicroProfile configuration is a standard for supplying configuration values to Java applications from multiple sources, including configuration files, environment variables, and system properties.

Note

Configuration properties that contain the $ character are normally interpreted by Quarkus for property expansion. If a property value includes a $ character as a prefix, such as ${my.property}, the Microprofile configuration parser determines that the value is a property expression and attempts to expand it.

To prevent the parser from attempting to expand values that use this syntax, escape the $ prefix with a second $ character; that is, provide the value as $${my.property}. The value of the property is then passed to Debezium as ${my.property}.

The main configuration file is config/application.properties. There are multiple sections configured:

  • debezium.source is for source connector configuration; each instance of Debezium Server runs exactly one connector
  • debezium.sink is for the sink system configuration
  • debezium.format is for the output serialization format configuration
  • debezium.transforms is for the configuration of message transformations
  • debezium.predicates is for the configuration of message transformation predicates

The following example shows an excerpt from a configuration file:

debezium.sink.type=http
debezium.sink.http.url=https://example.com/events
debezium.source.connector.class=io.debezium.connector.postgresql.PostgresConnector
debezium.source.offset.storage.file.filename=data/offsets.dat
debezium.source.offset.flush.interval.ms=0
debezium.source.database.hostname=localhost
debezium.source.database.port=5432
debezium.source.database.user=postgres
debezium.source.database.password=postgres
debezium.source.database.dbname=postgres
debezium.source.topic.prefix=tutorial
debezium.source.schema.include.list=inventory

The configuration file in the preceding example specifies the following settings:

  • The source connector captures events from a schema named inventory. If you want to capture all changes in the database, remove this line. Otherwise, update this line to correspond to your preferred schema or tables.
  • The source offset is stored in a file named offsets.dat in the data directory. To prevent startup errors, the directory that you specify must exists before you start the server.

After the server starts, it generates a sequence of log messages similar to the following example:

__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2020-05-15 11:33:12,628 INFO  [io.deb.ser.DebeziumServer] (main) Consumer 'io.debezium.server.http.HttpChangeConsumer' instantiated
2020-05-15 11:33:12,754 INFO  [org.apa.kaf.con.jso.JsonConverterConfig] (main) JsonConverterConfig values:
	converter.type = key
	decimal.format = BASE64
	schemas.cache.size = 1000
	schemas.enable = true

2020-05-15 11:33:12,757 INFO  [org.apa.kaf.con.jso.JsonConverterConfig] (main) JsonConverterConfig values:
	converter.type = value
	decimal.format = BASE64
	schemas.cache.size = 1000
	schemas.enable = false

2020-05-15 11:33:12,763 INFO  [io.deb.emb.EmbeddedEngine$EmbeddedConfig] (main) EmbeddedConfig values:
	access.control.allow.methods =
	access.control.allow.origin =
	admin.listeners = null
	bootstrap.servers = [localhost:9092]
	client.dns.lookup = default
	config.providers = []
	connector.client.config.override.policy = None
	header.converter = class org.apache.kafka.connect.storage.SimpleHeaderConverter
	internal.key.converter = class org.apache.kafka.connect.json.JsonConverter
	internal.value.converter = class org.apache.kafka.connect.json.JsonConverter
	key.converter = class org.apache.kafka.connect.json.JsonConverter
	listeners = null
	metric.reporters = []
	metrics.num.samples = 2
	metrics.recording.level = INFO
	metrics.sample.window.ms = 30000
	offset.flush.interval.ms = 0
	offset.flush.timeout.ms = 5000
	offset.storage.file.filename = data/offsets.dat
	offset.storage.partitions = null
	offset.storage.replication.factor = null
	offset.storage.topic =
	plugin.path = null
	rest.advertised.host.name = null
	rest.advertised.listener = null
	rest.advertised.port = null
	rest.extension.classes = []
	rest.host.name = null
	rest.port = 8083
	ssl.client.auth = none
	task.shutdown.graceful.timeout.ms = 5000
	topic.tracking.allow.reset = true
	topic.tracking.enable = true
	value.converter = class org.apache.kafka.connect.json.JsonConverter

2020-05-15 11:33:12,763 INFO  [org.apa.kaf.con.run.WorkerConfig] (main) Worker configuration property 'internal.key.converter' is deprecated and may be removed in an upcoming release. The specified value 'org.apache.kafka.connect.json.JsonConverter' matches the default, so this property can be safely removed from the worker configuration.
2020-05-15 11:33:12,763 INFO  [org.apa.kaf.con.run.WorkerConfig] (main) Worker configuration property 'internal.value.converter' is deprecated and may be removed in an upcoming release. The specified value 'org.apache.kafka.connect.json.JsonConverter' matches the default, so this property can be safely removed from the worker configuration.
2020-05-15 11:33:12,765 INFO  [org.apa.kaf.con.jso.JsonConverterConfig] (main) JsonConverterConfig values:
	converter.type = key
	decimal.format = BASE64
	schemas.cache.size = 1000
	schemas.enable = true

2020-05-15 11:33:12,765 INFO  [org.apa.kaf.con.jso.JsonConverterConfig] (main) JsonConverterConfig values:
	converter.type = value
	decimal.format = BASE64
	schemas.cache.size = 1000
	schemas.enable = true

2020-05-15 11:33:12,767 INFO  [io.deb.ser.DebeziumServer] (main) Engine executor started
2020-05-15 11:33:12,773 INFO  [org.apa.kaf.con.sto.FileOffsetBackingStore] (pool-3-thread-1) Starting FileOffsetBackingStore with file data/offsets.dat
2020-05-15 11:33:12,835 INFO  [io.deb.con.com.BaseSourceTask] (pool-3-thread-1) Starting PostgresConnectorTask with configuration:
2020-05-15 11:33:12,837 INFO  [io.deb.con.com.BaseSourceTask] (pool-3-thread-1)    connector.class = io.debezium.connector.postgresql.PostgresConnector
2020-05-15 11:33:12,837 INFO  [io.deb.con.com.BaseSourceTask] (pool-3-thread-1)    offset.flush.interval.ms = 0
2020-05-15 11:33:12,838 INFO  [io.deb.con.com.BaseSourceTask] (pool-3-thread-1)    database.user = postgres
2020-05-15 11:33:12,838 INFO  [io.deb.con.com.BaseSourceTask] (pool-3-thread-1)    database.dbname = postgres
2020-05-15 11:33:12,838 INFO  [io.deb.con.com.BaseSourceTask] (pool-3-thread-1)    offset.storage.file.filename = data/offsets.dat
2020-05-15 11:33:12,838 INFO  [io.deb.con.com.BaseSourceTask] (pool-3-thread-1)    database.hostname = localhost
2020-05-15 11:33:12,838 INFO  [io.deb.con.com.BaseSourceTask] (pool-3-thread-1)    database.password = ********
2020-05-15 11:33:12,839 INFO  [io.deb.con.com.BaseSourceTask] (pool-3-thread-1)    name = http
2020-05-15 11:33:12,839 INFO  [io.deb.con.com.BaseSourceTask] (pool-3-thread-1)    topic.prefix = tutorial
2020-05-15 11:33:12,839 INFO  [io.deb.con.com.BaseSourceTask] (pool-3-thread-1)    database.port = 5432
2020-05-15 11:33:12,839 INFO  [io.deb.con.com.BaseSourceTask] (pool-3-thread-1)    schema.include.list = inventory
2020-05-15 11:33:12,908 INFO  [io.quarkus] (main) debezium-server 1.2.0-SNAPSHOT (powered by Quarkus 1.4.1.Final) started in 1.198s. Listening on: http://0.0.0.0:8080
2020-05-15 11:33:12,911 INFO  [io.quarkus] (main) Profile prod activated.
2020-05-15 11:33:12,911 INFO  [io.quarkus] (main) Installed features: [cdi, smallrye-health]

Source configuration properties specify which connector Debezium Server runs and configure offset and schema history storage outside of Kafka Connect.

Most source configuration properties correspond to properties that are documented for individual connectors. To use these properties in Debezium Server, prepend the debezium.source. prefix to the connector property name. Debezium Server also provides additional source configuration properties for settings that Kafka Connect normally handles automatically. For example, debezium.source.offset.storage and debezium.source.offset.storage.file.filename to configure file-based offset storage.

PropertyDefaultDescription

debezium.source.connector.class

 

The name of the Java class implementing the source connector.

debezium.source.offset.storage

org.apache.kafka.connect.storage.FileOffsetBackingStore

Class to use for storing and retrieving offsets for non-Kafka deployments. Available options

  • org.apache.kafka.connect.storage.FileOffsetBackingStore for non-Kafka deployments
  • org.apache.kafka.connect.storage.MemoryOffsetBackingStore volatile store for test environments
  • io.debezium.storage.jdbc.offset.JdbcOffsetBackingStore for database using JDBC

debezium.source.offset.storage.file.filename

 

If using a file offset store (default), the file in which connector offsets are stored for non-Kafka deployments.

debezium.source.offset.flush.interval.ms

 

Defines how frequently the offsets are flushed into the file.

debezium.source.schema.history.internal

io.debezium.storage.kafka.history.KafkaSchemaHistory

Some of the connectors (e.g MySQL, SQL Server, Db2, Oracle) track the database schema evolution over time and stores this data in a database schema history. This is by default based on Kafka. There are also other options available

  • io.debezium.storage.file.history.FileSchemaHistory for non-Kafka deployments
  • io.debezium.relational.history.MemorySchemaHistory volatile store for test environments

debezium.source.schema.history.internal.file.filename

 

The name and location of the file to which FileSchemaHistory persists its data.

Configure how Debezium Server serializes message keys and values. You can configure key and value formats independently by using either the default JSON format or a custom Kafka Connect Converter implementation.

PropertyDefaultDescription

debezium.format.key

json

The name of the output format for key, one of json/jsonbytearray/avro/protobuf/simplestring/binary.

debezium.format.key.*

 

Configuration properties passed to the key converter.

debezium.format.value

json

The name of the output format for value, one of json/jsonbytearray/avro/protobuf/cloudevents/simplestring/binary.

debezium.format.value.*

 

Configuration properties passed to the value converter.

debezium.format.header

json

The name of the output format for value, one of json/jsonbytearray.

debezium.format.header.*

 

Configuration properties passed to the header converter.

Configure Kafka Connect Single Message Transformations (SMTs) that Debezium Server applies to messages before it delivers them to the sink. Specify the transformations to apply and the configuration options for each transformation.

The server supports single message transformations defined by Kafka Connect.

PropertyDefaultDescription [id="debezium-transforms"]

debezium.transforms

 

The comma separated list of symbolic names of transformations.

debezium.transforms.<name>.type

 

The name of Java class implementing the transformation with name <name>.

debezium.transforms.<name>.*

 

Configuration properties passed to the transformation with name <name>.

debezium.transforms.<name>.predicate

 

The name of the predicate to be applied to the transformation with name <name>.

debezium.transforms.<name>.negate

false

Determines if the result of the predicate to the transformation with name <name> will be negated.

Configure predicates that evaluate messages and determine when Debezium Server applies message transformations. Debezium Server supports the Kafka Connect predicate framework for conditional Single Message Transformations (SMTs). Predicate properties specify the predicates to use, their implementation classes, and their configuration options.

PropertyDefaultDescription [id="debezium-predicates"]

debezium.predicates

 

The comma separated list of symbolic names of predicates.

debezium.predicates.<name>.type

 

The name of Java class implementing the predicate with name <name>.

debezium.predicates.<name>.*

 

Configuration properties passed to the predicate with name <name>.

You can enable the filter SMT in Debezium Server to selectively pass or discard change events based on expression-based conditions that you define.

Because filter expressions are evaluated by a scripting engine running inside the Debezium Server process, this feature is only safe to enable in environments where access to the server configuration is restricted to authorized operators. Scripting support is therefore disabled by default and must be explicitly enabled.

To enable message filtering, set the environment variable ENABLE_DEBEZIUM_SCRIPTING to true before starting Debezium Server. When yhou enable this setting, the startup script adds the debezium-scripting JAR and the JSR 223 script engine implementations (Groovy and GraalVM JavaScript) from the opt_lib directory of the Debezium Server distribution to the server classpath. These libraries are kept in opt_lib rather than on the default classpath precisely so that scripting is never available unless an operator makes a conscious decision to include them.

Additional resources

By default, Debezium Server uses the asynchronous embedded engine (AsyncEmbeddedEngine) to process change events. Use the following properties to configure record-processing threads, task lifecycle management, and engine shutdown behavior.

Property

Default

Description

record.processing.threads

Threads allocated on demand, based on the workload and the number of available CPU cores.

The number of threads that are available to process change event records. If no value is specified (the default), the engine uses the Java ThreadPoolExecutor to dynamically adjust the number of threads, based on the current workload. Maximum number of threads is number of CPU cores on given machine. If a value is specified, the engine uses the Java fixed thread pool method to create a thread pool with the specified number of threads. To use all available cores on given machine, set the placeholder value, AVAILABLE_CORES.

record.processing.shutdown.timeout.ms

1000

Maximum time, in milliseconds, that the engine allows for processing pending records after a task shutdown is called.

task.management.timeout.ms

180,000 (3 min)

Time, in milliseconds, that the engine waits for a task’s lifecycle management operations (starting and stopping) to complete.

Debezium Server runs on the Quarkus framework. All configuration properties that Quarkus exposes are available in Debezium Server. The following table lists commonly used Quarkus properties for configuring HTTP endpoint access and logging behavior.

PropertyDefaultDescription [id="debezium-quarkus-http-port"]

quarkus.http.port

8080

The port on which Debezium exposes Microprofile Health endpoint and other exposed status information. Health can be accessed on http://host:8080/q/health.

quarkus.log.level

INFO

The default log level for every log category.

quarkus.log.console.json

true

Determine whether to enable the JSON console formatting extension, which disables "normal" console formatting.

You can disable JSON logging by setting quarkus.log.console.json=false in the config/application.properties file. For details, see the example in the file.

11.2.8. Debezium Server sink configuration

Debezium Server supports implementations for delivering change events to different sink destinations. Configure the destination to which Debezium Server delivers change events. Set the debezium.sink.type property to specify the sink implementation, and then configure the properties that apply to the selected sink.

11.2.8.1. HTTP Client sink configuration

Configure the HTTP Client sink to deliver change events from Debezium Server to an HTTP endpoint for downstream processing. The HTTP Client sink supports optional JWT and OAuth 2.0 client credentials authentication, and provides options for configuring batched event delivery.

You can use the HTTP Client sink to integrate Debezium Server with Knative and enable it to act as a Knative Event Source.

PropertyDefaultDescription

debezium.sink.type

 

Must be set to http

debezium.sink.http.url

 

The HTTP Server URL to stream events to. This can also be set by defining the K_SINK environment variable, which is used by the Knative source framework.

debezium.sink.http.timeout.ms

60000

The number of seconds to wait for a response from the server before timing out. (default of 60s)

debezium.sink.http.retries

5

The number retries before exception is thrown (default 5 times).

debezium.sink.http.retry.interval.ms

1000

The number of milliseconds to wait before another attempt to send record is made after failure (default of 1s).

debezium.sink.http.headers.prefix

X-DEBEZIUM-

Headers will be prefixed with this value (defaults to X-DEBEZIUM-).

debezium.sink.http.headers.encode.base64

true

Header values will be base64 encoded (defaults to true).

debezium.sink.http.batch.enabled

false

When set to true, aggregates all change events in a batch into a JSON array and sends them in a single HTTP POST request instead of sending each event individually.

debezium.sink.http.batch.max-size

200

The maximum number of events per HTTP request when batch mode is enabled. If the engine delivers more events than this limit, they are chunked into multiple requests.

debezium.sink.http.authentication.type

 

Specifies the type of authentication the HTTP client sink uses when connecting to an HTTP server. Supports one of the following options:

jwt
JSON Web Token (JWT) authentication.
oauth2
OAuth2 client credentials grant (RFC 6749 Section 4.4).
standard-webhooks
Standard Webhooks.

If you omit this property, the HTTP client sink does not use authentication headers for the connection

debezium.sink.http.authentication.jwt.username

 

Specifies the username for JWT authentication.

debezium.sink.http.authentication.jwt.password

 

Specifies the password for JWT authentication.

debezium.sink.http.authentication.jwt.url

 

Specifies the base URL (e.g., http://myserver:8000/) for JWT authentication. The paths auth/authenticate and auth/refreshToken are appended for the JWT initial and authentication REST requests.

debezium.sink.http.authentication.jwt.token_expiration

 

Requested duration (in minutes) before the authentication token expires.

debezium.sink.http.authentication.jwt.refresh_token_expiration

 

Requested duration (in minutes) before the refresh token expires.

debezium.sink.http.authentication.webhook.secret

 

The webhooks signing secret that Debezium uses to generate HMAC-SHA256 signatures for the webhook request. The secret must be Base64-encoded, with a size from 24 bytes to 64 bytes (192–512 bits). Optionally, you can add the prefix whsec_ to the secret to help distinguish it from other types of keys or tokens. For more information about implementing or validating webhook signatures, see the Standard Webhooks specification.

debezium.sink.http.authentication.oauth2.client_id

 

Specifies the OAuth2 client ID for the client credentials grant.

debezium.sink.http.authentication.oauth2.client_secret

 

Specifies the OAuth2 client secret for the client credentials grant.

debezium.sink.http.authentication.oauth2.token_url

 

The URL of the OAuth2 token endpoint (e.g., https://auth.example.com/oauth/token).

debezium.sink.http.authentication.oauth2.scope

 

Optional space-separated list of OAuth2 scopes to request (e.g., data:read data:write).

debezium.sink.http.authentication.oauth2.client_auth_method

client_secret_basic

Specifies how client credentials are sent to the token endpoint. Supports one of the following options:

client_secret_basic
Sends credentials as an HTTP Basic Authorization header (RFC 6749 Section 2.3.1).
client_secret_post
Sends client_id and client_secret as form fields in the POST request body.

debezium.sink.http.authentication.oauth2.token_url.http_method

POST

The HTTP method to use for token requests. The OAuth2 specification requires POST, but some providers accept GET with query parameters. Set to GET only for providers that do not support the standard POST method.

debezium.sink.http.authentication.oauth2.params.*

 

Optional additional parameters to include in the token request. For example, some providers require an audience or resource parameter. Set these using the params. prefix, for example, debezium.sink.http.authentication.oauth2.params.audience=\https://my-api.example.com.

11.2.8.2. Apache Kafka sink configuration

Configure the Apache Kafka sink to publish change events from Debezium Server to Kafka topics. Use the sink properties to specify broker connection details and other Kafka-specific settings.

PropertyDefaultDescription

debezium.sink.type

 

Must be set to kafka.

debezium.sink.kafka.producer.*

 

The Kafka sink adapter supports pass-through configuration. This means that all Kafka producer configuration properties are passed to the producer with the prefix removed. At least bootstrap.servers, key.serializer and value.serializer properties must be provided. The topic is set by Debezium.

debezium.sink.kafka.wait.message.delivery.timeout.ms

30000

The maximum time, in milliseconds, that the server waits for a request to complete and return metadata for a record. The specified timeout also governs the interval that the server waits for Kafka to respond to a request. Set the value to 0 to disable the timeout.

11.2.8.2.1. Apache Kafka sink injection points

Customize Kafka sink behavior by providing implementations of supported extension points. For example, you can implement a custom StreamNameMapper to control how Debezium Server maps source streams to Kafka topics. If you do not provide a custom implementation, Debezium Server uses the default implementation.

InterfaceCDI classifierDescription

io.debezium.server.StreamNameMapper

 

Custom implementation maps the original destination (topic) name into another Kafka topic. By default, the same name is used.

Revised on 2026-10-14 18:57:30 UTC

Red Hat logoGithubRedditYoutubeTwitter

Learn

Try, buy, & sell

Communities

About Red Hat

We deliver hardened solutions that make it easier for enterprises to work across platforms and environments, from the core datacenter to the network edge.

Making open source more inclusive

Red Hat is committed to replacing problematic language in our code, documentation, and web properties. For more details, see the Red Hat Blog.

About Red Hat Documentation

Legal Notice

Theme

© 2026 Red Hat
Back to top