<a id="sbc-jbod"></a>

# Use JBOD with Self-Balancing in Confluent Platform

Self-Balancing Clusters can balance data across the disks within a single broker in clusters
that use Just a Bunch of Disks (JBOD) setups. With JBOD enabled, you run
commands to move replicas between the disks on a broker so that data is evenly
distributed.

This intra-broker balancing is distinct from the inter-broker balancing that
Self-Balancing performs automatically. Intra-broker balancing is on demand only: you run
a command when you want to rebalance disks, and Self-Balancing doesn’t trigger it as part
of its self-healing. For an overview of Self-Balancing, see [Manage Self-Balancing Kafka Clusters in Confluent Platform](index.md#sbc).

<a id="sbc-jbod-enable"></a>

## Enable JBOD support

To enable JBOD support, configure multiple log directories and set the Self-Balancing
and JBOD properties on the brokers and controllers.

### Prerequisites

A cluster with a JBOD setup must specify multiple log directories in the
`log.dirs` configuration in each broker’s properties file, where each log
directory is on a different disk. If the log directories are not on different
disks, Self-Balancing JBOD support doesn’t work.

The following code shows an example of multiple log directories in a broker’s
properties file:

```properties
log.dirs=/mnt/disk1/kafka-logs,/mnt/disk2/kafka-logs,/mnt/disk3/kafka-logs
```

The `log.dirs` configuration is not [dynamic](configuration-options.md#sbc-kafka-configs-command), meaning that you must restart the brokers after
you change it.

After you configure multiple log directories, enable Self-Balancing for JBOD as described
in the next section.

### Configure Self-Balancing for JBOD

To enable Self-Balancing to balance data across broker disks:

1. Enable Self-Balancing by setting [confluent.balancer.enable](configuration-options.md#sbc-config-enable) to `true` in the
   properties file for every broker and controller in the cluster:
   ```properties
   confluent.balancer.enable=true
   ```
2. Enable [confluent.telemetry.metrics.collector.volume.include.logDirs.label](configuration-options.md#sbc-config-logdirs-label) for each broker so that brokers
   communicate per-disk capacity information to Self-Balancing:
   ```properties
   confluent.telemetry.metrics.collector.volume.include.logDirs.label=true
   ```

   This configuration is not dynamic, so you must restart the brokers after you
   set it.
3. Enable [confluent.balancer.jbod.enable](configuration-options.md#sbc-config-jbod-enable) so that Self-Balancing balances data across
   disks. Set this in the properties file for every controller in the cluster:
   ```properties
   confluent.balancer.jbod.enable=true
   ```

   This configuration is not dynamic, so you must restart the controllers after
   you set it.

These configurations work together: Self-Balancing balances data across disks only when
all are set. For the full requirement list, see
[confluent.balancer.jbod.enable](configuration-options.md#sbc-config-jbod-enable).

<a id="sbc-jbod-disable"></a>

## Disable JBOD support

To disable JBOD support, set the JBOD configuration to `false` on the
controllers and stop the brokers from emitting per-disk capacity metrics.
Without JBOD support, Self-Balancing doesn’t work with multiple disks.

Before you disable JBOD support, ensure that no intra-broker rebalance is in
progress (see [Limitations](#sbc-jbod-limitations)).

Complete the following steps:

1. Set [confluent.balancer.jbod.enable](configuration-options.md#sbc-config-jbod-enable) to `false` in the properties file for
   every controller in the cluster, and restart the controllers:
   ```properties
   confluent.balancer.jbod.enable=false
   ```
2. To stop the brokers from emitting per-disk capacity metrics, set
   [confluent.telemetry.metrics.collector.volume.include.logDirs.label](configuration-options.md#sbc-config-logdirs-label) to `false` in the properties file for every
   broker, and restart the brokers:
   ```properties
   confluent.telemetry.metrics.collector.volume.include.logDirs.label=false
   ```

<a id="sbc-jbod-balance-commands"></a>

## Balance data across disks

Use the `kafka-rebalance-cluster` command-line tool to balance data across
the disks on your brokers. To learn more about this tool, see
[Monitoring the balancer with kafka-rebalance-cluster](configuration-options.md#sbc-kafka-rebalance-cluster).

### Preview an intra-broker rebalance

Run the command with the `--intra-broker-rebalance-dry-run` flag to compute
and review the rebalance plan without moving any data:

```bash
kafka-rebalance-cluster --bootstrap-server <host:port> --command-config <path_to_client.properties> --intra-broker-rebalance-dry-run
```

The output shows the proposed moves, the goals evaluated, and the projected
cluster load before and after rebalancing. For example:

```text
Computing intra-broker rebalance plan...
Optimization has 53 intra-broker replica(2968.00 MB) moves with a cluster model of 12 recent windows and 100.00% of the partitions covered.
New brokers: [].
Dead or removed brokers: [].
Violated goals before optimization: [IntraBrokerDiskCapacityGoal, IntraBrokerDiskUsageDistributionGoal].
Violated goals after optimization: [IntraBrokerDiskUsageDistributionGoal].
Goals which generated movements: [IntraBrokerDiskCapacityGoal, IntraBrokerDiskUsageDistributionGoal].
...
On-demand balancedness score before and after: 0.00 -> 62.26.
```

### Run an intra-broker rebalance

Run the tool with the `--intra-broker-rebalance` flag to start moving
replicas between disks:

```bash
kafka-rebalance-cluster --bootstrap-server <host:port> --command-config <path_to_client.properties> --intra-broker-rebalance
```

```text
Triggering an intra-broker rebalance...
Triggered an intra-broker rebalance operation. You can check its status by calling this command again with the `--describe` option.
```

Check the status of the rebalance with the `--describe` flag:

```bash
kafka-rebalance-cluster --bootstrap-server <host:port> --command-config <path_to_client.properties> --describe
```

```text
Uneven load balance status:
  HealUnevenLoadTrigger: ANY_UNEVEN_LOAD
  Current: BALANCING
  Last Update Time: 2026-05-04_09:02:08 UTC
  Previous: BALANCED
  Last Update Time: 2026-05-04_03:23:04 UTC
```

<a id="sbc-jbod-limitations"></a>

## Limitations

The following limitations apply to Self-Balancing JBOD support:

- Intra-broker rebalance is on demand and is not triggered automatically as part
  of Self-Balancing self-healing. Monitor your intra-broker disk usage and use the
  [balancing commands](#sbc-jbod-balance-commands) to balance data
  across broker disks.
- The balancing commands don’t work if Self-Balancing is running an existing
  reassignment. Wait for the reassignment to complete, and then run the
  intra-broker rebalance command.
- Unlike with brokers, Self-Balancing doesn’t automatically detect a dead disk or take
  any action for one. The balancing commands don’t work when a dead disk is
  present.
- Self-Balancing cannot expand or shrink the number of broker disks.

<a id="sbc-jbod-tuning"></a>

## Tune intra-broker balancing

Use the following configurations to tune how Self-Balancing balances data across disks:

- [confluent.balancer.intra.broker.throttle.bytes.per.second](configuration-options.md#sbc-config-intra-throttle) configures the replication throttle limit for
  intra-broker movements.
- [confluent.balancer.num.concurrent.intra.broker.partition.movements.per.disk](configuration-options.md#sbc-config-intra-movements-per-disk) changes the parallelism limit on
  intra-broker movements.
- [confluent.balancer.intra.broker.disk.max.load](configuration-options.md#sbc-config-intra-disk-max-load),
  [confluent.balancer.intra.broker.disk.balance.threshold](configuration-options.md#sbc-config-intra-disk-balance-threshold), and
  [confluent.balancer.intra.broker.disk.min.free.space.gb](configuration-options.md#sbc-config-intra-disk-min-free) control how Self-Balancing acts when an
  intra-broker rebalance runs.

The following example sets these configurations to their default values in a
broker properties file:

```properties
confluent.balancer.intra.broker.throttle.bytes.per.second=10485760
confluent.balancer.num.concurrent.intra.broker.partition.movements.per.disk=1
confluent.balancer.intra.broker.disk.max.load=0.85
confluent.balancer.intra.broker.disk.balance.threshold=1.1
confluent.balancer.intra.broker.disk.min.free.space.gb=0
```

The throttle is a [dynamic option](configuration-options.md#sbc-kafka-configs-command), so you can
also adjust it while the cluster is running:

```bash
kafka-configs --bootstrap-server <host:port> --entity-type brokers --entity-default --alter --add-config confluent.balancer.intra.broker.throttle.bytes.per.second=20971520
```

For full configuration details, see [Self-Balancing configuration](configuration-options.md#sbc-configs-on-brokers).

## Related content

- [Manage Self-Balancing Kafka Clusters in Confluent Platform](index.md#sbc)
- [Configuration Options and Commands](configuration-options.md#sbc-config-options)
- [confluent.balancer.jbod.enable](configuration-options.md#sbc-config-jbod-enable)
- [kafka-rebalance-cluster](configuration-options.md#sbc-kafka-rebalance-cluster)
- [Auto Data Balancer](../rebalancer/quickstart.md#rebalancer)
