Here's my 2 cents ... Lets keep it as simple as possible by using sticky sessions and a single node failover. In other words, every node has one buddy to which it replicates state, but each session is assigned to a single node and only in the event of a node failure, does a session move to the buddy node. If both buddies fail, the session is lost. Buddies can form dynamically as nodes are brought on line and should favor partnerships with nodes on different hardware -- to avoid loosing both buddies in a hardware failure.
IMO, this is the most straight forward solution and the easiest to build and maintain. It also avoids the chattiness of multi-node replication and the single point of failure associated with shared store. The one problem with this solution, IMO, is that you have to deploy clusters in twos - every node needs to have a buddy if you want failover. Loads are balanced using a round robin approach at the start of a session.
