How to remove a dead node from an Apache Cassandra cluster

A dead Apache Cassandra node can remain in the ring after the process, host, or disk is permanently gone. Leaving that membership entry in place keeps the cluster assigning token ranges to a node that cannot stream data or receive repairs, so removal should happen only after the node is confirmed lost rather than temporarily down.

nodetool removenode tells a live Cassandra node to remove a dead node's host ID from cluster membership. Cassandra then assigns the dead node's token ranges to surviving nodes and streams any needed data from remaining replicas; nodetool decommission is the safer path when the departing node is still running.

The command is destructive from the cluster's point of view because the old host ID should not rejoin afterward. Confirm keyspaces have enough surviving replicas for the ranges being reassigned, decide whether a replacement-node workflow is more appropriate, and keep a repair window ready when the node was down longer than the hinted handoff window or missed writes.

Steps to remove a dead Apache Cassandra node from the cluster:

  1. Run nodetool status from a live node and identify the down node's Host ID.
    $ nodetool status
    Datacenter: dc1
    ===============
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address     Load      Tokens  Owns (effective)  Host ID                               Rack
    UN  10.0.10.11  2.48 GiB  256     100.0%            8f4b4df0-38e9-4d76-8df8-609bb8e36a11  rack1
    UN  10.0.10.12  2.51 GiB  256     100.0%            b11f8fb4-7cf3-40b9-a8f6-ff1b1e65ac21  rack1
    DN  10.0.10.13  2.39 GiB  256     100.0%            e8b7f3c3-f0b6-44b0-a16f-5c72ad76a345  rack1

    DN means down and normal in the status legend. Run the check from more than one live node if gossip views disagree.
    Related: How to check Apache Cassandra cluster status with nodetool

  2. Confirm the node is permanently lost and should not be decommissioned or replaced in place.

    Use nodetool decommission for a live node. Use the replacement workflow instead when a new Cassandra process should take over the dead node's address or host identity.

  3. Start the removal from a live Cassandra node using the dead node's Host ID.
    $ nodetool removenode e8b7f3c3-f0b6-44b0-a16f-5c72ad76a345

    Do not use the node IP address here. removenode expects the host ID shown by nodetool status.

  4. Check the removal state until no token removal is active.
    $ nodetool removenode status
    RemovalStatus: Removing token (-6124872051879382454). Waiting for replication confirmation from [/10.0.10.11, /10.0.10.12].

    The exact token and replica list vary by ring. If the same token message does not move for a long time, inspect logs before using nodetool removenode force.

  5. Check streaming progress on the live nodes.
    $ nodetool netstats
    Mode: NORMAL
    Not sending any streams.
    Read Repair Statistics:
    Attempted: 0
    Mismatch (Blocking): 0
    Mismatch (Background): 0
    Pool Name                    Active   Pending      Completed   Dropped
    Large messages                  n/a         0              0         0
    Small messages                  n/a         0              8         0
    Gossip messages                 n/a         0          1,284         0

    During the removal, nodetool netstats can show active receiving or sending streams. Repeat the check on each surviving node that owns data for the affected keyspaces.

  6. Verify the removal has completed.
    $ nodetool removenode status
    RemovalStatus: No token removals in process.
  7. Confirm the removed host ID is absent from cluster status.
    $ nodetool status
    Datacenter: dc1
    ===============
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address     Load      Tokens  Owns (effective)  Host ID                               Rack
    UN  10.0.10.11  2.72 GiB  256     100.0%            8f4b4df0-38e9-4d76-8df8-609bb8e36a11  rack1
    UN  10.0.10.12  2.76 GiB  256     100.0%            b11f8fb4-7cf3-40b9-a8f6-ff1b1e65ac21  rack1
  8. Review Cassandra logs on surviving nodes for removal or streaming errors.
    $ sudo journalctl -u cassandra --since "1 hour ago"
    Jun 17 10:42:31 cassandra-01 cassandra[1842]: Removal of e8b7f3c3-f0b6-44b0-a16f-5c72ad76a345 completed
    Jun 17 10:42:34 cassandra-01 cassandra[1842]: Stream session with /10.0.10.12 completed
  9. Run repair for affected keyspaces when the dead node missed writes beyond the hinted handoff window or a replacement is not being started immediately.
    $ nodetool repair app_keyspace
    [2026-06-17 10:55:02,411] Starting repair command #3, repairing keyspace app_keyspace
    [2026-06-17 11:04:18,936] Repair command #3 finished in 9 minutes 16 seconds