Cassandra in a nutshell:
- Scales writes very, very well: just add more nodes!
- Has a much richer data model than vanilla key/value stores -- closer to what you'd be used to in a relational db.
- Is pretty bleeding edge -- to my knowledge, Facebook is the only group running Cassandra in production. (Their largest cluster is 120 machines and 40TB of data.) At Rackspace we are working on a Cassandra-based app now that 0.3 has the extra features we need.
- Moved to the Apache Incubator about 40 days ago, at which point development greatly accelerated.
- Range queries on keys, including user-defined key collation.
- Remove support, which is nontrivial in an eventually consistent world.
- Workaround for a weird bug in JDK select/register that seems particularly common on VM environments. Cassandra should deploy fine on EC2 now. (Oddly, it never had problems on Slicehost / Cloud Servers, which is also Xen-based.)
- Much improved infrastructure: the beginnings of a decent test suite ("ant test" for unit tests; "nosetests" for system tests), code coverage reporting, etc.
- Expanded node status reporting via JMX
- Improved error reporting/logging on both server and client
- Reduced memory footprint in default configuration
- and plenty of bug fixes.
- An advanced on-disk storage engine that never does random writes
- Transaction log-based data integrity
- P2P gossip failure detection
- Read repair
- Hinted handoff
- Bootstrap (adding new nodes to a running cluster)
The cassandra development and user community is also growing at an exciting pace. Besides the original two developers from Facebook, we now have five developers regularly contributing improvements and fixes, and many others on a more ad-hoc basis.
How fast is it?
In a nutshell, Cassandra is much faster than relational databases, and much slower than memory-only systems or systems that don't sync each update to disk. Actual benchmarks are in the works. We plan to start performance tuning with the next release, but if you want to benchmark it, here are some suggestions to get numbers closer to what you'll see in the wild (and about 10x more throughput than if you don't do these):
- Do enough runs of your benchmark first that each operation tested by your suite runs 20k times before timing it for real. This will allow the JVM jit to compile down to machine code; otherwise you'll just be getting the interpreted version.
- Change the root logger level in conf/log4j.properties from DEBUG to INFO; we do a LOT of logging for debuggability and for small column values the logging has more overhead than the actual workload. (It would be even faster if we were to remove them entirely but that didn't make this release.)