Load balancing does not require collaboration between the separate servers. When the servers are aware of each other and actively participate in distributing load, then they form a cluster. Clusters can be used for load balancing, in the case of active/active clusters. They can also be used for redundancy in the case of failure. These are called active/passive clusters, meaning that one server handles all the load until it fails and then the passive one takes over and becomes active. There is overhead in the implementation of clustering so the scaling factor is not linear.
For applications that do not have their own native clustering, it is possible to run them under the control of a cluster server, such as Veritas Cluster Server. The author has an interesting opinion on cluster servers: "I am ambivalent about cluster servers. At the same time, they are marvelous and kludgy. They can add redundancy and failover to applications that weren’t designed for it. Configuring the cluster server itself is finicky, though, and applications usually have a few small glitches when failing over. The biggest drawback is probably that these run in active/passive mode. So, redundancy is achieved, but scalability is not. I consider cluster servers a Band-Aid for applications that don’t do it themselves." Cluster servers are also expensive. I've used clustering solutions baked into JavaEE servers but you need to test to see exactly how the fail over works.