blob: 5d063516ffb810c1074280ea1e0ac44934fc582b [file] [log] [blame]
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar configuration · Apache Pulsar</title><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;style type=&quot;text/css&quot;&gt;"/><meta name="docsearch:version" content="2.5.2"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Pulsar configuration · Apache Pulsar"/><meta property="og:type" content="website"/><meta property="og:url" content="https://pulsar.apache.org/"/><meta property="og:description" content="&lt;style type=&quot;text/css&quot;&gt;"/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://pulsar.apache.org/img/pulsar.svg"/><link rel="shortcut icon" href="/img/pulsar.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css"/><link rel="alternate" type="application/atom+xml" href="https://pulsar.apache.org/blog/atom.xml" title="Apache Pulsar Blog ATOM Feed"/><link rel="alternate" type="application/rss+xml" href="https://pulsar.apache.org/blog/feed.xml" title="Apache Pulsar Blog RSS Feed"/><link rel="stylesheet" href="/css/code-blocks-buttons.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script><script type="text/javascript" src="/js/custom.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/en"><img class="logo" src="/img/pulsar.svg" alt="Apache Pulsar"/></a><a href="/en/versions"><h3>2.5.2</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/en/2.5.2/getting-started-standalone" target="_self">Docs</a></li><li class=""><a href="/en/download" target="_self">Download</a></li><li class="siteNavGroupActive"><a href="/docs/en/2.5.2/client-libraries" target="_self">Clients</a></li><li class=""><a href="#restapis" target="_self">REST APIs</a></li><li class=""><a href="#cli" target="_self">Cli</a></li><li class=""><a href="/blog/" target="_self">Blog</a></li><li class=""><a href="#community" target="_self">Community</a></li><li class=""><a href="#apache" target="_self">Apache</a></li><li class=""><a href="https://pulsar-next.staged.apache.org/" target="_self">New Website (Beta)</a></li><span><li><a id="languages-menu" href="#"><img class="languages-icon" src="/img/language.svg" alt="Languages icon"/>English</a><div id="languages-dropdown" class="hide"><ul id="languages-dropdown-items"><li><a href="/docs/ja/2.5.2/reference-configuration">日本語</a></li><li><a href="/docs/fr/2.5.2/reference-configuration">Français</a></li><li><a href="/docs/ko/2.5.2/reference-configuration">한국어</a></li><li><a href="/docs/zh-CN/2.5.2/reference-configuration">中文</a></li><li><a href="/docs/zh-TW/2.5.2/reference-configuration">繁體中文</a></li><li><a href="https://crowdin.com/project/apache-pulsar" target="_blank" rel="noreferrer noopener">Help Translate</a></li></ul></div></li><script>
const languagesMenuItem = document.getElementById("languages-menu");
const languagesDropDown = document.getElementById("languages-dropdown");
languagesMenuItem.addEventListener("click", function(event) {
event.preventDefault();
if (languagesDropDown.className == "hide") {
languagesDropDown.className = "visible";
} else {
languagesDropDown.className = "hide";
}
});
</script></span></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Reference</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Get Started</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/pulsar-2.0">Pulsar 2.0</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/getting-started-standalone">Run Pulsar locally</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/getting-started-docker">Run Pulsar in Docker</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/getting-started-helm">Run Pulsar in Kubernetes</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/client-libraries">Use Pulsar with client libraries</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Concepts and Architecture</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/concepts-overview">Overview</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/concepts-messaging">Messaging</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/concepts-architecture-overview">Architecture</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/concepts-clients">Clients</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/concepts-replication">Geo Replication</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/concepts-multi-tenancy">Multi Tenancy</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/concepts-authentication">Authentication and Authorization</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/concepts-topic-compaction">Topic Compaction</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/concepts-tiered-storage">Tiered Storage</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Pulsar Schema</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/schema-get-started">Get started</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/schema-understand">Understand schema</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/schema-evolution-compatibility">Schema evolution and compatibility</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/schema-manage">Manage schema</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Pulsar Functions</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/functions-overview">Overview</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/functions-worker">Setup: Pulsar Functions Worker</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/functions-runtime">Setup: Configure Functions runtime</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/functions-develop">How-to: Develop</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/functions-debug">How-to: Debug</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/functions-deploy">How-to: Deploy</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/functions-cli">Reference: CLI</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/window-functions-context">Window Functions: Context</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Pulsar IO</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/io-overview">Overview</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/io-quickstart">Get started</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/io-use">Use</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/io-debug">Debug</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/io-connectors">Built-in connector</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/io-cdc">CDC connector</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/io-develop">Develop</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/io-cli">CLI</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Pulsar SQL</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/sql-overview">Overview</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/sql-getting-started">Query data</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/sql-deployment-configurations">Configuration and deployment</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/sql-rest-api">REST APIs</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Kubernetes (Helm)</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/helm-overview">Overview</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/helm-prepare">Prepare</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/helm-install">Install</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/helm-deploy">Deployment</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/helm-upgrade">Upgrade</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/helm-tools">Required Tools</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Deployment</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/deploy-aws">Amazon Web Services</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/deploy-kubernetes">Kubernetes</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/deploy-bare-metal">Bare metal</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/deploy-bare-metal-multi-cluster">Bare metal multi-cluster</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/deploy-monitoring">Monitoring</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Administration</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/administration-zk-bk">ZooKeeper and BookKeeper</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/administration-geo">Geo-replication</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/administration-pulsar-manager">Pulsar Manager</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/administration-stats">Pulsar statistics</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/administration-load-balance">Load balance</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/administration-proxy">Pulsar proxy</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/administration-upgrade">Upgrade</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Security</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/security-overview">Overview</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/security-tls-transport">Transport Encryption using TLS</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/security-tls-authentication">Authentication using TLS</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/security-jwt">Authentication using JWT</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/security-athenz">Authentication using Athenz</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/security-kerberos">Authentication using Kerberos</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/security-authorization">Authorization and ACLs</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/security-encryption">End-to-End Encryption</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/security-extending">Extending</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/security-bouncy-castle">Bouncy Castle Providers</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Client Libraries</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/client-libraries-java">Java</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/client-libraries-go">Go</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/client-libraries-python">Python</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/client-libraries-cpp">C++</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/client-libraries-node">Node.js</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/client-libraries-websocket">WebSocket</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Admin API</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/admin-api-overview">Overview</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/admin-api-clusters">Clusters</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/admin-api-tenants">Tenants</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/admin-api-brokers">Brokers</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/admin-api-namespaces">Namespaces</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/admin-api-permissions">Permissions</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/admin-api-persistent-topics">Persistent topics</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/admin-api-non-persistent-topics">Non-Persistent topics</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/admin-api-partitioned-topics">Partitioned topics</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/admin-api-non-partitioned-topics">Non-Partitioned topics</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/admin-api-functions">Functions</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Adaptors</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/adaptors-kafka">Kafka client wrapper</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/adaptors-spark">Apache Spark</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/adaptors-storm">Apache Storm</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Cookbooks</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/cookbooks-tiered-storage">Tiered Storage</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/cookbooks-compaction">Topic compaction</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/cookbooks-deduplication">Message deduplication</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/cookbooks-non-persistent">Non-persistent messaging</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/cookbooks-partitioned">Partitioned Topics</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/cookbooks-retention-expiry">Message retention and expiry</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/cookbooks-encryption">Encryption</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/cookbooks-message-queue">Message queue</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/cookbooks-bookkeepermetadata">BookKeeper Ledger Metadata</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Development</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/develop-tools">Simulation tools</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/developing-binary-protocol">Binary protocol</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/develop-schema">Custom schema storage</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/develop-load-manager">Modular load manager</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/develop-cpp">Building Pulsar C++ client</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Reference</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/reference-terminology">Terminology</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/reference-cli-tools">Pulsar CLI tools</a></li><li class="navListItem navListItemActive"><a class="navItem" href="/docs/en/2.5.2/reference-configuration">Pulsar configuration</a></li><li class="navListItem"><a class="navItem" href="/docs/en/2.5.2/reference-metrics">Pulsar Metrics</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/pulsar/edit/master/site2/docs/reference-configuration.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">Pulsar configuration</h1></header><article><div><span><style type="text/css">
table{
font-size: 80%;
}
</style>
<p>Pulsar configuration can be managed via a series of configuration files contained in the <a href="https://github.com/apache/pulsar/tree/master/conf"><code>conf</code></a> directory of a Pulsar <a href="/docs/en/2.5.2/getting-started-standalone">installation</a></p>
<ul>
<li><a href="#bookkeeper">BookKeeper</a></li>
<li><a href="#broker">Broker</a></li>
<li><a href="#client">Client</a></li>
<li><a href="#service-discovery">Service discovery</a></li>
<li><a href="#log4j">Log4j</a></li>
<li><a href="#log4j-shell">Log4j shell</a></li>
<li><a href="#standalone">Standalone</a></li>
<li><a href="#websocket">WebSocket</a></li>
<li><a href="#pulsar-proxy">Pulsar proxy</a></li>
<li><a href="#zookeeper">ZooKeeper</a></li>
</ul>
<h2><a class="anchor" aria-hidden="true" id="bookkeeper"></a><a href="#bookkeeper" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>BookKeeper</h2>
<p>BookKeeper is a replicated log storage system that Pulsar uses for durable storage of all messages.</p>
<table>
<thead>
<tr><th>Name</th><th>Description</th><th>Default</th></tr>
</thead>
<tbody>
<tr><td>bookiePort</td><td>The port on which the bookie server listens.</td><td>3181</td></tr>
<tr><td>allowLoopback</td><td>Whether the bookie is allowed to use a loopback interface as its primary interface (i.e. the interface used to establish its identity). By default, loopback interfaces are not allowed as the primary interface. Using a loopback interface as the primary interface usually indicates a configuration error. For example, it’s fairly common in some VPS setups to not configure a hostname or to have the hostname resolve to <code>127.0.0.1</code>. If this is the case, then all bookies in the cluster will establish their identities as <code>127.0.0.1:3181</code> and only one will be able to join the cluster. For VPSs configured like this, you should explicitly set the listening interface.</td><td>false</td></tr>
<tr><td>listeningInterface</td><td>The network interface on which the bookie listens. If not set, the bookie will listen on all interfaces.</td><td>eth0</td></tr>
<tr><td>journalDirectory</td><td>The directory where Bookkeeper outputs its write-ahead log (WAL)</td><td>data/bookkeeper/journal</td></tr>
<tr><td>ledgerDirectories</td><td>The directory where Bookkeeper outputs ledger snapshots. This could define multiple directories to store snapshots separated by comma, for example <code>ledgerDirectories=/tmp/bk1-data,/tmp/bk2-data</code>. Ideally, ledger dirs and the journal dir are each in a different device, which reduces the contention between random I/O and sequential write. It is possible to run with a single disk, but performance will be significantly lower.</td><td>data/bookkeeper/ledgers</td></tr>
<tr><td>ledgerManagerType</td><td>The type of ledger manager used to manage how ledgers are stored, managed, and garbage collected. See <a href="http://bookkeeper.apache.org/docs/latest/getting-started/concepts">BookKeeper Internals</a> for more info.</td><td>hierarchical</td></tr>
<tr><td>zkLedgersRootPath</td><td>The root ZooKeeper path used to store ledger metadata. This parameter is used by the ZooKeeper-based ledger manager as a root znode to store all ledgers.</td><td>/ledgers</td></tr>
<tr><td>ledgerStorageClass</td><td>Ledger storage implementation class</td><td>org.apache.bookkeeper.bookie.storage.ldb.DbLedgerStorage</td></tr>
<tr><td>entryLogFilePreallocationEnabled</td><td>Enable or disable entry logger preallocation</td><td>true</td></tr>
<tr><td>logSizeLimit</td><td>Max file size of the entry logger, in bytes. A new entry log file will be created when the old one reaches the file size limitation.</td><td>2147483648</td></tr>
<tr><td>minorCompactionThreshold</td><td>Threshold of minor compaction. Entry log files whose remaining size percentage reaches below this threshold will be compacted in a minor compaction. If set to less than zero, the minor compaction is disabled.</td><td>0.2</td></tr>
<tr><td>minorCompactionInterval</td><td>Time interval to run minor compaction, in seconds. If set to less than zero, the minor compaction is disabled.</td><td>3600</td></tr>
<tr><td>majorCompactionThreshold</td><td>The threshold of major compaction. Entry log files whose remaining size percentage reaches below this threshold will be compacted in a major compaction. Those entry log files whose remaining size percentage is still higher than the threshold will never be compacted. If set to less than zero, the minor compaction is disabled.</td><td>0.5</td></tr>
<tr><td>majorCompactionInterval</td><td>The time interval to run major compaction, in seconds. If set to less than zero, the major compaction is disabled.</td><td>86400</td></tr>
<tr><td>compactionMaxOutstandingRequests</td><td>Sets the maximum number of entries that can be compacted without flushing. When compacting, the entries are written to the entrylog and the new offsets are cached in memory. Once the entrylog is flushed the index is updated with the new offsets. This parameter controls the number of entries added to the entrylog before a flush is forced. A higher value for this parameter means more memory will be used for offsets. Each offset consists of 3 longs. This parameter should not be modified unless you’re fully aware of the consequences.</td><td>100000</td></tr>
<tr><td>compactionRate</td><td>The rate at which compaction will read entries, in adds per second.</td><td>1000</td></tr>
<tr><td>isThrottleByBytes</td><td>Throttle compaction by bytes or by entries.</td><td>false</td></tr>
<tr><td>compactionRateByEntries</td><td>The rate at which compaction will read entries, in adds per second.</td><td>1000</td></tr>
<tr><td>compactionRateByBytes</td><td>Set the rate at which compaction reads entries. The unit is bytes added per second.</td><td>1000000</td></tr>
<tr><td>journalMaxSizeMB</td><td>Max file size of journal file, in megabytes. A new journal file will be created when the old one reaches the file size limitation.</td><td>2048</td></tr>
<tr><td>journalMaxBackups</td><td>The max number of old journal files to keep. Keeping a number of old journal files would help data recovery in special cases.</td><td>5</td></tr>
<tr><td>journalPreAllocSizeMB</td><td>How space to pre-allocate at a time in the journal.</td><td>16</td></tr>
<tr><td>journalWriteBufferSizeKB</td><td>The of the write buffers used for the journal.</td><td>64</td></tr>
<tr><td>journalRemoveFromPageCache</td><td>Whether pages should be removed from the page cache after force write.</td><td>true</td></tr>
<tr><td>journalAdaptiveGroupWrites</td><td>Whether to group journal force writes, which optimizes group commit for higher throughput.</td><td>true</td></tr>
<tr><td>journalMaxGroupWaitMSec</td><td>The maximum latency to impose on a journal write to achieve grouping.</td><td>1</td></tr>
<tr><td>journalAlignmentSize</td><td>All the journal writes and commits should be aligned to given size</td><td>4096</td></tr>
<tr><td>journalBufferedWritesThreshold</td><td>Maximum writes to buffer to achieve grouping</td><td>524288</td></tr>
<tr><td>journalFlushWhenQueueEmpty</td><td>If we should flush the journal when journal queue is empty</td><td>false</td></tr>
<tr><td>numJournalCallbackThreads</td><td>The number of threads that should handle journal callbacks</td><td>8</td></tr>
<tr><td>rereplicationEntryBatchSize</td><td>The number of max entries to keep in fragment for re-replication</td><td>5000</td></tr>
<tr><td>openLedgerRereplicationGracePeriod</td><td>The grace period, in milliseconds, that the replication worker waits before fencing and replicating a ledger fragment that's still being written to upon bookie failure.</td><td>30000</td></tr>
<tr><td>gcWaitTime</td><td>How long the interval to trigger next garbage collection, in milliseconds. Since garbage collection is running in background, too frequent gc will heart performance. It is better to give a higher number of gc interval if there is enough disk capacity.</td><td>900000</td></tr>
<tr><td>gcOverreplicatedLedgerWaitTime</td><td>How long the interval to trigger next garbage collection of overreplicated ledgers, in milliseconds. This should not be run very frequently since we read the metadata for all the ledgers on the bookie from zk.</td><td>86400000</td></tr>
<tr><td>flushInterval</td><td>How long the interval to flush ledger index pages to disk, in milliseconds. Flushing index files will introduce much random disk I/O. If separating journal dir and ledger dirs each on different devices, flushing would not affect performance. But if putting journal dir and ledger dirs on same device, performance degrade significantly on too frequent flushing. You can consider increment flush interval to get better performance, but you need to pay more time on bookie server restart after failure.</td><td>60000</td></tr>
<tr><td>bookieDeathWatchInterval</td><td>Interval to watch whether bookie is dead or not, in milliseconds</td><td>1000</td></tr>
<tr><td>zkServers</td><td>A list of one of more servers on which zookeeper is running. The server list can be comma separated values, for example: zkServers=zk1:2181,zk2:2181,zk3:2181.</td><td>localhost:2181</td></tr>
<tr><td>zkTimeout</td><td>ZooKeeper client session timeout in milliseconds Bookie server will exit if it received SESSION_EXPIRED because it was partitioned off from ZooKeeper for more than the session timeout JVM garbage collection, disk I/O will cause SESSION_EXPIRED. Increment this value could help avoiding this issue</td><td>30000</td></tr>
<tr><td>serverTcpNoDelay</td><td>This settings is used to enabled/disabled Nagle’s algorithm, which is a means of improving the efficiency of TCP/IP networks by reducing the number of packets that need to be sent over the network. If you are sending many small messages, such that more than one can fit in a single IP packet, setting server.tcpnodelay to false to enable Nagle algorithm can provide better performance.</td><td>true</td></tr>
<tr><td>openFileLimit</td><td>Max number of ledger index files could be opened in bookie server If number of ledger index files reaches this limitation, bookie server started to swap some ledgers from memory to disk. Too frequent swap will affect performance. You can tune this number to gain performance according your requirements.</td><td>0</td></tr>
<tr><td>pageSize</td><td>Size of a index page in ledger cache, in bytes A larger index page can improve performance writing page to disk, which is efficient when you have small number of ledgers and these ledgers have similar number of entries. If you have large number of ledgers and each ledger has fewer entries, smaller index page would improve memory usage.</td><td>8192</td></tr>
<tr><td>pageLimit</td><td>How many index pages provided in ledger cache If number of index pages reaches this limitation, bookie server starts to swap some ledgers from memory to disk. You can increment this value when you found swap became more frequent. But make sure pageLimit*pageSize should not more than JVM max memory limitation, otherwise you would got OutOfMemoryException. In general, incrementing pageLimit, using smaller index page would gain better performance in lager number of ledgers with fewer entries case If pageLimit is -1, bookie server will use 1/3 of JVM memory to compute the limitation of number of index pages.</td><td>0</td></tr>
<tr><td>readOnlyModeEnabled</td><td>If all ledger directories configured are full, then support only read requests for clients. If “readOnlyModeEnabled=true” then on all ledger disks full, bookie will be converted to read-only mode and serve only read requests. Otherwise the bookie will be shutdown. By default this will be disabled.</td><td>true</td></tr>
<tr><td>diskUsageThreshold</td><td>For each ledger dir, maximum disk space which can be used. Default is 0.95f. i.e. 95% of disk can be used at most after which nothing will be written to that partition. If all ledger dir partitions are full, then bookie will turn to readonly mode if ‘readOnlyModeEnabled=true’ is set, else it will shutdown. Valid values should be in between 0 and 1 (exclusive).</td><td>0.95</td></tr>
<tr><td>diskCheckInterval</td><td>Disk check interval in milli seconds, interval to check the ledger dirs usage.</td><td>10000</td></tr>
<tr><td>auditorPeriodicCheckInterval</td><td>Interval at which the auditor will do a check of all ledgers in the cluster. By default this runs once a week. The interval is set in seconds. To disable the periodic check completely, set this to 0. Note that periodic checking will put extra load on the cluster, so it should not be run more frequently than once a day.</td><td>604800</td></tr>
<tr><td>auditorPeriodicBookieCheckInterval</td><td>The interval between auditor bookie checks. The auditor bookie check, checks ledger metadata to see which bookies should contain entries for each ledger. If a bookie which should contain entries is unavailable, thea the ledger containing that entry is marked for recovery. Setting this to 0 disabled the periodic check. Bookie checks will still run when a bookie fails. The interval is specified in seconds.</td><td>86400</td></tr>
<tr><td>numAddWorkerThreads</td><td>number of threads that should handle write requests. if zero, the writes would be handled by netty threads directly.</td><td>0</td></tr>
<tr><td>numReadWorkerThreads</td><td>number of threads that should handle read requests. if zero, the reads would be handled by netty threads directly.</td><td>8</td></tr>
<tr><td>maxPendingReadRequestsPerThread</td><td>If read workers threads are enabled, limit the number of pending requests, to avoid the executor queue to grow indefinitely.</td><td>2500</td></tr>
<tr><td>readBufferSizeBytes</td><td>The number of bytes we should use as capacity for BufferedReadChannel.</td><td>4096</td></tr>
<tr><td>writeBufferSizeBytes</td><td>The number of bytes used as capacity for the write buffer</td><td>65536</td></tr>
<tr><td>useHostNameAsBookieID</td><td>Whether the bookie should use its hostname to register with the coordination service (e.g.: zookeeper service). When false, bookie will use its ipaddress for the registration.</td><td>false</td></tr>
<tr><td>statsProviderClass</td><td></td><td>org.apache.bookkeeper.stats.prometheus.PrometheusMetricsProvider</td></tr>
<tr><td>prometheusStatsHttpPort</td><td></td><td>8000</td></tr>
<tr><td>dbStorage_writeCacheMaxSizeMb</td><td>Size of Write Cache. Memory is allocated from JVM direct memory. Write cache is used to buffer entries before flushing into the entry log For good performance, it should be big enough to hold a substantial amount of entries in the flush interval.</td><td>25% of direct memory</td></tr>
<tr><td>dbStorage_readAheadCacheMaxSizeMb</td><td>Size of Read cache. Memory is allocated from JVM direct memory. This read cache is pre-filled doing read-ahead whenever a cache miss happens</td><td>25% of direct memory</td></tr>
<tr><td>dbStorage_readAheadCacheBatchSize</td><td>How many entries to pre-fill in cache after a read cache miss</td><td>1000</td></tr>
<tr><td>dbStorage_rocksDB_blockCacheSize</td><td>Size of RocksDB block-cache. For best performance, this cache should be big enough to hold a significant portion of the index database which can reach ~2GB in some cases</td><td>10% of direct memory</td></tr>
<tr><td>dbStorage_rocksDB_writeBufferSizeMB</td><td></td><td>64</td></tr>
<tr><td>dbStorage_rocksDB_sstSizeInMB</td><td></td><td>64</td></tr>
<tr><td>dbStorage_rocksDB_blockSize</td><td></td><td>65536</td></tr>
<tr><td>dbStorage_rocksDB_bloomFilterBitsPerKey</td><td></td><td>10</td></tr>
<tr><td>dbStorage_rocksDB_numLevels</td><td></td><td>-1</td></tr>
<tr><td>dbStorage_rocksDB_numFilesInLevel0</td><td></td><td>4</td></tr>
<tr><td>dbStorage_rocksDB_maxSizeInLevel1MB</td><td></td><td>256</td></tr>
</tbody>
</table>
<h2><a class="anchor" aria-hidden="true" id="broker"></a><a href="#broker" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Broker</h2>
<p>Pulsar brokers are responsible for handling incoming messages from producers, dispatching messages to consumers, replicating data between clusters, and more.</p>
<table>
<thead>
<tr><th>Name</th><th>Description</th><th>Default</th></tr>
</thead>
<tbody>
<tr><td>enablePersistentTopics</td><td>Whether persistent topics are enabled on the broker</td><td>true</td></tr>
<tr><td>enableNonPersistentTopics</td><td>Whether non-persistent topics are enabled on the broker</td><td>true</td></tr>
<tr><td>functionsWorkerEnabled</td><td>Whether the Pulsar Functions worker service is enabled in the broker</td><td>false</td></tr>
<tr><td>zookeeperServers</td><td>Zookeeper quorum connection string</td><td></td></tr>
<tr><td>configurationStoreServers</td><td>Configuration store connection string (as a comma-separated list)</td><td></td></tr>
<tr><td>brokerServicePort</td><td>Broker data port</td><td>6650</td></tr>
<tr><td>brokerServicePortTls</td><td>Broker data port for TLS</td><td>6651</td></tr>
<tr><td>webServicePort</td><td>Port to use to server HTTP request</td><td>8080</td></tr>
<tr><td>webServicePortTls</td><td>Port to use to server HTTPS request</td><td>8443</td></tr>
<tr><td>webSocketServiceEnabled</td><td>Enable the WebSocket API service in broker</td><td>false</td></tr>
<tr><td>bindAddress</td><td>Hostname or IP address the service binds on, default is 0.0.0.0.</td><td>0.0.0.0</td></tr>
<tr><td>advertisedAddress</td><td>Hostname or IP address the service advertises to the outside world. If not set, the value of <code>InetAddress.getLocalHost().getHostName()</code> is used.</td><td></td></tr>
<tr><td>clusterName</td><td>Name of the cluster to which this broker belongs to</td><td></td></tr>
<tr><td>brokerDeduplicationEnabled</td><td>Sets the default behavior for message deduplication in the broker. If enabled, the broker will reject messages that were already stored in the topic. This setting can be overridden on a per-namespace basis.</td><td>false</td></tr>
<tr><td>brokerDeduplicationMaxNumberOfProducers</td><td>The maximum number of producers for which information will be stored for deduplication purposes.</td><td>10000</td></tr>
<tr><td>brokerDeduplicationEntriesInterval</td><td>The number of entries after which a deduplication informational snapshot is taken. A larger interval will lead to fewer snapshots being taken, though this would also lengthen the topic recovery time (the time required for entries published after the snapshot to be replayed).</td><td>1000</td></tr>
<tr><td>brokerDeduplicationProducerInactivityTimeoutMinutes</td><td>The time of inactivity (in minutes) after which the broker will discard deduplication information related to a disconnected producer.</td><td>360</td></tr>
<tr><td>dispatchThrottlingRatePerReplicatorInMsg</td><td>The default messages per second dispatch throttling-limit for every replicator in replication. The value of <code>0</code> means disabling replication message dispatch-throttling</td><td>0</td></tr>
<tr><td>dispatchThrottlingRatePerReplicatorInByte</td><td>The default bytes per second dispatch throttling-limit for every replicator in replication. The value of <code>0</code> means disabling replication message-byte dispatch-throttling</td><td>0</td></tr>
<tr><td>zooKeeperSessionTimeoutMillis</td><td>Zookeeper session timeout in milliseconds</td><td>30000</td></tr>
<tr><td>brokerShutdownTimeoutMs</td><td>Time to wait for broker graceful shutdown. After this time elapses, the process will be killed</td><td>60000</td></tr>
<tr><td>skipBrokerShutdownOnOOM</td><td>Flag to skip broker shutdown when broker handles Out of memory error.</td><td>false</td></tr>
<tr><td>backlogQuotaCheckEnabled</td><td>Enable backlog quota check. Enforces action on topic when the quota is reached</td><td>true</td></tr>
<tr><td>backlogQuotaCheckIntervalInSeconds</td><td>How often to check for topics that have reached the quota</td><td>60</td></tr>
<tr><td>backlogQuotaDefaultLimitGB</td><td>The default per-topic backlog quota limit</td><td>-1</td></tr>
<tr><td>allowAutoTopicCreation</td><td>Enable topic auto creation if a new producer or consumer connected</td><td>true</td></tr>
<tr><td>allowAutoTopicCreationType</td><td>The topic type (partitioned or non-partitioned) that is allowed to be automatically created.</td><td>Partitioned</td></tr>
<tr><td>allowAutoSubscriptionCreation</td><td>Enable subscription auto creation if a new consumer connected</td><td>true</td></tr>
<tr><td>defaultNumPartitions</td><td>The number of partitioned topics that is allowed to be automatically created if <code>allowAutoTopicCreationType</code> is partitioned</td><td>1</td></tr>
<tr><td>brokerDeleteInactiveTopicsEnabled</td><td>Enable the deletion of inactive topics. If topics are not consumed for some while, these inactive topics might be cleaned up. Deleting inactive topics is enabled by default. The default period is 1 minute.</td><td>true</td></tr>
<tr><td>brokerDeleteInactiveTopicsFrequencySeconds</td><td>How often to check for inactive topics</td><td>60</td></tr>
<tr><td>messageExpiryCheckIntervalInMinutes</td><td>How frequently to proactively check and purge expired messages</td><td>5</td></tr>
<tr><td>brokerServiceCompactionMonitorIntervalInSeconds</td><td>Interval between checks to see if topics with compaction policies need to be compacted</td><td>60</td></tr>
<tr><td>activeConsumerFailoverDelayTimeMillis</td><td>How long to delay rewinding cursor and dispatching messages when active consumer is changed.</td><td>1000</td></tr>
<tr><td>clientLibraryVersionCheckEnabled</td><td>Enable check for minimum allowed client library version</td><td>false</td></tr>
<tr><td>clientLibraryVersionCheckAllowUnversioned</td><td>Allow client libraries with no version information</td><td>true</td></tr>
<tr><td>statusFilePath</td><td>Path for the file used to determine the rotation status for the broker when responding to service discovery health checks</td><td></td></tr>
<tr><td>preferLaterVersions</td><td>If true, (and ModularLoadManagerImpl is being used), the load manager will attempt to use only brokers running the latest software version (to minimize impact to bundles)</td><td>false</td></tr>
<tr><td>tlsEnabled</td><td>Enable TLS</td><td>false</td></tr>
<tr><td>tlsCertificateFilePath</td><td>Path for the TLS certificate file</td><td></td></tr>
<tr><td>tlsKeyFilePath</td><td>Path for the TLS private key file</td><td></td></tr>
<tr><td>tlsTrustCertsFilePath</td><td>Path for the trusted TLS certificate file</td><td></td></tr>
<tr><td>tlsAllowInsecureConnection</td><td>Accept untrusted TLS certificate from client</td><td>false</td></tr>
<tr><td>tlsProtocols</td><td>Specify the tls protocols the broker will use to negotiate during TLS Handshake. Multiple values can be specified, separated by commas. Example:- <code>TLSv1.2</code>, <code>TLSv1.1</code>, <code>TLSv1</code></td><td></td></tr>
<tr><td>tlsCiphers</td><td>Specify the tls cipher the broker will use to negotiate during TLS Handshake. Multiple values can be specified, separated by commas. Example:- <code>TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</code></td><td></td></tr>
<tr><td>ttlDurationDefaultInSeconds</td><td>The default Time to Live (TTL) for namespaces if the TTL is not configured at namespace policies. When the value is set to <code>0</code>, TTL is disabled. By default, TTL is disabled.</td><td>0</td></tr>
<tr><td>tokenSecretKey</td><td>Configure the secret key to be used to validate auth tokens. The key can be specified like: <code>tokenSecretKey=data:base64,xxxxxxxxx</code> or <code>tokenSecretKey=file:///my/secret.key</code></td><td></td></tr>
<tr><td>tokenPublicKey</td><td>Configure the public key to be used to validate auth tokens. The key can be specified like: <code>tokenPublicKey=data:base64,xxxxxxxxx</code> or <code>tokenPublicKey=file:///my/secret.key</code></td><td></td></tr>
<tr><td>tokenPublicAlg</td><td>Configure the algorithm to be used to validate auth tokens. This can be any of the asymettric algorithms supported by Java JWT (<a href="https://github.com/jwtk/jjwt#signature-algorithms-keys">https://github.com/jwtk/jjwt#signature-algorithms-keys</a>)</td><td>RS256</td></tr>
<tr><td>tokenAuthClaim</td><td>Specify which of the token's claims will be used as the authentication &quot;principal&quot; or &quot;role&quot;. The default &quot;sub&quot; claim will be used if this is left blank</td><td></td></tr>
<tr><td>tokenAudienceClaim</td><td>The token audience &quot;claim&quot; name, e.g. &quot;aud&quot;, that will be used to get the audience from token. If not set, audience will not be verified.</td><td></td></tr>
<tr><td>tokenAudience</td><td>The token audience stands for this broker. The field <code>tokenAudienceClaim</code> of a valid token, need contains this.</td><td></td></tr>
<tr><td>maxUnackedMessagesPerConsumer</td><td>Max number of unacknowledged messages allowed to receive messages by a consumer on a shared subscription. Broker will stop sending messages to consumer once, this limit reaches until consumer starts acknowledging messages back. Using a value of 0, is disabling unackeMessage limit check and consumer can receive messages without any restriction</td><td>50000</td></tr>
<tr><td>maxUnackedMessagesPerSubscription</td><td>Max number of unacknowledged messages allowed per shared subscription. Broker will stop dispatching messages to all consumers of the subscription once this limit reaches until consumer starts acknowledging messages back and unack count reaches to limit/2. Using a value of 0, is disabling unackedMessage-limit check and dispatcher can dispatch messages without any restriction</td><td>200000</td></tr>
<tr><td>subscriptionRedeliveryTrackerEnabled</td><td>Enable subscription message redelivery tracker</td><td>true</td></tr>
<tr><td>maxConcurrentLookupRequest</td><td>Max number of concurrent lookup request broker allows to throttle heavy incoming lookup traffic</td><td>50000</td></tr>
<tr><td>maxConcurrentTopicLoadRequest</td><td>Max number of concurrent topic loading request broker allows to control number of zk-operations</td><td>5000</td></tr>
<tr><td>authenticationEnabled</td><td>Enable authentication</td><td>false</td></tr>
<tr><td>authenticationProviders</td><td>Authentication provider name list, which is comma separated list of class names</td><td></td></tr>
<tr><td>authorizationEnabled</td><td>Enforce authorization</td><td>false</td></tr>
<tr><td>superUserRoles</td><td>Role names that are treated as “super-user”, meaning they will be able to do all admin operations and publish/consume from all topics</td><td></td></tr>
<tr><td>brokerClientAuthenticationPlugin</td><td>Authentication settings of the broker itself. Used when the broker connects to other brokers, either in same or other clusters</td><td></td></tr>
<tr><td>brokerClientAuthenticationParameters</td><td></td><td></td></tr>
<tr><td>athenzDomainNames</td><td>Supported Athenz provider domain names(comma separated) for authentication</td><td></td></tr>
<tr><td>exposePreciseBacklogInPrometheus</td><td>Enable expose the precise backlog stats, set false to use published counter and consumed counter to calculate, this would be more efficient but may be inaccurate.</td><td>false</td></tr>
<tr><td>bookkeeperClientAuthenticationPlugin</td><td>Authentication plugin to use when connecting to bookies</td><td></td></tr>
<tr><td>bookkeeperClientAuthenticationParametersName</td><td>BookKeeper auth plugin implementation specifics parameters name and values</td><td></td></tr>
<tr><td>bookkeeperClientAuthenticationParameters</td><td></td><td></td></tr>
<tr><td>bookkeeperClientTimeoutInSeconds</td><td>Timeout for BK add / read operations</td><td>30</td></tr>
<tr><td>bookkeeperClientSpeculativeReadTimeoutInMillis</td><td>Speculative reads are initiated if a read request doesn’t complete within a certain time Using a value of 0, is disabling the speculative reads</td><td>0</td></tr>
<tr><td>bookkeeperClientHealthCheckEnabled</td><td>Enable bookies health check. Bookies that have more than the configured number of failure within the interval will be quarantined for some time. During this period, new ledgers won’t be created on these bookies</td><td>true</td></tr>
<tr><td>bookkeeperClientHealthCheckIntervalSeconds</td><td></td><td>60</td></tr>
<tr><td>bookkeeperClientHealthCheckErrorThresholdPerInterval</td><td></td><td>5</td></tr>
<tr><td>bookkeeperClientHealthCheckQuarantineTimeInSeconds</td><td></td><td>1800</td></tr>
<tr><td>bookkeeperClientRackawarePolicyEnabled</td><td>Enable rack-aware bookie selection policy. BK will chose bookies from different racks when forming a new bookie ensemble</td><td>true</td></tr>
<tr><td>bookkeeperClientRegionawarePolicyEnabled</td><td>Enable region-aware bookie selection policy. BK will chose bookies from different regions and racks when forming a new bookie ensemble. If enabled, the value of bookkeeperClientRackawarePolicyEnabled is ignored</td><td>false</td></tr>
<tr><td>bookkeeperClientReorderReadSequenceEnabled</td><td>Enable/disable reordering read sequence on reading entries.</td><td>false</td></tr>
<tr><td>bookkeeperClientIsolationGroups</td><td>Enable bookie isolation by specifying a list of bookie groups to choose from. Any bookie outside the specified groups will not be used by the broker</td><td></td></tr>
<tr><td>bookkeeperClientSecondaryIsolationGroups</td><td>Enable bookie secondary-isolation group if bookkeeperClientIsolationGroups doesn't have enough bookie available.</td><td></td></tr>
<tr><td>bookkeeperClientMinAvailableBookiesInIsolationGroups</td><td>Minimum bookies that should be available as part of bookkeeperClientIsolationGroups else broker will include bookkeeperClientSecondaryIsolationGroups bookies in isolated list.</td><td></td></tr>
<tr><td>bookkeeperEnableStickyReads</td><td>Enable/disable having read operations for a ledger to be sticky to a single bookie. If this flag is enabled, the client will use one single bookie (by preference) to read all entries for a ledger.</td><td>true</td></tr>
<tr><td>managedLedgerDefaultEnsembleSize</td><td>Number of bookies to use when creating a ledger</td><td>2</td></tr>
<tr><td>managedLedgerDefaultWriteQuorum</td><td>Number of copies to store for each message</td><td>2</td></tr>
<tr><td>managedLedgerDefaultAckQuorum</td><td>Number of guaranteed copies (acks to wait before write is complete)</td><td>2</td></tr>
<tr><td>managedLedgerCacheSizeMB</td><td>Amount of memory to use for caching data payload in managed ledger. This memory is allocated from JVM direct memory and it’s shared across all the topics running in the same broker. By default, uses 1/5th of available direct memory</td><td></td></tr>
<tr><td>managedLedgerCacheCopyEntries</td><td>Whether we should make a copy of the entry payloads when inserting in cache</td><td>false</td></tr>
<tr><td>managedLedgerCacheEvictionWatermark</td><td>Threshold to which bring down the cache level when eviction is triggered</td><td>0.9</td></tr>
<tr><td>managedLedgerCacheEvictionFrequency</td><td>Configure the cache eviction frequency for the managed ledger cache (evictions/sec)</td><td>100.0</td></tr>
<tr><td>managedLedgerCacheEvictionTimeThresholdMillis</td><td>All entries that have stayed in cache for more than the configured time, will be evicted</td><td>1000</td></tr>
<tr><td>managedLedgerCursorBackloggedThreshold</td><td>Configure the threshold (in number of entries) from where a cursor should be considered 'backlogged' and thus should be set as inactive.</td><td>1000</td></tr>
<tr><td>managedLedgerDefaultMarkDeleteRateLimit</td><td>Rate limit the amount of writes per second generated by consumer acking the messages</td><td>1.0</td></tr>
<tr><td>managedLedgerMaxEntriesPerLedger</td><td>The max number of entries to append to a ledger before triggering a rollover. A ledger rollover is triggered after the min rollover time has passed and one of the following conditions is true: <ul><li>The max rollover time has been reached</li><li>The max entries have been written to the ledger</li><li>The max ledger size has been written to the ledger</li></ul></td><td>50000</td></tr>
<tr><td>managedLedgerMinLedgerRolloverTimeMinutes</td><td>Minimum time between ledger rollover for a topic</td><td>10</td></tr>
<tr><td>managedLedgerMaxLedgerRolloverTimeMinutes</td><td>Maximum time before forcing a ledger rollover for a topic</td><td>240</td></tr>
<tr><td>managedLedgerCursorMaxEntriesPerLedger</td><td>Max number of entries to append to a cursor ledger</td><td>50000</td></tr>
<tr><td>managedLedgerCursorRolloverTimeInSeconds</td><td>Max time before triggering a rollover on a cursor ledger</td><td>14400</td></tr>
<tr><td>managedLedgerMaxUnackedRangesToPersist</td><td>Max number of “acknowledgment holes” that are going to be persistently stored. When acknowledging out of order, a consumer will leave holes that are supposed to be quickly filled by acking all the messages. The information of which messages are acknowledged is persisted by compressing in “ranges” of messages that were acknowledged. After the max number of ranges is reached, the information will only be tracked in memory and messages will be redelivered in case of crashes.</td><td>1000</td></tr>
<tr><td>autoSkipNonRecoverableData</td><td>Skip reading non-recoverable/unreadable data-ledger under managed-ledger’s list.It helps when data-ledgers gets corrupted at bookkeeper and managed-cursor is stuck at that ledger.</td><td>false</td></tr>
<tr><td>loadBalancerEnabled</td><td>Enable load balancer</td><td>true</td></tr>
<tr><td>loadBalancerPlacementStrategy</td><td>Strategy to assign a new bundle weightedRandomSelection</td><td></td></tr>
<tr><td>loadBalancerReportUpdateThresholdPercentage</td><td>Percentage of change to trigger load report update</td><td>10</td></tr>
<tr><td>loadBalancerReportUpdateMaxIntervalMinutes</td><td>maximum interval to update load report</td><td>15</td></tr>
<tr><td>loadBalancerHostUsageCheckIntervalMinutes</td><td>Frequency of report to collect</td><td>1</td></tr>
<tr><td>loadBalancerSheddingIntervalMinutes</td><td>Load shedding interval. Broker periodically checks whether some traffic should be offload from some over-loaded broker to other under-loaded brokers</td><td>30</td></tr>
<tr><td>loadBalancerSheddingGracePeriodMinutes</td><td>Prevent the same topics to be shed and moved to other broker more than once within this timeframe</td><td>30</td></tr>
<tr><td>loadBalancerBrokerMaxTopics</td><td>Usage threshold to allocate max number of topics to broker</td><td>50000</td></tr>
<tr><td>loadBalancerBrokerUnderloadedThresholdPercentage</td><td>Usage threshold to determine a broker as under-loaded</td><td>1</td></tr>
<tr><td>loadBalancerBrokerOverloadedThresholdPercentage</td><td>Usage threshold to determine a broker as over-loaded</td><td>85</td></tr>
<tr><td>loadBalancerResourceQuotaUpdateIntervalMinutes</td><td>Interval to update namespace bundle resource quota</td><td>15</td></tr>
<tr><td>loadBalancerBrokerComfortLoadLevelPercentage</td><td>Usage threshold to determine a broker is having just right level of load</td><td>65</td></tr>
<tr><td>loadBalancerAutoBundleSplitEnabled</td><td>enable/disable namespace bundle auto split</td><td>false</td></tr>
<tr><td>loadBalancerNamespaceBundleMaxTopics</td><td>maximum topics in a bundle, otherwise bundle split will be triggered</td><td>1000</td></tr>
<tr><td>loadBalancerNamespaceBundleMaxSessions</td><td>maximum sessions (producers + consumers) in a bundle, otherwise bundle split will be triggered</td><td>1000</td></tr>
<tr><td>loadBalancerNamespaceBundleMaxMsgRate</td><td>maximum msgRate (in + out) in a bundle, otherwise bundle split will be triggered</td><td>1000</td></tr>
<tr><td>loadBalancerNamespaceBundleMaxBandwidthMbytes</td><td>maximum bandwidth (in + out) in a bundle, otherwise bundle split will be triggered</td><td>100</td></tr>
<tr><td>loadBalancerNamespaceMaximumBundles</td><td>maximum number of bundles in a namespace</td><td>128</td></tr>
<tr><td>replicationMetricsEnabled</td><td>Enable replication metrics</td><td>true</td></tr>
<tr><td>replicationConnectionsPerBroker</td><td>Max number of connections to open for each broker in a remote cluster More connections host-to-host lead to better throughput over high-latency links.</td><td>16</td></tr>
<tr><td>replicationProducerQueueSize</td><td>Replicator producer queue size</td><td>1000</td></tr>
<tr><td>replicatorPrefix</td><td>Replicator prefix used for replicator producer name and cursor name pulsar.repl</td><td></td></tr>
<tr><td>replicationTlsEnabled</td><td>Enable TLS when talking with other clusters to replicate messages</td><td>false</td></tr>
<tr><td>defaultRetentionTimeInMinutes</td><td>Default message retention time</td><td></td></tr>
<tr><td>defaultRetentionSizeInMB</td><td>Default retention size</td><td>0</td></tr>
<tr><td>keepAliveIntervalSeconds</td><td>How often to check whether the connections are still alive</td><td>30</td></tr>
<tr><td>loadManagerClassName</td><td>Name of load manager to use</td><td>org.apache.pulsar.broker.loadbalance.impl.SimpleLoadManagerImpl</td></tr>
<tr><td>supportedNamespaceBundleSplitAlgorithms</td><td>Supported algorithms name for namespace bundle split</td><td>[range_equally_divide,topic_count_equally_divide]</td></tr>
<tr><td>defaultNamespaceBundleSplitAlgorithm</td><td>Default algorithm name for namespace bundle split</td><td>range_equally_divide</td></tr>
<tr><td>managedLedgerOffloadDriver</td><td>Driver to use to offload old data to long term storage (Possible values: S3)</td><td></td></tr>
<tr><td>managedLedgerOffloadMaxThreads</td><td>Maximum number of thread pool threads for ledger offloading</td><td>2</td></tr>
<tr><td>managedLedgerUnackedRangesOpenCacheSetEnabled</td><td>Use Open Range-Set to cache unacknowledged messages</td><td>true</td></tr>
<tr><td>managedLedgerOffloadDeletionLagMs</td><td>Delay between a ledger being successfully offloaded to long term storage and the ledger being deleted from bookkeeper</td><td>14400000</td></tr>
<tr><td>managedLedgerOffloadAutoTriggerSizeThresholdBytes</td><td>The number of bytes before triggering automatic offload to long term storage</td><td>-1 (disabled)</td></tr>
<tr><td>s3ManagedLedgerOffloadRegion</td><td>For Amazon S3 ledger offload, AWS region</td><td></td></tr>
<tr><td>s3ManagedLedgerOffloadBucket</td><td>For Amazon S3 ledger offload, Bucket to place offloaded ledger into</td><td></td></tr>
<tr><td>s3ManagedLedgerOffloadServiceEndpoint</td><td>For Amazon S3 ledger offload, Alternative endpoint to connect to (useful for testing)</td><td></td></tr>
<tr><td>s3ManagedLedgerOffloadMaxBlockSizeInBytes</td><td>For Amazon S3 ledger offload, Max block size in bytes. (64MB by default, 5MB minimum)</td><td>67108864</td></tr>
<tr><td>s3ManagedLedgerOffloadReadBufferSizeInBytes</td><td>For Amazon S3 ledger offload, Read buffer size in bytes (1MB by default)</td><td>1048576</td></tr>
<tr><td>s3ManagedLedgerOffloadRole</td><td>For Amazon S3 ledger offload, provide a role to assume before writing to s3</td><td></td></tr>
<tr><td>s3ManagedLedgerOffloadRoleSessionName</td><td>For Amazon S3 ledger offload, provide a role session name when using a role</td><td>pulsar-s3-offload</td></tr>
<tr><td>maxMessageSize</td><td>Set the maximum size of a message.</td><td>5 MB</td></tr>
</tbody>
</table>
<h2><a class="anchor" aria-hidden="true" id="client"></a><a href="#client" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Client</h2>
<p>The <a href="/docs/en/2.5.2/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> CLI tool can be used to publish messages to Pulsar and consume messages from Pulsar topics. This tool can be used in lieu of a client library.</p>
<table>
<thead>
<tr><th>Name</th><th>Description</th><th>Default</th></tr>
</thead>
<tbody>
<tr><td>webServiceUrl</td><td>The web URL for the cluster.</td><td><a href="http://localhost:8080/">http://localhost:8080/</a></td></tr>
<tr><td>brokerServiceUrl</td><td>The Pulsar protocol URL for the cluster.</td><td><a href="pulsar://localhost:6650/">pulsar://localhost:6650/</a></td></tr>
<tr><td>authPlugin</td><td>The authentication plugin.</td><td></td></tr>
<tr><td>authParams</td><td>The authentication parameters for the cluster, as a comma-separated string.</td><td></td></tr>
<tr><td>useTls</td><td>Whether or not TLS authentication will be enforced in the cluster.</td><td>false</td></tr>
<tr><td>tlsAllowInsecureConnection</td><td></td><td></td></tr>
<tr><td>tlsTrustCertsFilePath</td><td></td><td></td></tr>
</tbody>
</table>
<h2><a class="anchor" aria-hidden="true" id="service-discovery"></a><a href="#service-discovery" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Service discovery</h2>
<table>
<thead>
<tr><th>Name</th><th>Description</th><th>Default</th></tr>
</thead>
<tbody>
<tr><td>zookeeperServers</td><td>Zookeeper quorum connection string (comma-separated)</td><td></td></tr>
<tr><td>configurationStoreServers</td><td>Configuration store connection string (as a comma-separated list)</td><td></td></tr>
<tr><td>zookeeperSessionTimeoutMs</td><td>ZooKeeper session timeout</td><td>30000</td></tr>
<tr><td>servicePort</td><td>Port to use to server binary-proto request</td><td>6650</td></tr>
<tr><td>servicePortTls</td><td>Port to use to server binary-proto-tls request</td><td>6651</td></tr>
<tr><td>webServicePort</td><td>Port that discovery service listen on</td><td>8080</td></tr>
<tr><td>webServicePortTls</td><td>Port to use to server HTTPS request</td><td>8443</td></tr>
<tr><td>bindOnLocalhost</td><td>Control whether to bind directly on localhost rather than on normal hostname</td><td>false</td></tr>
<tr><td>authenticationEnabled</td><td>Enable authentication</td><td>false</td></tr>
<tr><td>authenticationProviders</td><td>Authentication provider name list, which is comma separated list of class names (comma-separated)</td><td></td></tr>
<tr><td>authorizationEnabled</td><td>Enforce authorization</td><td>false</td></tr>
<tr><td>superUserRoles</td><td>Role names that are treated as “super-user”, meaning they will be able to do all admin operations and publish/consume from all topics (comma-separated)</td><td></td></tr>
<tr><td>tlsEnabled</td><td>Enable TLS</td><td>false</td></tr>
<tr><td>tlsCertificateFilePath</td><td>Path for the TLS certificate file</td><td></td></tr>
<tr><td>tlsKeyFilePath</td><td>Path for the TLS private key file</td><td></td></tr>
</tbody>
</table>
<h2><a class="anchor" aria-hidden="true" id="log4j"></a><a href="#log4j" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Log4j</h2>
<table>
<thead>
<tr><th>Name</th><th>Default</th></tr>
</thead>
<tbody>
<tr><td>pulsar.root.logger</td><td>WARN,CONSOLE</td></tr>
<tr><td>pulsar.log.dir</td><td>logs</td></tr>
<tr><td>pulsar.log.file</td><td>pulsar.log</td></tr>
<tr><td>log4j.rootLogger</td><td>${pulsar.root.logger}</td></tr>
<tr><td>log4j.appender.CONSOLE</td><td>org.apache.log4j.ConsoleAppender</td></tr>
<tr><td>log4j.appender.CONSOLE.Threshold</td><td>DEBUG</td></tr>
<tr><td>log4j.appender.CONSOLE.layout</td><td>org.apache.log4j.PatternLayout</td></tr>
<tr><td>log4j.appender.CONSOLE.layout.ConversionPattern</td><td>%d{ISO8601} - %-5p - [%t:%C{1}@%L] - %m%n</td></tr>
<tr><td>log4j.appender.ROLLINGFILE</td><td>org.apache.log4j.DailyRollingFileAppender</td></tr>
<tr><td>log4j.appender.ROLLINGFILE.Threshold</td><td>DEBUG</td></tr>
<tr><td>log4j.appender.ROLLINGFILE.File</td><td>${pulsar.log.dir}/${pulsar.log.file}</td></tr>
<tr><td>log4j.appender.ROLLINGFILE.layout</td><td>org.apache.log4j.PatternLayout</td></tr>
<tr><td>log4j.appender.ROLLINGFILE.layout.ConversionPattern</td><td>%d{ISO8601} - %-5p [%t:%C{1}@%L] - %m%n</td></tr>
<tr><td>log4j.appender.TRACEFILE</td><td>org.apache.log4j.FileAppender</td></tr>
<tr><td>log4j.appender.TRACEFILE.Threshold</td><td>TRACE</td></tr>
<tr><td>log4j.appender.TRACEFILE.File</td><td>pulsar-trace.log</td></tr>
<tr><td>log4j.appender.TRACEFILE.layout</td><td>org.apache.log4j.PatternLayout</td></tr>
<tr><td>log4j.appender.TRACEFILE.layout.ConversionPattern</td><td>%d{ISO8601} - %-5p [%t:%C{1}@%L][%x] - %m%n</td></tr>
</tbody>
</table>
<h2><a class="anchor" aria-hidden="true" id="log4j-shell"></a><a href="#log4j-shell" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Log4j shell</h2>
<table>
<thead>
<tr><th>Name</th><th>Default</th></tr>
</thead>
<tbody>
<tr><td>bookkeeper.root.logger</td><td>ERROR,CONSOLE</td></tr>
<tr><td>log4j.rootLogger</td><td>${bookkeeper.root.logger}</td></tr>
<tr><td>log4j.appender.CONSOLE</td><td>org.apache.log4j.ConsoleAppender</td></tr>
<tr><td>log4j.appender.CONSOLE.Threshold</td><td>DEBUG</td></tr>
<tr><td>log4j.appender.CONSOLE.layout</td><td>org.apache.log4j.PatternLayout</td></tr>
<tr><td>log4j.appender.CONSOLE.layout.ConversionPattern</td><td>%d{ABSOLUTE} %-5p %m%n</td></tr>
<tr><td>log4j.logger.org.apache.zookeeper</td><td>ERROR</td></tr>
<tr><td>log4j.logger.org.apache.bookkeeper</td><td>ERROR</td></tr>
<tr><td>log4j.logger.org.apache.bookkeeper.bookie.BookieShell</td><td>INFO</td></tr>
</tbody>
</table>
<h2><a class="anchor" aria-hidden="true" id="standalone"></a><a href="#standalone" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Standalone</h2>
<table>
<thead>
<tr><th>Name</th><th>Description</th><th>Default</th></tr>
</thead>
<tbody>
<tr><td>zookeeperServers</td><td>The quorum connection string for local ZooKeeper</td><td></td></tr>
<tr><td>configurationStoreServers</td><td>Configuration store connection string (as a comma-separated list)</td><td></td></tr>
<tr><td>brokerServicePort</td><td>The port on which the standalone broker listens for connections</td><td>6650</td></tr>
<tr><td>webServicePort</td><td>The port used by the standalone broker for HTTP requests</td><td>8080</td></tr>
<tr><td>bindAddress</td><td>The hostname or IP address on which the standalone service binds</td><td>0.0.0.0</td></tr>
<tr><td>advertisedAddress</td><td>The hostname or IP address that the standalone service advertises to the outside world. If not set, the value of <code>InetAddress.getLocalHost().getHostName()</code> is used.</td><td></td></tr>
<tr><td>clusterName</td><td>The name of the cluster that this broker belongs to.</td><td>standalone</td></tr>
<tr><td>zooKeeperSessionTimeoutMillis</td><td>The ZooKeeper session timeout, in milliseconds.</td><td>30000</td></tr>
<tr><td>brokerShutdownTimeoutMs</td><td>The time to wait for graceful broker shutdown. After this time elapses, the process will be killed.</td><td>60000</td></tr>
<tr><td>skipBrokerShutdownOnOOM</td><td>Flag to skip broker shutdown when broker handles Out of memory error.</td><td>false</td></tr>
<tr><td>backlogQuotaCheckEnabled</td><td>Enable the backlog quota check, which enforces a specified action when the quota is reached.</td><td>true</td></tr>
<tr><td>backlogQuotaCheckIntervalInSeconds</td><td>How often to check for topics that have reached the backlog quota.</td><td>60</td></tr>
<tr><td>backlogQuotaDefaultLimitGB</td><td>The default per-topic backlog quota limit.</td><td>10</td></tr>
<tr><td>ttlDurationDefaultInSeconds</td><td>The default Time to Live (TTL) for namespaces if the TTL is not configured at namespace policies. When the value is set to <code>0</code>, TTL is disabled. By default, TTL is disabled.</td><td>0</td></tr>
<tr><td>brokerDeleteInactiveTopicsEnabled</td><td>Enable the deletion of inactive topics. If topics are not consumed for some while, these inactive topics might be cleaned up. Deleting inactive topics is enabled by default. The default period is 1 minute.</td><td>true</td></tr>
<tr><td>brokerDeleteInactiveTopicsFrequencySeconds</td><td>How often to check for inactive topics, in seconds.</td><td>60</td></tr>
<tr><td>messageExpiryCheckIntervalInMinutes</td><td>How often to proactively check and purged expired messages.</td><td>5</td></tr>
<tr><td>activeConsumerFailoverDelayTimeMillis</td><td>How long to delay rewinding cursor and dispatching messages when active consumer is changed.</td><td>1000</td></tr>
<tr><td>clientLibraryVersionCheckEnabled</td><td>Enable checks for minimum allowed client library version.</td><td>false</td></tr>
<tr><td>clientLibraryVersionCheckAllowUnversioned</td><td>Allow client libraries with no version information</td><td>true</td></tr>
<tr><td>statusFilePath</td><td>The path for the file used to determine the rotation status for the broker when responding to service discovery health checks</td><td>/usr/local/apache/htdocs</td></tr>
<tr><td>maxUnackedMessagesPerConsumer</td><td>The maximum number of unacknowledged messages allowed to be received by consumers on a shared subscription. The broker will stop sending messages to a consumer once this limit is reached or until the consumer begins acknowledging messages. A value of 0 disables the unacked message limit check and thus allows consumers to receive messages without any restrictions.</td><td>50000</td></tr>
<tr><td>maxUnackedMessagesPerSubscription</td><td>The same as above, except per subscription rather than per consumer.</td><td>200000</td></tr>
<tr><td>authenticationEnabled</td><td>Enable authentication for the broker.</td><td>false</td></tr>
<tr><td>authenticationProviders</td><td>A comma-separated list of class names for authentication providers.</td><td>false</td></tr>
<tr><td>authorizationEnabled</td><td>Enforce authorization in brokers.</td><td>false</td></tr>
<tr><td>superUserRoles</td><td>Role names that are treated as “superusers.” Superusers are authorized to perform all admin tasks.</td><td></td></tr>
<tr><td>brokerClientAuthenticationPlugin</td><td>The authentication settings of the broker itself. Used when the broker connects to other brokers either in the same cluster or from other clusters.</td><td></td></tr>
<tr><td>brokerClientAuthenticationParameters</td><td>The parameters that go along with the plugin specified using brokerClientAuthenticationPlugin.</td><td></td></tr>
<tr><td>athenzDomainNames</td><td>Supported Athenz authentication provider domain names as a comma-separated list.</td><td></td></tr>
<tr><td>exposePreciseBacklogInPrometheus</td><td>Enable expose the precise backlog stats, set false to use published counter and consumed counter to calculate, this would be more efficient but may be inaccurate.</td><td>false</td></tr>
<tr><td>bookkeeperClientAuthenticationPlugin</td><td>Authentication plugin to be used when connecting to bookies (BookKeeper servers).</td><td></td></tr>
<tr><td>bookkeeperClientAuthenticationParametersName</td><td>BookKeeper authentication plugin implementation parameters and values.</td><td></td></tr>
<tr><td>bookkeeperClientAuthenticationParameters</td><td>Parameters associated with the bookkeeperClientAuthenticationParametersName</td><td></td></tr>
<tr><td>bookkeeperClientTimeoutInSeconds</td><td>Timeout for BookKeeper add and read operations.</td><td>30</td></tr>
<tr><td>bookkeeperClientSpeculativeReadTimeoutInMillis</td><td>Speculative reads are initiated if a read request doesn’t complete within a certain time. A value of 0 disables speculative reads.</td><td>0</td></tr>
<tr><td>bookkeeperClientHealthCheckEnabled</td><td>Enable bookie health checks.</td><td>true</td></tr>
<tr><td>bookkeeperClientHealthCheckIntervalSeconds</td><td>The time interval, in seconds, at which health checks are performed. New ledgers are not created during health checks.</td><td>60</td></tr>
<tr><td>bookkeeperClientHealthCheckErrorThresholdPerInterval</td><td>Error threshold for health checks.</td><td>5</td></tr>
<tr><td>bookkeeperClientHealthCheckQuarantineTimeInSeconds</td><td>If bookies have more than the allowed number of failures within the time interval specified by bookkeeperClientHealthCheckIntervalSeconds</td><td>1800</td></tr>
<tr><td>bookkeeperClientRackawarePolicyEnabled</td><td></td><td>true</td></tr>
<tr><td>bookkeeperClientRegionawarePolicyEnabled</td><td></td><td>false</td></tr>
<tr><td>bookkeeperClientReorderReadSequenceEnabled</td><td></td><td>false</td></tr>
<tr><td>bookkeeperClientIsolationGroups</td><td></td><td></td></tr>
<tr><td>bookkeeperClientSecondaryIsolationGroups</td><td>Enable bookie secondary-isolation group if bookkeeperClientIsolationGroups doesn't have enough bookie available.</td><td></td></tr>
<tr><td>bookkeeperClientMinAvailableBookiesInIsolationGroups</td><td>Minimum bookies that should be available as part of bookkeeperClientIsolationGroups else broker will include bookkeeperClientSecondaryIsolationGroups bookies in isolated list.</td><td></td></tr>
<tr><td>managedLedgerDefaultEnsembleSize</td><td></td><td>1</td></tr>
<tr><td>managedLedgerDefaultWriteQuorum</td><td></td><td>1</td></tr>
<tr><td>managedLedgerDefaultAckQuorum</td><td></td><td>1</td></tr>
<tr><td>managedLedgerCacheSizeMB</td><td></td><td>1024</td></tr>
<tr><td>managedLedgerCacheCopyEntries</td><td>Whether we should make a copy of the entry payloads when inserting in cache</td><td>false</td></tr>
<tr><td>managedLedgerCacheEvictionWatermark</td><td></td><td>0.9</td></tr>
<tr><td>managedLedgerCacheEvictionFrequency</td><td>Configure the cache eviction frequency for the managed ledger cache (evictions/sec)</td><td>100.0</td></tr>
<tr><td>managedLedgerCacheEvictionTimeThresholdMillis</td><td>All entries that have stayed in cache for more than the configured time, will be evicted</td><td>1000</td></tr>
<tr><td>managedLedgerCursorBackloggedThreshold</td><td>Configure the threshold (in number of entries) from where a cursor should be considered 'backlogged' and thus should be set as inactive.</td><td>1000</td></tr>
<tr><td>managedLedgerUnackedRangesOpenCacheSetEnabled</td><td>Use Open Range-Set to cache unacknowledged messages</td><td>true</td></tr>
<tr><td>managedLedgerDefaultMarkDeleteRateLimit</td><td></td><td>0.1</td></tr>
<tr><td>managedLedgerMaxEntriesPerLedger</td><td></td><td>50000</td></tr>
<tr><td>managedLedgerMinLedgerRolloverTimeMinutes</td><td></td><td>10</td></tr>
<tr><td>managedLedgerMaxLedgerRolloverTimeMinutes</td><td></td><td>240</td></tr>
<tr><td>managedLedgerCursorMaxEntriesPerLedger</td><td></td><td>50000</td></tr>
<tr><td>managedLedgerCursorRolloverTimeInSeconds</td><td></td><td>14400</td></tr>
<tr><td>autoSkipNonRecoverableData</td><td></td><td>false</td></tr>
<tr><td>loadBalancerEnabled</td><td></td><td>false</td></tr>
<tr><td>loadBalancerPlacementStrategy</td><td></td><td>weightedRandomSelection</td></tr>
<tr><td>loadBalancerReportUpdateThresholdPercentage</td><td></td><td>10</td></tr>
<tr><td>loadBalancerReportUpdateMaxIntervalMinutes</td><td></td><td>15</td></tr>
<tr><td>loadBalancerHostUsageCheckIntervalMinutes</td><td></td><td>1</td></tr>
<tr><td>loadBalancerSheddingIntervalMinutes</td><td></td><td>30</td></tr>
<tr><td>loadBalancerSheddingGracePeriodMinutes</td><td></td><td>30</td></tr>
<tr><td>loadBalancerBrokerMaxTopics</td><td></td><td>50000</td></tr>
<tr><td>loadBalancerBrokerUnderloadedThresholdPercentage</td><td></td><td>1</td></tr>
<tr><td>loadBalancerBrokerOverloadedThresholdPercentage</td><td></td><td>85</td></tr>
<tr><td>loadBalancerResourceQuotaUpdateIntervalMinutes</td><td></td><td>15</td></tr>
<tr><td>loadBalancerBrokerComfortLoadLevelPercentage</td><td></td><td>65</td></tr>
<tr><td>loadBalancerAutoBundleSplitEnabled</td><td></td><td>false</td></tr>
<tr><td>loadBalancerNamespaceBundleMaxTopics</td><td></td><td>1000</td></tr>
<tr><td>loadBalancerNamespaceBundleMaxSessions</td><td></td><td>1000</td></tr>
<tr><td>loadBalancerNamespaceBundleMaxMsgRate</td><td></td><td>1000</td></tr>
<tr><td>loadBalancerNamespaceBundleMaxBandwidthMbytes</td><td></td><td>100</td></tr>
<tr><td>loadBalancerNamespaceMaximumBundles</td><td></td><td>128</td></tr>
<tr><td>replicationMetricsEnabled</td><td></td><td>true</td></tr>
<tr><td>replicationConnectionsPerBroker</td><td></td><td>16</td></tr>
<tr><td>replicationProducerQueueSize</td><td></td><td>1000</td></tr>
<tr><td>defaultRetentionTimeInMinutes</td><td></td><td>0</td></tr>
<tr><td>defaultRetentionSizeInMB</td><td></td><td>0</td></tr>
<tr><td>keepAliveIntervalSeconds</td><td></td><td>30</td></tr>
</tbody>
</table>
<h2><a class="anchor" aria-hidden="true" id="websocket"></a><a href="#websocket" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>WebSocket</h2>
<table>
<thead>
<tr><th>Name</th><th>Description</th><th>Default</th></tr>
</thead>
<tbody>
<tr><td>configurationStoreServers</td><td></td><td></td></tr>
<tr><td>zooKeeperSessionTimeoutMillis</td><td></td><td>30000</td></tr>
<tr><td>serviceUrl</td><td></td><td></td></tr>
<tr><td>serviceUrlTls</td><td></td><td></td></tr>
<tr><td>brokerServiceUrl</td><td></td><td></td></tr>
<tr><td>brokerServiceUrlTls</td><td></td><td></td></tr>
<tr><td>webServicePort</td><td></td><td>8080</td></tr>
<tr><td>webServicePortTls</td><td></td><td>8443</td></tr>
<tr><td>bindAddress</td><td></td><td>0.0.0.0</td></tr>
<tr><td>clusterName</td><td></td><td></td></tr>
<tr><td>authenticationEnabled</td><td></td><td>false</td></tr>
<tr><td>authenticationProviders</td><td></td><td></td></tr>
<tr><td>authorizationEnabled</td><td></td><td>false</td></tr>
<tr><td>superUserRoles</td><td></td><td></td></tr>
<tr><td>brokerClientAuthenticationPlugin</td><td></td><td></td></tr>
<tr><td>brokerClientAuthenticationParameters</td><td></td><td></td></tr>
<tr><td>tlsEnabled</td><td></td><td>false</td></tr>
<tr><td>tlsAllowInsecureConnection</td><td></td><td>false</td></tr>
<tr><td>tlsCertificateFilePath</td><td></td><td></td></tr>
<tr><td>tlsKeyFilePath</td><td></td><td></td></tr>
<tr><td>tlsTrustCertsFilePath</td><td></td><td></td></tr>
</tbody>
</table>
<h2><a class="anchor" aria-hidden="true" id="pulsar-proxy"></a><a href="#pulsar-proxy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Pulsar proxy</h2>
<p>The <a href="/docs/en/2.5.2/concepts-architecture-overview#pulsar-proxy">Pulsar proxy</a> can be configured in the <code>conf/proxy.conf</code> file.</p>
<table>
<thead>
<tr><th>Name</th><th>Description</th><th>Default</th></tr>
</thead>
<tbody>
<tr><td>zookeeperServers</td><td>The ZooKeeper quorum connection string (as a comma-separated list)</td><td></td></tr>
<tr><td>configurationStoreServers</td><td>Configuration store connection string (as a comma-separated list)</td><td></td></tr>
<tr><td>zookeeperSessionTimeoutMs</td><td>ZooKeeper session timeout (in milliseconds)</td><td>30000</td></tr>
<tr><td>servicePort</td><td>The port to use for server binary Protobuf requests</td><td>6650</td></tr>
<tr><td>servicePortTls</td><td>The port to use to server binary Protobuf TLS requests</td><td>6651</td></tr>
<tr><td>statusFilePath</td><td>Path for the file used to determine the rotation status for the proxy instance when responding to service discovery health checks</td><td></td></tr>
<tr><td>authenticationEnabled</td><td>Whether authentication is enabled for the Pulsar proxy</td><td>false</td></tr>
<tr><td>authenticateMetricsEndpoint</td><td>Whether the '/metrics' endpoint requires authentication. Defaults to true. 'authenticationEnabled' must also be set for this to take effect.</td><td>true</td></tr>
<tr><td>authenticationProviders</td><td>Authentication provider name list (a comma-separated list of class names)</td><td></td></tr>
<tr><td>authorizationEnabled</td><td>Whether authorization is enforced by the Pulsar proxy</td><td>false</td></tr>
<tr><td>authorizationProvider</td><td>Authorization provider as a fully qualified class name</td><td>org.apache.pulsar.broker.authorization.PulsarAuthorizationProvider</td></tr>
<tr><td>brokerClientAuthenticationPlugin</td><td>The authentication plugin used by the Pulsar proxy to authenticate with Pulsar brokers</td><td></td></tr>
<tr><td>brokerClientAuthenticationParameters</td><td>The authentication parameters used by the Pulsar proxy to authenticate with Pulsar brokers</td><td></td></tr>
<tr><td>brokerClientTrustCertsFilePath</td><td>The path to trusted certificates used by the Pulsar proxy to authenticate with Pulsar brokers</td><td></td></tr>
<tr><td>superUserRoles</td><td>Role names that are treated as “super-users,” meaning that they will be able to perform all admin</td><td></td></tr>
<tr><td>forwardAuthorizationCredentials</td><td>Whether client authorization credentials are forwarded to the broker for re-authorization. Authentication must be enabled via authenticationEnabled=true for this to take effect.</td><td>false</td></tr>
<tr><td>maxConcurrentInboundConnections</td><td>Max concurrent inbound connections. The proxy will reject requests beyond that.</td><td>10000</td></tr>
<tr><td>maxConcurrentLookupRequests</td><td>Max concurrent outbound connections. The proxy will error out requests beyond that.</td><td>50000</td></tr>
<tr><td>tlsEnabledInProxy</td><td>Whether TLS is enabled for the proxy</td><td>false</td></tr>
<tr><td>tlsEnabledWithBroker</td><td>Whether TLS is enabled when communicating with Pulsar brokers</td><td>false</td></tr>
<tr><td>tlsCertificateFilePath</td><td>Path for the TLS certificate file</td><td></td></tr>
<tr><td>tlsKeyFilePath</td><td>Path for the TLS private key file</td><td></td></tr>
<tr><td>tlsTrustCertsFilePath</td><td>Path for the trusted TLS certificate pem file</td><td></td></tr>
<tr><td>tlsHostnameVerificationEnabled</td><td>Whether the hostname is validated when the proxy creates a TLS connection with brokers</td><td>false</td></tr>
<tr><td>tlsRequireTrustedClientCertOnConnect</td><td>Whether client certificates are required for TLS. Connections are rejected if the client certificate isn’t trusted.</td><td>false</td></tr>
<tr><td>tlsProtocols</td><td>Specify the tls protocols the broker will use to negotiate during TLS Handshake. Multiple values can be specified, separated by commas. Example:- <code>TLSv1.2</code>, <code>TLSv1.1</code>, <code>TLSv1</code></td><td></td></tr>
<tr><td>tlsCiphers</td><td>Specify the tls cipher the broker will use to negotiate during TLS Handshake. Multiple values can be specified, separated by commas. Example:- <code>TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</code></td><td></td></tr>
<tr><td>tokenSecretKey</td><td>Configure the secret key to be used to validate auth tokens. The key can be specified like: <code>tokenSecretKey=data:base64,xxxxxxxxx</code> or <code>tokenSecretKey=file:///my/secret.key</code></td><td></td></tr>
<tr><td>tokenPublicKey</td><td>Configure the public key to be used to validate auth tokens. The key can be specified like: <code>tokenPublicKey=data:base64,xxxxxxxxx</code> or <code>tokenPublicKey=file:///my/secret.key</code></td><td></td></tr>
<tr><td>tokenPublicAlg</td><td>Configure the algorithm to be used to validate auth tokens. This can be any of the asymettric algorithms supported by Java JWT (<a href="https://github.com/jwtk/jjwt#signature-algorithms-keys">https://github.com/jwtk/jjwt#signature-algorithms-keys</a>)</td><td>RS256</td></tr>
<tr><td>tokenAuthClaim</td><td>Specify the token claim that will be used as the authentication &quot;principal&quot; or &quot;role&quot;. The &quot;subject&quot; field will be used if this is left blank</td><td></td></tr>
<tr><td>proxyLogLevel</td><td>Set the Pulsar Proxy log level. <li> If the value is set to 0, no TCP channel information is logged. <li> If the value is set to 1, only the TCP channel information and command information (without message body) are parsed and logged. <li> If the value is set to 2, all TCP channel information, command information, and message body are parsed and logged.</td><td>0</td></tr>
</tbody>
</table>
<h2><a class="anchor" aria-hidden="true" id="zookeeper"></a><a href="#zookeeper" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>ZooKeeper</h2>
<p>ZooKeeper handles a broad range of essential configuration- and coordination-related tasks for Pulsar. The default configuration file for ZooKeeper is in the <code>conf/zookeeper.conf</code> file in your Pulsar installation. The following parameters are available:</p>
<table>
<thead>
<tr><th>Name</th><th>Description</th><th>Default</th></tr>
</thead>
<tbody>
<tr><td>tickTime</td><td>The tick is the basic unit of time in ZooKeeper, measured in milliseconds and used to regulate things like heartbeats and timeouts. tickTime is the length of a single tick.</td><td>2000</td></tr>
<tr><td>initLimit</td><td>The maximum time, in ticks, that the leader ZooKeeper server allows follower ZooKeeper servers to successfully connect and sync. The tick time is set in milliseconds using the tickTime parameter.</td><td>10</td></tr>
<tr><td>syncLimit</td><td>The maximum time, in ticks, that a follower ZooKeeper server is allowed to sync with other ZooKeeper servers. The tick time is set in milliseconds using the tickTime parameter.</td><td>5</td></tr>
<tr><td>dataDir</td><td>The location where ZooKeeper will store in-memory database snapshots as well as the transaction log of updates to the database.</td><td>data/zookeeper</td></tr>
<tr><td>clientPort</td><td>The port on which the ZooKeeper server will listen for connections.</td><td>2181</td></tr>
<tr><td>autopurge.snapRetainCount</td><td>In ZooKeeper, auto purge determines how many recent snapshots of the database stored in dataDir to retain within the time interval specified by autopurge.purgeInterval (while deleting the rest).</td><td>3</td></tr>
<tr><td>autopurge.purgeInterval</td><td>The time interval, in hours, by which the ZooKeeper database purge task is triggered. Setting to a non-zero number will enable auto purge; setting to 0 will disable. Read this guide before enabling auto purge.</td><td>1</td></tr>
<tr><td>maxClientCnxns</td><td>The maximum number of client connections. Increase this if you need to handle more ZooKeeper clients.</td><td>60</td></tr>
</tbody>
</table>
<p>In addition to the parameters in the table above, configuring ZooKeeper for Pulsar involves adding
a <code>server.N</code> line to the <code>conf/zookeeper.conf</code> file for each node in the ZooKeeper cluster, where <code>N</code> is the number of the ZooKeeper node. Here's an example for a three-node ZooKeeper cluster:</p>
<pre><code class="hljs css language-properties"><span class="hljs-meta">server.1</span>=<span class="hljs-string">zk1.us-west.example.com:2888:3888</span>
<span class="hljs-meta">server.2</span>=<span class="hljs-string">zk2.us-west.example.com:2888:3888</span>
<span class="hljs-meta">server.3</span>=<span class="hljs-string">zk3.us-west.example.com:2888:3888</span>
</code></pre>
<blockquote>
<p>We strongly recommend consulting the <a href="https://zookeeper.apache.org/doc/current/zookeeperAdmin.html">ZooKeeper Administrator's Guide</a> for a more thorough and comprehensive introduction to ZooKeeper configuration</p>
</blockquote>
</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.5.2/pulsar-admin"><span class="arrow-prev"></span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.5.2/reference-metrics"><span>Pulsar Metrics</span><span class="arrow-next"></span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#bookkeeper">BookKeeper</a></li><li><a href="#broker">Broker</a></li><li><a href="#client">Client</a></li><li><a href="#service-discovery">Service discovery</a></li><li><a href="#log4j">Log4j</a></li><li><a href="#log4j-shell">Log4j shell</a></li><li><a href="#standalone">Standalone</a></li><li><a href="#websocket">WebSocket</a></li><li><a href="#pulsar-proxy">Pulsar proxy</a></li><li><a href="#zookeeper">ZooKeeper</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="copyright">Copyright © 2022 The Apache Software Foundation. All Rights Reserved. Apache, Apache Pulsar and the Apache feather logo are trademarks of The Apache Software Foundation.</section><span><script>
const community = document.querySelector("a[href='#community']").parentNode;
const communityMenu =
'<li>' +
'<a id="community-menu" href="#">Community <span style="font-size: 0.75em">&nbsp;▼</span></a>' +
'<div id="community-dropdown" class="hide">' +
'<ul id="community-dropdown-items">' +
'<li><a href="/en/contact">Contact</a></li>' +
'<li><a href="/en/contributing">Contributing</a></li>' +
'<li><a href="/en/coding-guide">Coding guide</a></li>' +
'<li><a href="/en/events">Events</a></li>' +
'<li><a href="https://twitter.com/Apache_Pulsar" target="_blank">Twitter &#x2750</a></li>' +
'<li><a href="https://github.com/apache/pulsar/wiki" target="_blank">Wiki &#x2750</a></li>' +
'<li><a href="https://github.com/apache/pulsar/issues" target="_blank">Issue tracking &#x2750</a></li>' +
'<li><a href="https://pulsar-summit.org/" target="_blank">Pulsar Summit &#x2750</a></li>' +
'<li>&nbsp;</li>' +
'<li><a href="/en/resources">Resources</a></li>' +
'<li><a href="/en/team">Team</a></li>' +
'<li><a href="/en/powered-by">Powered By</a></li>' +
'</ul>' +
'</div>' +
'</li>';
community.innerHTML = communityMenu;
const communityMenuItem = document.getElementById("community-menu");
const communityDropDown = document.getElementById("community-dropdown");
communityMenuItem.addEventListener("click", function(event) {
event.preventDefault();
if (communityDropDown.className == 'hide') {
communityDropDown.className = 'visible';
} else {
communityDropDown.className = 'hide';
}
});
</script></span></footer></div><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter-wjs'));</script></body></html>