Implement a Dynamo-style key-value storage and the main goal is to provide both availability and linearizability at the same time. There are three main pieces to implement: 1) Partitioning, 2) Replication, and 3) Failure handling.