There are a few common solutions for highly available setups.
Probably the cheapest option is to use a
simple round-robin DNS setup to serve your site from multiple data centers. The drawback here is that if one of your nodes goes down, you have to update DNS manually and this update may take a while to propagate. Some of your users will see downtime as a result.
One step up from basic round-robin DNS is to use a third-party DNS service that does load balancing and health monitoring.
UltraDNS is one I know about, though have not used. These services monitor the availability of each node and reconfigure the DNS records (which have a TTL of a minute or less) to reduce downtime.
From there things get really expensive. Hardware products like
BIG-IP are what the big dogs use, but they aren't applicable for Linode setups.
That covers the external stuff. For the internal side, you need to think about how to replicate configuration and data between nodes. These options are covered pretty well in the Linode Library:
http://library.linode.com/linux-ha
For your setup, you'll need to consider Apache and MySQL. You can ignore the parts about IP failover if you're sticking with one node per data center.
To tie it all together for the highest availability, I would recommend combining at least two nodes behind a NodeBalancer in each of at least two data centers. Then you stick UltraDNS in front of your NodeBalancers. This covers individual node downtime, host downtime, and a full data center outage.
Hope this helps!