Skip to content

AxonOps — AI-Native Control Plane for Open Source Data Platforms

Cassandra Decommission Node

Decommissioning removes a node from the cluster by streaming its data to remaining nodes. This is the proper way to permanently remove a healthy node.


  • Node is UP and operational
  • Cluster has sufficient capacity after removal
  • No other operations (repair, bootstrap) running
  • Recent backup available

When NOT to Use Decommission

  • If node is DOWN: Use nodetool removenode instead
  • If node is unresponsive: Use nodetool assassinate (last resort)
  • If removing multiple nodes: Decommission one at a time

Terminal window
nodetool status

All other nodes should show UN (Up/Normal).

Terminal window
# Current data per node
nodetool status | awk '/^UN/ {print $1, $3}'
# Verify remaining nodes can absorb data
# Rule: Each remaining node should have < 70% disk after decommission
Section titled “Step 3: Run Repair First (Optional but Recommended)”
Terminal window
# Ensures data is consistent before streaming
nodetool repair -pr

Step 4: Disable Auto-Bootstrap (Precaution)

Section titled “Step 4: Disable Auto-Bootstrap (Precaution)”

Ensure auto_bootstrap: false won't be an issue if node accidentally restarts.

Decommission can take hours and impacts cluster performance during streaming.


On the node to be removed:

Terminal window
nodetool decommission

This command:

  1. Stops accepting new writes
  2. Streams data to other replicas
  3. Leaves the token ring
  4. Shuts down (in some versions)

In another terminal:

Terminal window
# Watch streaming progress
nodetool netstats
# Watch decommission status
nodetool status | grep -E "UL|UJ|UN"
# UL = Leaving, UJ = Joining, UN = Normal

Decommission can take hours depending on data size. Do not interrupt.

Terminal window
# Monitor from another node
watch -n 60 'nodetool status'

From another node:

Terminal window
nodetool status

The decommissioned node should no longer appear.

On the decommissioned node (if still running):

Terminal window
# Stop Cassandra if still running
sudo systemctl stop cassandra
# Optionally remove data
sudo rm -rf /var/lib/cassandra/data/*
sudo rm -rf /var/lib/cassandra/commitlog/*
sudo rm -rf /var/lib/cassandra/saved_caches/*

Terminal window
# Check netstats for streaming activity
nodetool netstats
# Check logs
tail -100 /var/log/cassandra/system.log | grep -i "stream\|decommission"

If truly stuck (no progress for hours):

  1. Check disk space on receiving nodes
  2. Check network connectivity
  3. Check for errors in logs
Terminal window
# Check node status
nodetool status
# If node shows UL (Leaving) but decommission failed:
# Option 1: Restart and retry
sudo systemctl restart cassandra
nodetool decommission
# Option 2: Cancel and diagnose
nodetool netstats # Check for issues

The node's data directories may not have been cleared:

Terminal window
# On the decommissioned node, clear all data
sudo systemctl stop cassandra
sudo rm -rf /var/lib/cassandra/data/*
sudo rm -rf /var/lib/cassandra/commitlog/*
Terminal window
# Cancel decommission if possible (Ctrl+C usually works)
# Then:
# 1. Add more nodes first, OR
# 2. Clean up snapshots on remaining nodes
nodetool clearsnapshot --all
# 3. Add disk capacity

Terminal window
# Detailed streaming info
nodetool netstats
# Streaming throughput
nodetool getstreamthroughput
Terminal window
# Increase throughput (value in Mb/s by default)
nodetool setstreamthroughput 400
# Or specify MiB/s explicitly with -m flag
nodetool setstreamthroughput -m 50 # 50 MiB/s
# On receiving nodes, adjust concurrent compactors
nodetool setconcurrentcompactors 2

Streaming Throughput Units

nodetool setstreamthroughput uses megabits per second (Mb/s) by default. Use the -m flag to specify MiB/s instead.


If decommission is interrupted:

Terminal window
# Restart Cassandra
sudo systemctl restart cassandra
# Retry decommission
nodetool decommission
Terminal window
# Clear data and repurpose hardware
sudo systemctl stop cassandra
sudo rm -rf /var/lib/cassandra/*
# Or re-add as new node (requires different IP or cleared system tables)

PracticeReason
Decommission one node at a timePrevents overload
Run repair before decommissionEnsures data consistency
Monitor during processCatch issues early
Have backup readyRecovery option
Plan maintenance windowPerformance impact
Verify capacity firstPrevent disk full

Data per NodeExpected Duration
< 100 GB1-2 hours
100-500 GB2-8 hours
500 GB - 1 TB8-24 hours
> 1 TB24+ hours

Duration depends on:

  • Network bandwidth
  • Disk I/O speed
  • Stream throughput settings
  • Concurrent operations

ScenarioProcedure
Node is DOWNReplace Dead Node
Adding capacityAdd Node
Node unresponsiveUse nodetool removenode or assassinate
CommandPurpose
nodetool decommissionRemove healthy node
nodetool removenodeRemove dead node
nodetool netstatsMonitor streaming
nodetool setstreamthroughputAdjust streaming speed
nodetool statusVerify cluster state