Cassandra CQL Keyspace Commands
Keyspaces are the top-level namespace in Cassandra, analogous to databases in relational systems. Each keyspace defines replication strategy and options that apply to all tables within it.
Behavioral Guarantees
Section titled “Behavioral Guarantees”What Keyspace Operations Guarantee
Section titled “What Keyspace Operations Guarantee”- CREATE KEYSPACE creates metadata that propagates to all nodes via gossip
- Schema changes are atomic at the coordinator level
- IF NOT EXISTS and IF EXISTS clauses provide idempotent operations
- Replication settings take effect immediately for new writes after schema agreement
- DROP KEYSPACE triggers automatic snapshot creation when
auto_snapshot: true(default)
What Keyspace Operations Do NOT Guarantee
Section titled “What Keyspace Operations Do NOT Guarantee”Undefined Behavior
The following behaviors are undefined and must not be relied upon:
- Immediate schema visibility: Other nodes may not see schema changes until gossip propagates (typically milliseconds, but can be longer under load)
- Data movement on ALTER: Changing replication settings does not automatically move data; repair or rebuild is required
- Atomic multi-node updates: Schema propagation is eventually consistent, not transactional
- Immediate replica deletion: Reducing replication factor does not immediately delete excess replicas
Schema Agreement Contract
Section titled “Schema Agreement Contract”Schema changes require agreement across the cluster:
| State | Description | Client Impact |
|---|---|---|
| Schema agreed | All nodes have same schema version | Safe to proceed |
| Schema disagreement | Nodes have different schema versions | Operations may fail or behave unexpectedly |
Monitor schema agreement with:
nodetool describeclusterFailure Semantics
Section titled “Failure Semantics”| Failure Mode | Outcome | Client Action |
|---|---|---|
| Timeout during CREATE/ALTER | Undefined - schema may or may not have propagated | Check schema agreement, retry if needed |
| Node down during schema change | Schema propagates when node returns | Monitor schema agreement |
InvalidRequest | Operation rejected, no change | Fix request and retry |
Unauthorized | Permission denied, no change | Request appropriate permissions |
Version-Specific Behavior
Section titled “Version-Specific Behavior”| Version | Behavior |
|---|---|
| 3.0+ | Improved schema propagation via system_schema keyspace |
| 4.0+ | Schema pull on gossip (CASSANDRA-13426), faster agreement |
| 5.0+ | Transactional metadata (CEP-21) for atomic schema changes |
CREATE KEYSPACE
Section titled “CREATE KEYSPACE”Create a new keyspace with specified replication configuration.
Synopsis
Section titled “Synopsis”CREATE KEYSPACE [ IF NOT EXISTS ] *keyspace_name* WITH REPLICATION = { *replication_map* } [ AND DURABLE_WRITES = { true | false } ]replication_map:
{ 'class': '*strategy_name*' [, *strategy_options* ] }Description
Section titled “Description”CREATE KEYSPACE defines a new namespace for tables with specified replication settings. The keyspace name becomes a namespace prefix for all objects created within it.
The replication strategy determines how Cassandra distributes data replicas across nodes. Choosing the correct strategy is critical for data durability, availability, and performance.
Parameters
Section titled “Parameters”keyspace_name
Section titled “keyspace_name”The identifier for the new keyspace. Must be unique within the cluster.
- Unquoted names are case-insensitive and stored in lowercase
- Quoted names (
"MyKeyspace") preserve case - Maximum length: 48 characters (may vary by version)
- Valid characters: letters, digits, underscores (must start with letter)
IF NOT EXISTS
Section titled “IF NOT EXISTS”Optional clause that prevents an error if a keyspace with the same name already exists. When specified:
- If keyspace exists: statement succeeds with no effect
- If keyspace does not exist: keyspace is created
Idempotent Operations
Use IF NOT EXISTS in application startup scripts and migration tools to make keyspace creation idempotent. This prevents errors when scripts run multiple times.
REPLICATION
Section titled “REPLICATION”Required. Defines how data is replicated across the cluster.
strategy_name must be one of:
| Strategy | Use Case | Required Options |
|---|---|---|
SimpleStrategy | Development, single datacenter | 'replication_factor': *n* |
NetworkTopologyStrategy | Production, multi-datacenter | '*datacenter_name*': *n* per DC |
LocalStrategy | System keyspaces only | None (internal use) |
SimpleStrategy
Section titled “SimpleStrategy”Places the first replica on the node determined by the partitioner, then places additional replicas on consecutive nodes in the ring, regardless of datacenter or rack topology.
WITH REPLICATION = { 'class': 'SimpleStrategy', 'replication_factor': 3}Production Warning
Never use SimpleStrategy in production multi-datacenter deployments. It does not respect datacenter boundaries, potentially placing all replicas in a single datacenter. This creates a single point of failure and increases cross-datacenter traffic.
NetworkTopologyStrategy
Section titled “NetworkTopologyStrategy”Places replicas in each datacenter according to specified replication factors. Within each datacenter, replicas are distributed across different racks when possible.
WITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'dc1': 3, 'dc2': 3}The datacenter names must match the datacenter names configured in each node's cassandra-rackdc.properties file or snitch configuration.
Datacenter Naming
Use consistent, meaningful datacenter names across the cluster. Common conventions:
- Geographic:
us-east,eu-west,ap-south - Functional:
analytics,oltp,search - Provider-specific:
aws-us-east-1,gcp-europe-west1
Replication Factor Guidelines
Section titled “Replication Factor Guidelines”| Workload | Recommended RF | Rationale |
|---|---|---|
| Development | 1 | Minimize resources |
| Testing | 2 | Basic redundancy |
| Production | 3 | Survives single node failure with QUORUM |
| High durability | 5 | Survives two node failures with QUORUM |
DURABLE_WRITES
Section titled “DURABLE_WRITES”Optional. Controls whether writes are recorded in the commit log before being acknowledged.
| Value | Behavior |
|---|---|
true (default) | Writes go to commit log, ensuring durability |
false | Writes bypass commit log, risking data loss on node failure |
Data Loss Risk
Setting DURABLE_WRITES = false disables the commit log for the keyspace. If a node crashes before memtables flush to SSTables, data will be permanently lost. Use only for:
- Caches that can be regenerated
- Temporary data that can be recomputed
- Development/testing environments
Examples
Section titled “Examples”Development Keyspace
Section titled “Development Keyspace”CREATE KEYSPACE dev_keyspaceWITH REPLICATION = { 'class': 'SimpleStrategy', 'replication_factor': 1};Production Single-Datacenter
Section titled “Production Single-Datacenter”CREATE KEYSPACE prod_keyspaceWITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 3};Production Multi-Datacenter
Section titled “Production Multi-Datacenter”CREATE KEYSPACE global_keyspaceWITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'us-east': 3, 'eu-west': 3, 'ap-south': 3};Cache Keyspace (No Durability)
Section titled “Cache Keyspace (No Durability)”CREATE KEYSPACE cache_keyspaceWITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 2}AND DURABLE_WRITES = false;Idempotent Creation
Section titled “Idempotent Creation”CREATE KEYSPACE IF NOT EXISTS my_keyspaceWITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 3};Restrictions
Section titled “Restrictions”Restrictions
- Keyspace names cannot be changed after creation
- System keyspaces (
system,system_schema, etc.) cannot be created or dropped - Replication factor cannot exceed the number of nodes in a datacenter
- At least one datacenter must be specified for
NetworkTopologyStrategy
- After creating a keyspace, no data movement occurs until tables are created and populated
- The keyspace metadata propagates to all nodes via gossip
- Creating a keyspace with RF > number of nodes succeeds but triggers warnings
- Monitor
nodetool describeclusterto verify schema agreement after creation
ALTER KEYSPACE
Section titled “ALTER KEYSPACE”Modify the replication strategy or options of an existing keyspace.
Synopsis
Section titled “Synopsis”ALTER KEYSPACE *keyspace_name* WITH REPLICATION = { *replication_map* } [ AND DURABLE_WRITES = { true | false } ]Description
Section titled “Description”ALTER KEYSPACE changes the replication configuration of an existing keyspace. This is a metadata-only operation that takes effect immediately for new writes.
Repair Required
After altering replication settings, existing data does not automatically redistribute. Run nodetool repair on all nodes to ensure data is replicated according to the new settings.
Parameters
Section titled “Parameters”REPLICATION
Section titled “REPLICATION”The new replication configuration. Completely replaces the existing configuration.
To add a datacenter, include all existing datacenters plus the new one:
-- Original: dc1: 3-- Adding dc2ALTER KEYSPACE my_keyspaceWITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'dc1': 3, 'dc2': 3};To remove a datacenter, omit it from the new configuration:
-- Removing dc2ALTER KEYSPACE my_keyspaceWITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'dc1': 3};Removing Datacenters
Before removing a datacenter from replication:
- Ensure no clients are reading from or writing to that datacenter
- Run
nodetool repairto ensure data is replicated elsewhere - Verify data integrity before decommissioning nodes
DURABLE_WRITES
Section titled “DURABLE_WRITES”Change the commit log behavior for the keyspace.
Examples
Section titled “Examples”Increase Replication Factor
Section titled “Increase Replication Factor”ALTER KEYSPACE my_keyspaceWITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 5};
-- Then run repair on all nodes-- nodetool repair my_keyspaceAdd a Datacenter
Section titled “Add a Datacenter”ALTER KEYSPACE my_keyspaceWITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'us-east': 3, 'eu-west': 3 -- New datacenter};
-- Repair to populate new datacenter-- nodetool rebuild -- dc us-east (run on eu-west nodes)Migrate from SimpleStrategy to NetworkTopologyStrategy
Section titled “Migrate from SimpleStrategy to NetworkTopologyStrategy”ALTER KEYSPACE legacy_keyspaceWITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 3};
-- Run repair to ensure proper replica placement-- nodetool repair legacy_keyspaceEnable Durable Writes
Section titled “Enable Durable Writes”ALTER KEYSPACE cache_keyspaceWITH REPLICATION = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 2}AND DURABLE_WRITES = true;Restrictions
Section titled “Restrictions”Restrictions
- Cannot change keyspace name
- Cannot alter system keyspaces
- Reducing RF does not immediately delete excess replicas (removed during compaction)
- Changing strategy class requires specifying all new strategy options
- Schema changes propagate via gossip; monitor schema agreement
- Increasing RF: run
nodetool repairto create new replicas - Decreasing RF: excess replicas are removed during compaction
- Adding datacenter: use
nodetool rebuildon new datacenter nodes
DROP KEYSPACE
Section titled “DROP KEYSPACE”Remove a keyspace and all its contents permanently.
Synopsis
Section titled “Synopsis”DROP KEYSPACE [ IF EXISTS ] *keyspace_name*Description
Section titled “Description”DROP KEYSPACE permanently removes a keyspace and all objects within it: tables, indexes, materialized views, user-defined types, functions, and aggregates. All data is deleted.
Irreversible Operation
Dropping a keyspace cannot be undone. All data is permanently deleted.
Automatic Snapshots
If auto_snapshot: true is set in cassandra.yaml (enabled by default), Cassandra automatically creates a snapshot before deleting data. Verify this setting before relying on automatic snapshots:
auto_snapshot: true # Default: trueAutomatic snapshots are stored in <data_directory>/<keyspace>/<table_name>-<table_uuid>/snapshots/dropped-<epoch_millis>-<table_name>/ for each table in the keyspace. The keyspace and table directories are retained on disk to preserve the snapshots. See Automatic Snapshot Configuration for details. These SHOULD NOT be relied upon without verification—always confirm auto_snapshot is enabled in the cluster configuration.
Parameters
Section titled “Parameters”IF EXISTS
Section titled “IF EXISTS”Optional clause that prevents an error if the keyspace does not exist.
| Condition | Without IF EXISTS | With IF EXISTS |
|---|---|---|
| Keyspace exists | Keyspace dropped | Keyspace dropped |
| Keyspace does not exist | Error | No error, no effect |
Examples
Section titled “Examples”Basic Drop
Section titled “Basic Drop”DROP KEYSPACE old_keyspace;Safe Drop
Section titled “Safe Drop”DROP KEYSPACE IF EXISTS temp_keyspace;With Prior Snapshot
Section titled “With Prior Snapshot”# Create snapshot firstnodetool snapshot -t backup_before_drop my_keyspace
# Then dropcqlsh -e "DROP KEYSPACE my_keyspace;"Restrictions
Section titled “Restrictions”Restrictions
- Cannot drop system keyspaces (
system,system_schema,system_auth, etc.) - Cannot drop a keyspace while connected to it via
USE(disconnect first or use fully qualified names) - Requires appropriate permissions (DROP on keyspace or superuser)
- Drop is a metadata operation; data files are deleted asynchronously
- Connected clients using the keyspace receive errors after drop
- Snapshots created before drop preserve data and can be restored
- If any table in the keyspace has a materialized view, the view is also dropped
Set the current working keyspace for the session.
Synopsis
Section titled “Synopsis”USE *keyspace_name*Description
Section titled “Description”USE sets the default keyspace for subsequent CQL statements in the current session. After executing USE, table names can be specified without the keyspace prefix.
This is a session-level setting that does not affect other connections or persist across sessions.
Parameters
Section titled “Parameters”keyspace_name
Section titled “keyspace_name”The name of an existing keyspace to use as the default.
Examples
Section titled “Examples”Set Default Keyspace
Section titled “Set Default Keyspace”USE my_keyspace;
-- Now these are equivalent:SELECT * FROM users;SELECT * FROM my_keyspace.users;Switch Keyspaces
Section titled “Switch Keyspaces”USE keyspace_a;SELECT * FROM table1; -- Queries keyspace_a.table1
USE keyspace_b;SELECT * FROM table1; -- Queries keyspace_b.table1Fully Qualified Names Override USE
Section titled “Fully Qualified Names Override USE”USE keyspace_a;SELECT * FROM keyspace_b.table1; -- Queries keyspace_b despite USERestrictions
Section titled “Restrictions”Restrictions
- Keyspace must exist
- No
IF EXISTSclause available - Does not verify user has permissions on the keyspace (permissions checked on subsequent operations)
USEis primarily for interactivecqlshsessions- Application code should typically use fully qualified table names
- Driver connection configurations often specify default keyspace
- Using
USEin application code can lead to subtle bugs if connections are pooled
Application Best Practice
In application code, prefer fully qualified table names (keyspace.table) over USE statements. This makes queries explicit and avoids issues with connection pooling where keyspace state might be unexpected.
Related Documentation
Section titled “Related Documentation”- CREATE TABLE - Create tables within keyspaces
- Data Modeling - Keyspace design considerations
- Architecture: Replication - How replication works