Apache Pulsar Reference¶
Look-up facts for Apache Pulsar: release lines and support windows, Java requirements, ports, metadata store URLs, key broker.conf and bookkeeper.conf settings with their defaults, subscription types, authentication providers, protocol handlers, CVEs, and a hardening checklist. For how the pieces fit together, see Explanation. For step-by-step tasks, see How-to Guides.
Provenance
Defaults below come from conf/broker.conf, conf/bookkeeper.conf, and conf/pulsar_env.sh on the branch-4.2 branch of apache/pulsar, checked 2026-09-25. Release dates come from the Pulsar website's release data (data/release-pulsar.js in apache/pulsar-site), cross-checked against the Maven Central pulsar-client version list.
Release Lines and Support Windows¶
Pulsar uses LTS.feature.patch versioning. A major-version bump signals a new LTS line, not a set of breaking changes (release policy).
| Release type | Frequency | Active support | Security support |
|---|---|---|---|
| LTS (x.0) | Every 18 months | 24 months | 36 months |
| Feature (x.1, x.2, ...) | Every 3 months (target) | 6 months | 6 months |
| Patch | When ready | n/a | n/a |
| Milestone (x.0.0-Mn) | Before an LTS | Not supported, not for production | Not supported |
Support windows start from the release date of the line's first release (x.y.0). The Pulsar website computes them with that rule. The table below applies the same rule (status as of 2026-09-25).
| Line | Type | First release | Latest release | Active support ends | Security support ends | Status |
|---|---|---|---|---|---|---|
| 5.0 | Next LTS (milestones) | 5.0.0-M1 (2026-06-23) | 5.0.0-M2 (tagged 2026-09-12) | n/a | n/a | Preview only. GA "expected later in 2026" (M1 notes) |
| 4.2 | Feature | 4.2.0 (2026-03-24) | 4.2.4 (2026-08-03) | 2026-09-24 | 2026-09-24 | Newest feature line. Its computed 6-month window has just ended, and no 4.3 has been released |
| 4.1 | Feature | 4.1.0 (2025-09-08) | 4.1.3 (2026-02-19) | 2026-03-08 | 2026-03-08 | Ended |
| 4.0 | LTS | 4.0.0 (2024-10-21) | 4.0.13 (2026-08-03) | 2026-10-21 | 2027-10-21 | Supported (the production default) |
| 3.3 | Feature | 3.3.0 (2024-06-05) | 3.3.9 (2025-09-27) | 2024-12-05 | 2024-12-05 | Ended |
| 3.0 | LTS | 3.0.0 (2023-05-02) | 3.0.17 (2026-04-23) | 2025-05-02 | 2026-05-02 | Ended |
| 2.11 and older | Pre-3.0 | - | 2.11.4 (2024-03-08) | Ended | Ended | Ended |
Upgrade rules
- Since 3.0, you can do a live upgrade and downgrade between one LTS and the next. For example, 3.0 -> 4.0 -> 3.0 is supported, but 3.2 -> 5.0 is not.
- Before 3.0, upgrades had to go through each feature version in turn (2.8 -> 2.9 -> 2.10).
- Upgrade clients and clusters to a supported line before you file issues upstream.
Recent release highlights¶
| Release | Highlights (from the release notes) |
|---|---|
| 4.0.0 (2024-10-21) | Enhanced Key_Shared implementation (PIP-379 draining hashes), Alpine-based Docker image on Java 21, multi-tenant rate-limiting and QoS work, PIP-366 separate configs for the configuration and local metadata stores. The Oxia metadata plugin (PIP-335) had already landed in 3.3 |
| 4.1.0 (2025-09-08) | Batch index ACK enabled by default (PIP-391), broker cache refactor (PIP-430), global topic-level replication policies (PIP-422), third-party schema registry integration hook for clients (PIP-420), BookKeeper 4.17.2 |
| 4.2.0 (2026-03-24) | Memory limits for topic-list commands (PIP-442), native OpenTelemetry tracing in the Java client (PIP-446), customizable Prometheus topic labels (PIP-447), metadata store threading rework (PIP-453), Jetty 12, BookKeeper 4.17.3, Oxia client 0.7.x |
| 5.0.0-M1 (2026-06-23) | Scalable Topics (PIP-460), V5 Java client (PIP-466), Oxia as the recommended metadata store, ZooKeeper-to-Oxia live migration (PIP-454), etcd backend removed (PIP-462), IO connectors split out (PIP-465), Gradle build (PIP-463), javax to jakarta (PIP-472), BookKeeper 4.18.0 |
| 5.0.0-M2 (2026-09) | Key_Shared-style consumption for scalable topics (PIP-486), asynchronous v5 auth and TLS plugin interfaces (PIP-478), close inactive topics without deleting data (PIP-470), default JDK 25 for the build. JUL logging config no longer takes effect on the server side |
Java Version Requirements¶
From the apache/pulsar README:
| Pulsar version | Broker | Functions / IO | CLI | Java client | Docker image runtime |
|---|---|---|---|---|---|
| >= 4.1 and master | 21 | 21 | 17 or 21 | 17 or 21 | 21 |
| 3.3 to 4.0 | 21 | 21 | 17 or 21 | 8, 11, 17 or 21 | 21 |
| 2.10 to 3.0 | 17 | 17 | 17 | 8, 11 or 17 | 17 |
| 2.8 to 2.10 | 11 | 11 | 8 or 11 | 8 or 11 | - |
Note
The README recommends a recent patch of Java 17 or 21. JDK-8351933 can cause instability and is fixed in 17.0.17+ and 21.0.8+. The 5.0 milestones also build and run on Java 25.
Default Ports¶
| Component | Port | Setting | Notes |
|---|---|---|---|
| Broker binary protocol | 6650 | brokerServicePort |
pulsar:// |
| Broker binary protocol (TLS) | 6651 (convention) | brokerServicePortTls |
Empty (disabled) by default. pulsar+ssl:// |
| Broker HTTP (admin REST, lookups, metrics) | 8080 | webServicePort |
/metrics for Prometheus |
| Broker HTTPS | 8443 (convention) | webServicePortTls |
Empty (disabled) by default |
| Functions worker (standalone mode) | 6750 / 6751 | workerPort / workerPortTls |
conf/functions_worker.yml |
| BookKeeper bookie | 3181 | bookiePort |
Broker-to-bookie data traffic |
| Bookie HTTP admin | 8000 | httpServerPort |
httpServerEnabled=false by default |
| ZooKeeper client | 2181 | clientPort |
conf/zookeeper.conf |
| Oxia public / internal | 6648 / 6649 | Oxia server | Ports used in the Pulsar Helm chart values.yaml |
Deprecated TLS toggle
tlsEnabled is deprecated. Enable TLS by setting brokerServicePortTls and webServicePortTls.
Metadata Store Backends¶
| Backend | URL format | Supported in | Notes |
|---|---|---|---|
| Apache ZooKeeper | zk:zk1:2181,zk2:2181,zk3:2181 |
All versions | Bundled (ZooKeeper 3.9.x in 4.2). Still fully supported in 5.0 |
| Oxia | oxia://oxia-1:6648/broker |
Plugin since 3.3 (PIP-335). Recommended for new clusters from 5.0 | Namespaces must exist in the Oxia coordinator config. Use a separate namespace for BookKeeper |
| etcd | etcd:http://etcd-1:2379,... |
Up to 4.x | Removed in 5.0 (PIP-462). Migrate to ZooKeeper or Oxia before you upgrade |
| RocksDB | rocksdb://data/metadata |
Standalone / single node only | |
| Local memory | memory://local |
Standalone / tests only |
BookKeeper metadata goes through the Pulsar metadata driver:
| Setting | Example |
|---|---|
metadataStoreUrl (broker) |
oxia://oxia-1.example.com:6648/broker |
configurationMetadataStoreUrl (broker) |
Optional. Defaults to metadataStoreUrl |
bookkeeperMetadataServiceUri (broker) |
metadata-store:oxia://oxia-1.example.com:6648/bookkeeper |
metadataServiceUri (bookie) |
metadata-store:zk:my-zk-1:2181/ledgers (required to take part in a ZooKeeper-to-Oxia migration) |
Broker Configuration Keys¶
Selected broker.conf keys with their branch-4.2 defaults.
| Key | Default | Meaning |
|---|---|---|
metadataStoreUrl |
(empty) | Local metadata store |
configurationMetadataStoreUrl |
(empty, uses metadataStoreUrl) |
Configuration store (tenants, namespaces, clusters) |
clusterName |
(empty) | This cluster's name |
managedLedgerDefaultEnsembleSize |
2 |
Bookies per ledger (E) |
managedLedgerDefaultWriteQuorum |
2 |
Copies written per entry (Qw) |
managedLedgerDefaultAckQuorum |
2 |
Acks needed before a write completes (Qa) |
managedLedgerCacheSizeMB |
(empty, 1/5 of direct memory) | Broker entry cache |
managedLedgerMaxEntriesPerLedger |
50000 |
Ledger rollover by entries |
managedLedgerMinLedgerRolloverTimeMinutes / Max... |
10 / 240 |
Ledger rollover time bounds |
managedLedgerOffloadDriver |
(empty) | aws-s3, google-cloud-storage, azureblob, filesystem, ... |
managedLedgerOffloadThresholdInSeconds |
-1 (off) |
Time-based automatic offload |
managedLedgerOffloadAutoTriggerSizeThresholdBytes |
-1 (off) |
Size-based automatic offload |
managedLedgerOffloadDeletionLagMs |
14400000 (4 h) |
Delay before offloaded ledgers are deleted from bookies |
dispatcherMaxRoundRobinBatchSize |
20 |
Shared-subscription dispatch batch |
allowAutoTopicCreationType |
non-partitioned |
Topic type used for auto-creation |
defaultNumberOfNamespaceBundles |
4 |
Bundles per new namespace |
brokerDeleteInactiveTopicsEnabled |
true |
Garbage-collect inactive topics |
brokerDeduplicationEnabled |
false |
Producer message deduplication |
subscriptionTypesEnabled |
Exclusive,Shared,Failover,Key_Shared |
Allowed subscription types |
systemTopicEnabled / topicLevelPoliciesEnabled |
true / true |
System topics and topic-level policies |
enableReplicatedSubscriptions |
true |
Allow replicated subscriptions for geo-replication |
createTopicToRemoteClusterForReplication |
true |
Create partitioned-topic metadata on remote clusters |
configurationMetadataSyncEventTopic |
(empty) | Sync configuration metadata across clusters that do not share a store |
backlogQuotaDefaultLimitBytes |
-1 |
Default backlog quota (disabled) |
defaultRetentionTimeInMinutes / defaultRetentionSizeInMB |
0 / 0 |
Default retention (none) |
schemaCompatibilityStrategy |
FULL |
Default schema compatibility |
isAllowAutoUpdateSchemaEnabled |
true |
Producers may auto-register new schema versions |
loadManagerClassName |
...ModularLoadManagerImpl |
Load manager. ExtensibleLoadManagerImpl is the newer option |
loadBalancerLoadSheddingStrategy |
...ThresholdShedder |
Load-shedding algorithm |
transactionCoordinatorEnabled |
false |
Turn on transactions |
functionsWorkerEnabled |
false |
Run the functions worker inside the broker |
authenticationEnabled / authorizationEnabled |
false / false |
Security switches |
authorizationProvider |
...PulsarAuthorizationProvider |
Role-based authorization |
superUserRoles |
(empty) | Super-user roles |
tlsRequireTrustedClientCertOnConnect |
false |
Require client certificates (mTLS) |
exposeTopicLevelMetricsInPrometheus |
true |
Per-topic metrics |
JVM memory is set in conf/pulsar_env.sh. The default is PULSAR_MEM="-Xms2g -Xmx2g -XX:MaxDirectMemorySize=4g".
BookKeeper Configuration Keys¶
Key (bookkeeper.conf) |
Default | Meaning |
|---|---|---|
bookiePort |
3181 |
Bookie port |
journalDirectories |
(see journalDirectory) |
Write-ahead journal. Put it on the fastest device |
ledgerDirectories |
data/bookkeeper/ledgers |
Entry log and index storage |
ledgerStorageClass |
...DbLedgerStorage |
RocksDB-indexed ledger storage |
journalSyncData |
true |
fsync the journal before acking. Keep it on in production |
journalMaxGroupWaitMSec |
1 |
Group-commit wait |
gcWaitTime |
900000 (15 min) |
Garbage-collection interval for deleted ledgers |
minorCompactionThreshold / majorCompactionThreshold |
0.2 / 0.5 |
Entry-log compaction thresholds |
autoRecoveryDaemonEnabled |
true |
Run AutoRecovery inside the bookie |
dbStorage_writeCacheMaxSizeMb / dbStorage_readAheadCacheMaxSizeMb |
(empty, derived from direct memory) | DbLedgerStorage caches |
Transaction Settings¶
From the transactions docs:
| Key | Default |
|---|---|
transactionCoordinatorEnabled |
false |
transactionLogBatchedWriteEnabled |
false |
transactionLogBatchedWriteMaxRecords |
512 |
transactionLogBatchedWriteMaxSize |
4194304 (4 MB) |
transactionLogBatchedWriteMaxDelayInMillis |
1 |
transactionPendingAckBatchedWriteEnabled |
false |
transactionBufferSegmentedSnapshotEnabled |
false |
transactionBufferSnapshotMaxTransactionCount |
1000 |
transactionBufferSnapshotMinTimeInMillis |
5000 |
Pulsar transactions provide read-committed isolation. The transaction ID is 128 bits. The top 16 bits identify the transaction coordinator.
Subscription Types¶
| Type | Consumers | Ordering | Typical use |
|---|---|---|---|
| Exclusive | One. A second consumer is rejected | Total per partition | Single ordered processor |
| Failover | One active, others on standby | Total per partition | Ordered processing with HA |
| Shared | Many, round-robin | None | Work queue |
| Key_Shared | Many, hash-routed by key | Per key | Parallel processing with per-key order |
The V5 client (5.0 milestones) replaces these for scalable topics with StreamConsumer (instead of Exclusive/Failover), QueueConsumer (instead of Shared/Key_Shared), and CheckpointConsumer (no subscription, position tracked by the application, for Flink or Spark).
Authentication Providers¶
| Mechanism | Broker provider class | Notes |
|---|---|---|
| JWT token | org.apache.pulsar.broker.authentication.AuthenticationProviderToken |
tokenSecretKey (HMAC) or tokenPublicKey (RSA/EC). tokenAudience pins the audience |
| mTLS | org.apache.pulsar.broker.authentication.AuthenticationProviderTls |
Certificate CN becomes the role |
| OpenID Connect | org.apache.pulsar.broker.authentication.oidc.AuthenticationProviderOpenID |
Validates IdP-issued JWTs. The client side uses the OAuth 2.0 client-credentials flow |
| Athenz | org.apache.pulsar.broker.authentication.AuthenticationProviderAthenz |
Yahoo identity service |
| Kerberos (SASL) | org.apache.pulsar.broker.authentication.AuthenticationProviderSasl |
|
| HTTP Basic | org.apache.pulsar.broker.authentication.AuthenticationProviderBasic |
Dev and test only |
pulsar-admin permission actions: produce, consume, sources, sinks, functions, packages. Subscription auth modes (set-subscription-auth-mode): None, Prefix.
Protocol Handlers and Ecosystem Status¶
| Component | Status (2026-09) | Source |
|---|---|---|
| KoP (Kafka on Pulsar) | Archived by StreamNative. The README points users to "Kafka on StreamNative" (KSN) | streamnative/kop |
| MoP (MQTT on Pulsar) | Open-source StreamNative protocol handler | streamnative/mop |
| AoP (AMQP 0-9-1 on Pulsar) | Basic produce and consume only, no transactions. Experimental | streamnative/aop |
| Pulsar SQL (Presto/Trino) | Removed from apache/pulsar in December 2023 (last shipped in 3.0.x). Extracted to apache/pulsar-sql in October 2024 | apache/pulsar-sql |
| Pulsar IO connectors | In the core repo up to 4.x. Split into a separate repository in 5.0 (PIP-465) | 5.0.0-M1 release notes |
| etcd metadata backend | Removed in 5.0 (PIP-462) | 5.0.0-M1 release notes |
Kubernetes (Helm Chart)¶
| Fact | Value |
|---|---|
| Chart repo | helm repo add apachepulsar https://pulsar.apache.org/charts, chart apachepulsar/pulsar |
| Chart version on master (2026-09-25) | 4.7.0, appVersion 4.0.12 (the default image follows the 4.0 LTS line) |
| Minimum Kubernetes | 1.25 |
| Metadata store toggle | components.zookeeper: true (default) or components.oxia: true. With Oxia and no ZooKeeper, Functions need FileSystemPackagesStorage |
| Oxia image in chart | oxia/oxia:0.16.10 |
CVE History (selected)¶
| CVE | Component | Summary | Fixed / action |
|---|---|---|---|
| CVE-2025-30677 | Pulsar IO Kafka connectors | Sensitive information logged | See advisory. Upgrade connectors |
| CVE-2024-47561 | Avro Java SDK < 1.11.4 (used by the Java client) | Critical RCE through schema parsing | Expedited 3.0.7 and 3.3.2 (2024-10-04). Upgrade Java clients |
| CVE-2024-29834 | Broker admin API | Users with produce or consume permission could run management operations (unload, compaction) on partitioned topics | Upgrade to a supported line |
| CVE-2024-27317 | Functions Worker | Archive-extraction path traversal (CVSS 8.4) | 2.10.6, 2.11.4, 3.0.3, 3.1.3, 3.2.1 |
| CVE-2023-37579 | Functions Worker | Any authenticated user could read source or sink configs (which may hold credentials) | 2.10.4, 2.11.1 |
The full list is on the Pulsar security page. Security advisories are announced on [email protected].
Hardening Checklist¶
- TLS on every listener (
brokerServicePortTls,webServicePortTls). mTLS broker-to-broker and broker-to-bookie. - JWT or OIDC authentication with short token TTLs and audience pinning (
tokenAudience). -
authorizationEnabled=true. Tenant-scoped roles and a minimalsuperUserRoleslist. -
subscriptionAuthMode=Prefixon shared-tenant namespaces. - Schema auto-update disabled in production (
set-is-allow-auto-update-schema --disable). Admins register schemas. - Tiered-storage bucket: server-side encryption (bucket default SSE-KMS) and a bucket policy that blocks public access.
- Metadata store locked down: ZooKeeper ACLs and TLS, or Oxia on a private network. No anonymous access.
- BookKeeper bookie authentication (SASL or TLS certificates). Bookies on a private network.
- End-to-end encryption for sensitive payloads.
- Pulsar Functions packages reviewed. Functions worker isolated from the production network.
- Java clients on a version with Avro >= 1.11.4 (CVE-2024-47561).
- Subscribed to Apache Pulsar security advisories.