An introduction to distributed systems