1. Introduction
Distributed systems can provide higher availability than centralized ones by remaining functional despite failures of some of their components. Ensuring application-level consistency in a distributed system often requires agreement among the components.