There are many, many ways to achieve what you want to achieve. Sticking with free and open source software, the solution with the lowest maintenance overhead would likely be drbd. It basically mirrors your server over the network. Think of it as doing what raid-1 does for disks, but for an entire machine. This is somewhat wasteful, however, since AFAIK drbd only works in an active/passive configuration. Correct me if I'm wrong.
You could also try doing things at the application level, for instance master-master replication for mysql (or master-slave, depending on whether you'd like to have an active/active setup for performance reasons). For the web-servers, since the dynamic portion of your content is likely database driven, simply copying the same config across all of your servers and having them connect to your replicated databases may be sufficient (in coordination with your load balancing scheme . . . see below).
As for deciding what traffic goes where, this is a job for a load balancer. Your options here will depend on your OS.