What Is New in Apache Kafka 3.9
Apache Kafka 3.9.0 is the final major release supporting ZooKeeper mode and brings Tiered Storage to full production readiness, dynamic KRaft controller quorums, plus targeted improvements across Streams and Connect.
| Category | Key Changes |
|---|---|
| New Features | Dynamic KRaft Quorums (KIP-853), Tiered Storage production ready (KIP-405), Health check endpoint for Connect (KIP-1017). |
| Improvements | Tiered Storage disablement per topic (KIP-950), tiered storage quotas (KIP-956), expose earliest local and tiered offsets (KIP-1005), improved ZooKeeper to KRaft migration path. |
| Kafka Streams | Configurable summary log interval (KIP-1049), new processing exception handler (KIP-1033). |
| Kafka Connect | Better nullable value handling in transformations (KIP-1040), control offset translation in MirrorSourceConnector (KIP-1031). |
| Deprecations & Removals | Last release with ZooKeeper support. Kafka 4.0 will require KRaft mode only. |
Dynamic KRaft quorums simplify controller management
KIP-853 enables adding and removing controller nodes dynamically in KRaft mode without restarting the entire quorum.
You can manage membership through the kafka-metadata-quorum.sh tool or the AdminClient API.
In practice, this removes the previous static quorum configuration pain point and makes scaling controllers much smoother.
Tiered Storage reaches production readiness
Tiered Storage is now fully production-ready after multiple releases of hardening, allowing you to offload older data to cheaper remote storage like cloud object stores while keeping recent data on local disks.
New capabilities include dynamic disablement per topic, upload/download quotas, and visibility into earliest local versus tiered offsets.
The kafka-dump-log.sh tool also gained a flag to inspect remote log metadata, making debugging easier when tiered storage is active.
ZooKeeper migration gets its final improvements
Kafka 3.9.0 closes the remaining gaps in the ZooKeeper to KRaft migration tooling after testing on thousands of clusters.
This release serves as the recommended bridge before moving to Kafka 4.0, where ZooKeeper support will be completely dropped.
If you are still on ZooKeeper, plan your migration through 3.9 before upgrading further.
Kafka Streams adds better exception handling and logging control
KIP-1033 introduces a dedicated exception handler for errors that occur during record processing inside Streams topologies.
KIP-1049 lets you configure how frequently Streams logs its summary information via log.summary.interval.ms.
These changes give you more precise control over error recovery and reduce log noise in long-running applications.
Kafka Connect receives useful operational enhancements
KIP-1017 adds a simple REST health check endpoint so you can monitor Connect worker status more easily.
Transformations like InsertField and ExtractField now handle nullable values with additional configuration options.
You can also disable offset synchronization in MirrorSourceConnector to avoid unnecessary overhead in certain mirroring scenarios.
Observability improvements for tiered storage
New offsets exposed via KIP-1005 let you see exactly where local disk data ends and remote tiered storage begins for each partition.
This visibility helps when troubleshooting consumption lag or planning storage tier transitions.
Combined with the updated dump log tool, operators now have clearer insight into how data moves between local and remote tiers.
FAQ
Is this the last Kafka version that supports ZooKeeper?
Yes. Kafka 3.9.0 is the final major release with ZooKeeper mode. Kafka 4.0 will require KRaft only.
Is Tiered Storage ready for production use in 3.9?
Yes. After several iterations, Tiered Storage has reached production readiness in Kafka 3.9.0.
How do I add or remove controllers in KRaft mode now?
Use the dynamic quorum features from KIP-853 with the kafka-metadata-quorum.sh tool or AdminClient API. No static configuration changes or full restarts are needed.
What changed for exception handling in Kafka Streams 3.9?
KIP-1033 adds a new exception handler specifically for errors during record processing, giving you more options to handle or recover from processing failures.
Can I disable Tiered Storage on specific topics without restarting brokers?
Yes. KIP-950 allows dynamic disablement of tiered storage on a per-topic basis.