Why cassandra doesn't use logical clocks?
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
Apache Cassandra is a highly scalable, distributed database designed to handle large amounts of data across many commodity servers, providing high availability with no single point of failure. One interesting aspect of Cassandra's architecture is its approach to time and data versioning for which it uses timestamps rather than logical clocks, such as the often-discussed Lamport timestamps or vector clocks. Here’s a deeper exploration into why Cassandra opts for timestamps instead of logical clocks.
Why Cassandra Uses Timestamps Instead of Logical Clocks
1. Simplicity of Implementation and Use
Cassandra is designed to be simple and accessible, providing solutions that are easy to implement and maintain. Implementing and interpreting timestamps is generally simpler compared to managing the complexity of logical clocks. Timestamps are straightforward: they indicate exactly when a data modification was made, using either the system clock or a timestamp supplied by a client application.
2. Conflict Resolution
Cassandra employs a conflict resolution mechanism called Last Write Wins (LWW), where data written with a more recent timestamp will overwrite data written with an older timestamp. Using timestamps directly ties back to the physical time of write operations, making it easy for Cassandra to resolve conflicts across its distributed architecture by simply examining the timestamp values.
3. High Performance and Low Overhead
One of the key advantages of using timestamps is performance. Logical clocks, particularly vector clocks, involve additional storage and computation. Each node in a vector clock setup must maintain a vector of timestamps, one for each node in the system, leading to high overhead as the cluster scales. This is in contrast to the single scalar value required by timestamps. When dealing with the volume of data that Cassandra typically handles, this efficiency becomes crucial.
4. Scalability Concerns
Cassandra is built to scale horizontally; adding more nodes to a cluster should not significantly degrade performance. The simplicity of scalar timestamps scales better in large and geographically distributed systems. Logical clocks require synchronization and maintenance of additional state information that grows with the number of nodes, making them less ideal as the cluster size increases.
Limitations of Using Timestamps
However, relying solely on timestamps for ordering operations does have limitations. Timestamps can be prone to issues of clock drift and synchronization problems between different nodes in a distributed system:
- Clock Skew: The clocks on different machines may not be perfectly synchronized. Even with Network Time Protocol (NTP), slight differences can cause one node’s notion of "now" to be slightly ahead or behind another’s.
- Timestamp Collisions: When two updates occur at the same millisecond, the timestamp mechanism doesn't provide enough information to order these properly without potential data loss.
These issues are indeed significant, but Cassandra often addresses them at the application level or through settings that ensure NTP configurations are tight enough to minimize clock discrepancies.
Summary Table
Here is a summary of the key points discussed:
| Feature | Timestamps | Logical Clocks |
| Complexity | Low | High |
| Performance | High | Lower due to overhead |
| Storage Overhead | Low | High |
| Scalability | High | Moderate to low |
| Accuracy in Conflict Resolution | Good (with proper clock sync) | Excellent |
| Suitability for Large Clusters | Excellent | Moderate |
Conclusion
While logical clocks offer certain theoretical advantages, particularly in terms of providing causal ordering without reliance on synchronized clocks, Cassandra's choice of timestamps aligns with its goals of simplicity, performance, and scalability. The trade-offs made by opting for timestamps involve balancing the risks of clock skew and the overhead involved in maintaining more complex logical clock systems, guiding design towards solutions that support practical, real-world use at scale.
Related reading
- Why current term in raft consensus algorithm must be monotonic
- Why do comparisons with Integer.valueOfString give different results for 127 and 128?
- Why do replicas broadcast messages in Practical Byzantine Fault Tolerance?
- Why do we care about idempotent in distributed systems
- Why did a network-related or instance-specific error occur while establishing a connection to SQL Server?
- Why do we need message brokers like RabbitMQ over a database like PostgreSQL?
- Why do we need API gateway when using Kubernetes?
- Why do we need routing key in RabbitMQ?

System Design Fundamentals
Build a strong foundation in designing scalable, reliable distributed systems.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.