Server racks behind mesh doors with dense green, yellow and orange network cabling in a dark room
    Apache Cassandra

    Apache Cassandra consulting and data modeling

    Cassandra handles heavy write traffic across data centers, but only when tables are modeled around queries and the cluster is repaired and compacted on schedule. Agnotic Technologies designs, tunes and operates Apache Cassandra clusters with your team, from the first table to version upgrades.

    Query-first modelingPartition sizingMulti data centerRepair and compaction

    Trusted by global innovators

    Benchmark
    Chibasco
    Fundency
    Lantimer
    Lauren
    Lera
    One Minute
    Pento Pix
    TAP
    Xtrium
    Healthevolve
    Benchmark
    Chibasco
    Fundency
    Lantimer
    Lauren
    Lera
    One Minute
    Pento Pix
    TAP
    Xtrium
    Healthevolve
    Benchmark
    Chibasco
    Fundency
    Lantimer
    Lauren
    Lera
    One Minute
    Pento Pix
    TAP
    Xtrium
    Healthevolve
    Benchmark
    Chibasco
    Fundency
    Lantimer
    Lauren
    Lera
    One Minute
    Pento Pix
    TAP
    Xtrium
    Healthevolve

    Cassandra consulting

    What does Apache Cassandra consulting involve?

    Apache Cassandra consulting is designing the tables, replication and operations of a Cassandra cluster so reads stay fast and data stays correct as it grows. Agnotic Technologies models one table per query, sizes partitions, sets consistency per data center, picks compaction per table, schedules repair and plans version upgrades.

    We work on new clusters and on existing ones with slow reads, growing disks or deleted data that came back.

    Cassandra is a wide-column database built for high write volume across many nodes and regions. When a workload needs joins, ad hoc reporting or transactions across many rows, we say so early and suggest a better fit.

    Data modeling

    How do we model a Cassandra table from its queries?

    Cassandra has no joins, so the model starts from the application's queries, not from its entities.

    1. List every query

      Each screen and API call the application needs, with its filters, sort order and expected volume. This list is the design input.

    2. Give each query its own table

      Data is duplicated across tables on purpose, so every query reads one partition. Writes go to each table that needs the data, often in a logged batch.

    3. Choose the partition key

      The partition key decides which nodes hold the data. It must spread writes across the cluster and match the query's equality filter.

    4. Order rows with clustering columns

      Clustering columns sort rows inside a partition, so a range query such as the latest readings for a device returns in order with no sorting at read time.

    5. Bucket partitions that would grow forever

      Time series and event tables add a time bucket, such as a day or a month, to the partition key so no partition grows without limit.

    6. Check partition size before load

      We estimate rows and cells per partition with the formula in the Cassandra documentation, then test with your largest customers or devices.

    Failure points

    Where do Cassandra clusters go wrong, and how do we check?

    The failures we look for first when we review a cluster, each with the check that finds it.

    Challenge

    Oversized or hot partitions: one customer, device or day holds far more data than the rest, and the nodes that own it slow down.

    Agnotic approach

    Check nodetool tablehistograms and the large partition warnings in the logs, then add a bucket to the partition key or split the hot key.

    Challenge

    Tombstones pile up from deletes, null writes and expired TTLs, so reads scan many dead cells.

    Agnotic approach

    Check tombstone warnings in the logs and tombstones per slice in nodetool tablestats. Stop writing nulls, use time-window compaction for TTL data and avoid row deletes inside wide partitions.

    Challenge

    Repairs missed for longer than gc_grace_seconds, so deleted data reappears from a node that missed the delete.

    Agnotic approach

    Check the last successful repair per table against its gc_grace_seconds, and schedule repairs well inside that window.

    Challenge

    The wrong compaction strategy for time series, so expired data is never dropped and disks keep growing.

    Agnotic approach

    Check the compaction strategy and SSTable count per table, and move time-ordered TTL data to time-window compaction or a tuned unified setting.

    Challenge

    ALLOW FILTERING and secondary indexes used for everyday queries, so reads touch every node.

    Agnotic approach

    Check query logs for ALLOW FILTERING and index use, then add a table for the query, or use storage-attached indexes where the filter suits them.

    Challenge

    Consistency levels that do not overlap across data centers, such as writes at LOCAL_ONE and reads at LOCAL_QUORUM that expect to see them.

    Agnotic approach

    Check the consistency level each driver call sets, and pair reads and writes so their replicas overlap, usually LOCAL_QUORUM for both.

    Compaction

    Which compaction strategy fits each table?

    Compaction is set per table. The right choice depends on how the table is written, read and deleted.

    CodeNameTypical use
    UCSUnified Compaction StrategyRecommended in the Cassandra 5.0 documentation for most workloads. It can be configured to behave like the older strategies and can change parameters without a full recompaction.
    STCSSize-Tiered Compaction StrategyWrite-heavy tables with few range reads. Needs spare disk space while large compactions run.
    LCSLeveled Compaction StrategyRead-heavy tables with frequent updates, where each read should touch few SSTables. Costs more disk I/O on writes.
    TWCSTime Window Compaction StrategyMostly immutable time series written in time order with a TTL, so whole SSTables expire and are dropped together.

    Consistency

    Which consistency level should each query use?

    Consistency is chosen per request. We set it per query from how fresh the answer must be and how far the request may travel.

    01

    LOCAL_QUORUM

    Example: Reads and writes for users served from one region

    Approach: A majority of replicas in the local data center must respond. Used on both reads and writes, a client sees its own writes without waiting on other regions.

    02

    EACH_QUORUM

    Example: Writes that must reach every region before they count

    Approach: A majority in every data center must respond, so latency follows the slowest region. We keep it for the few writes that need it.

    03

    QUORUM

    Example: Clusters in a single data center

    Approach: A majority of all replicas. Across regions it adds cross-region round trips, so multi-region clusters usually use LOCAL_QUORUM instead.

    04

    ONE or LOCAL_ONE

    Example: Metrics, logs or caches where a slightly stale read is acceptable

    Approach: One replica responds, for the lowest latency. Repair and read repair close the gap later.

    Hosting

    Self-managed cluster or a managed Cassandra-compatible service?

    Both can work. The choice depends on control, team skills and which Cassandra features your application uses.

    Self-managed Apache Cassandra

    • Virtual machines, or Kubernetes with an operator
    • Full control of versions, compaction and repair
    • Your team or ours runs upgrades, repair and on-call

    Managed Apache Cassandra

    • Azure Managed Instance for Apache Cassandra
    • Provider-run clusters from Cassandra-focused vendors
    • Apache Cassandra itself, with daily operations handled for you

    Cassandra-compatible serverless services

    • Amazon Keyspaces (for Apache Cassandra)
    • CQL compatible, with no nodes to manage
    • Feature support differs, so we test every query and driver setting first

    What we check before choosing

    • CQL features and indexes the application uses
    • Regions and where data must stay
    • Who is on call when a node fails
    Upgrades

    How do we upgrade a Cassandra cluster?

    1.

    Check the release line

    We confirm which release lines are still maintained and read the upgrade notes for every version between yours and the target.

    Plan
    2.

    Test on a copy

    A test cluster restored from a snapshot runs the new version against your real queries and drivers.

    Test
    3.

    Rolling upgrade

    Nodes are upgraded one at a time with repairs paused, and the cluster keeps serving traffic throughout.

    Upgrade
    4.

    Rewrite SSTables, then adopt features

    Once every node runs the new version, SSTables are rewritten to the new format, and features such as storage-attached indexes are trialled on chosen tables.

    Adopt

    Fit check

    Should you use Cassandra at all?

    Cassandra is a poor fit for some workloads. These signs point elsewhere.

    • Users build their own filters and reports at run time, which a warehouse handles better
    • The data model depends on joins and transactions across many entities
    • Write volume fits comfortably on one PostgreSQL server with replicas
    • Nobody will own repair, compaction and node replacement, and a managed service does not fit either
    • Big data Cassandra for startups makes sense when write volume or multi-region needs are real today, not expected one day
    • When Cassandra is wrong, we suggest PostgreSQL, a warehouse, Amazon DynamoDB or Redis, depending on how the data is read

    Which workloads suit Apache Cassandra?

    Device and sensor readings

    High write rates keyed by device and time, read back as recent ranges.

    Activity feeds and messaging

    Per-user timelines and message history written constantly and read by user.

    Multi-region applications

    Data replicated to several data centers, so each region reads and writes locally.

    Order and event history

    Large, mostly append-only records looked up by customer or account.

    Profile and counter lookups

    Fraud signals, personalization profiles and counters read by key at low latency.

    Scope and cost

    What drives the cost of Cassandra consulting?

    We do not publish prices. These factors decide big data Cassandra cost, and we size them on the scoping call.

    New design or existing cluster

    A new model is a query list and a schema. An existing cluster adds a review of logs, metrics and repair history.

    Number of queries and tables

    Each query usually becomes a table, with its own writes and tests.

    Data centers and regions

    Each data center adds replication settings, consistency choices and failure tests.

    Data migration

    Moving data into new tables or from another database means a backfill and a switch-over the application controls.

    Version gap

    Upgrading across several release lines adds test cycles.

    Operations handover

    Runbooks for repair, backups, node replacement and on-call.

    References

    Cassandra references we work from

    Cassandra data modeling guideCQL specificationCassandra operations guidenodetoolApache Cassandra downloads
    Facts and sources

    Facts behind Cassandra design

    Limits and rules from the Apache Cassandra documentation that shape our tables, consistency choices and repair schedules.

    Frequently Asked Questions

    It depends on how many queries the application has and whether data must move from existing tables. The query list and table design are usually the first deliverable, and we agree that scope on the scoping call.