Replication Techniques in Distributed Systems