So far, one best practice I've discovered is as follows, but it has a couple holes.
Presume that you've got a single load balancer, 2 web servers (A & B) and 2 database servers (M & N - kept hot-synced via log shipping).
Webserver A to be disconnected from load balancer (so all incoming traffic goes to B).
Log shipping is stopped (DB Server M is going to get updated first).
Update Webserver A. Point the configuration to DB Server M.
Test and verify that the update worked.
Set the load balancer so that existing sessions continue to go to B. New sessions go to A.
Wait for all sessions on B expire.
Update B and N.
Test and verify that the update worked.
Set up log shipping again and test it works.
Set the load balancer to regular operation.
BUT...
What I don't understand is, if old sessions are still routed to the non-updated webserver B, and new sessions go to the updated server A, any commits to the old B-N pair while A was offline will leave the data in an inconsistent state once the load balancer is re-enabled and log shipping starts, with A-N as the master.
What am I missing?
Thanks.