There are two dominant forms of building distributed systems: client-server systems, i.e. systems in which one machine acts as a server and act as clients; and peer-to-peer systems, where each host is both a server and a client. Standard web access follows the client-server model, and services such as BitTorrent follow the peer-to-peer model. However, in real life these are not completely distinct; for instance, internally Google applies some of each of these methodologies. Actually, client-server system are sometimes implemented as a chain of clients and servers, even though from the point of view of the client there's only one server.
Another possible building pattern is that in which the client communicates directly with only a server, but in the background its requests are actually processed by a cloud of machines, which actually resembles the way Google works internally. In this case, the cloud of machines implements a system with lots of redundancy (e.g. via a big distributed ?le system). Some of the machines in the cloud hold data, and other machines hold meta-data. When some client requests, for instance, a ?le, the meta-data servers ?rst identify which other machines hold each piece of that ?le. This type of architecture represents the current trend being followed when creating large scale systems. So, in practice, we see that current successful large scale systems are a mix between client-server architectures and peer-to-peer systems, implemented with lots of storage and computational redundancy.