Context: Amazon uses a service oriented architecture consisting of a huge number of services. Handling failures is the default mode of operation for Amazon handling these many services. At any given time, there are many failing services. Dynamo is designed by keeping this in mind. It has to have high availability inspite of the many failing services. Dynamo sacrifices consistency under certain failure scenarios to achieve this level of high availability.
Design
Eventually consistent - updates reach all replicas eventually.
Always writeable - Conflict resolution is handled during reads instead of writes so that writes are never rejected.
Conflict resolution - The application has the option to be the conflict resolution owner but, in case it doesn’t want to handle it, the store uses the “last write wins” approach for conflict resolution.
Incremental stability - Can scale one node at a time with minimal impact to both the operators of the system and the system itself.
Symmetry - Every node has the same responsibility (no ownership model).
Decentralized - Centralized control can result in outages. Dynamo’s design favors decentralization.
Heterogeneity - Work can be distributed to nodes based on it’s capacity.