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.
$ 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
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.
$ nodetool removenode e8b7f3c3-f0b6-44b0-a16f-5c72ad76a345
Do not use the node IP address here. removenode expects the host ID shown by nodetool status.
$ 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.
$ 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.
$ nodetool removenode status RemovalStatus: No token removals in process.
$ 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
$ 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
Related: How to view Apache Cassandra logs
$ 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
Related: How to run Apache Cassandra repair