githubEdit

Zookeeper

ZooKeeper stores Pinot cluster metadata.

That includes schemas, table configs, segment metadata, and Helix state.

When you need to care

You can keep ZooKeeper “default” for quickstarts.

You should tune and secure it for production.

Typical reasons:

  • You run a multi-node Pinot cluster.

  • You want TLS for ZooKeeper client connections.

  • You use ZooKeeper ACLs / SASL auth.

  • Your cluster metadata outgrows the default znode limit (1 MB).

Run a ZooKeeper ensemble in production.

Use an odd number of nodes (3 or 5).

Put dataDir on fast local disk.

Turn on snapshot cleanup to avoid disk-full incidents.

circle-info

Pinot depends on ZooKeeper for cluster coordination.

Treat it like “control plane” infrastructure.

Example zoo.cfg baseline

Use this as a starting point.

Adapt paths, ports, and node lists.

Point Pinot at ZooKeeper

All Pinot components need the ZooKeeper connection string.

  • In scripts and containers, this is usually -zkAddress.

  • In controller.conf, it’s controller.zk.str.

You can optionally use a chroot path to isolate clusters:

Secure ZooKeeper with TLS

ZooKeeper can serve TLS on a separate port (recommended).

This avoids breaking legacy clients on clientPort.

You need to do two things:

  1. Enable TLS on ZooKeeper servers.

  2. Configure Pinot JVMs to use ZooKeeper TLS.

1) ZooKeeper server: enable TLS client port

ZooKeeper TLS settings can be configured in zoo.cfg.

Exact keys vary by ZooKeeper version.

Common options (ZooKeeper 3.5+):

circle-exclamation

2) Pinot JVM: ZooKeeper TLS Java options

Pinot (Helix) uses the ZooKeeper Java client.

The ZooKeeper client is configured via JVM system properties.

Set these JVM options on every Pinot component (controller, broker, server, minion):

How you set them depends on your runtime:

  • pinot-admin.sh / launcher scripts: set JAVA_OPTS (or equivalent) before starting.

  • Kubernetes: add them to JAVA_OPTS in the container env.

  • Systemd: add them to the service unit environment.

Then point Pinot at the TLS port:

circle-info

These are ZooKeeper-client properties, not Pinot properties.

They work because Pinot runs on the JVM.

Secure ZooKeeper with auth (SASL / JAAS)

ZooKeeper supports ACL enforcement and SASL authentication.

This is common with Kerberos-backed environments.

High-level steps:

  1. Enable SASL auth on ZooKeeper.

  2. Provide a JAAS config to Pinot JVMs.

  3. Restart ZooKeeper and Pinot.

ZooKeeper server: enable SASL provider

Example zoo.cfg:

Pinot JVM: SASL Java options

Set JVM options on every Pinot component:

If you run multiple JAAS contexts, you may also need:

triangle-exclamation

Increase znode size for large clusters (large tables)

ZooKeeper limits the maximum znode payload size.

The default is 1 MB.

Large Pinot tables can exceed this when:

  • You have very high segment counts.

  • Your Helix IDEALSTATE / EXTERNALVIEW becomes large.

Symptoms include:

Fix: increase jute.maxbuffer everywhere

Set jute.maxbuffer on:

  • All ZooKeeper servers

  • All Pinot components (ZooKeeper clients)

Example (4 MB):

Restart order:

  1. Rolling restart ZooKeeper ensemble.

  2. Rolling restart Pinot components.

For deeper troubleshooting and alternatives, see Troubleshoot issues with ZooKeeper znodes.

Prefer fewer segments over bigger znodes

Increasing jute.maxbuffer is a safety valve.

It is not a scaling strategy.

Also do at least one of these:

Last updated

Was this helpful?