In environments where availability is of utmost importance, administrators usually implement clustering technologies. Clustering technologies are usually applied to database, email, or web servers. If a server fails, another "node" is able to pick up where the first left off, and in many cases users are completely unaware that a failure occurred.
Unfortunately, seamless clustering failover technology is not available with Terminal Server, and is unlikely to be for some time. In fact, no Terminal Server-based technology can do this—not Microsoft, not Citrix, and not Linux. Now, before you slam this book down and tell everyone that this technology is completely bunk, think about what this means.
If a user is using a remote application on a Terminal Server and that server fails, the user's application will not magically appear on another Terminal Server right where she left off. That would require mirrored disks, shared memory stacks, dynamic program executables, and all sorts of other tools that haven't been invented yet.
What is possible with today's technology is load-balanced redundant environments. You can build your Terminal Server environment so that if a server fails (obviously ending the sessions of any users connected to it), the user can immediately reconnect to a new server and launch her application again. (This is much better than in traditional environments where applications run on users' desktops.)
It is also possible to configure redundant hardware on your servers and manage them in a way to minimize the chance that they'll go down.