MMO Starter Kit

For what it’s worth: The authority of externally-visible state should be the database. For preventing multiple logins, this means storing “this character was last seen on server X at time Y” in the database. Make each server update the record every 30 seconds they have the character. When trying to log in, if the record is less than 60 seconds old, assume the player is already logged in. If the record is over 60 seconds old, contact the server that last updated the record, and ask whether it has that character.
This mechanism lets any server in your system determine whether a player is “already online” or not, and “where it is.” Note that, as players travel between servers, there will be small time intervals where you may have to re-try a request. Also, this system lets your servers detect whether two separate servers both think they have the player (this happens in real distributed systems!) – when a server goes to update the record, if it was recently updated by another server, at a time when the original server believes it should have had the player, sound the alarm!