It's not a quick answer since it takes a lot of real world learning to really master high availability in a data center, on the platform and at the application level. At a high level, here are some things to consider.
To be resilient to server crashes and patching, you'll need load balancing at the site level, some sort of SQL HA solution, and an application that isn't locked to a single server.
For the site level, there are many 3rd party load balancers that are themselves redundant. Or, Microsoft's Application Request Routing (ARR) solution is a great option too.
For SQL Server, the built-in clustering, mirroring or log shipping options often fit the bill, plus products like DoubleTake do a great job at meeting this need.
At the application level, you'll need to make sure that nothing depends on a single node. Session state is the most common dependency. If it's used, it needs to be offloaded to a redundant solution. SQLServer Session State, ScaleOutSoftware and now AppFabric are all options to consider.
True redundancy needs to be geo-redundant across data centers, which need to be far enough apart that they won't be affected by any major natural disaster.
And, no technology is sufficient without a lot of testing and great processes and procedures to know how to handle unexpected situations as smoothly as possible, and to test the various redundant parts of the system at regular intervals.