(I'm sorry, I'm not native english speaker, so I can make stupid mistakes in writing. Hope I don't look impolite.) I tried to invent some phrases to clarify description of MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, but fails. I draft some pseudocode understanding how this three behaviour options (MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT and MEMCACHED_BEHAVIOR_RETRY_TIMEOUT) implies on libmemcached work. ---------------------- If consistent hashing is not enabled and one server from a server list is down, libmemcached do follows: waits for MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT or MEMCACHED_BEHAVIOR_POLL_TIMEOUT and receives 'false' from network operation marks server as DISABLED // note that connection tries counter = 1 as there was previous successfull connection (on this call and next calls with keys mapped to this sever, supposing that server is DISABLED) if ( MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS is set ) { if ( connection tries counter => MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT ) { marks server as DEAD and wipes key hashes. This server will be not used anymore. returns false. Corresponding error message is "SERVER IS MARKED DEAD". } } if ( elapsed time after previous operation > MEMCACHED_BEHAVIOR_RETRY_TIMEOUT ) { increases connection tries counter tries to connect to the server if ( server is alive again ) { reset DISABLED flag and set connection tries counter to 1 returns true } } return false. Corresponding error message is "SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY". If consistent hashing is ENABLED and one server from a server list is down, libmemcached do follows: waits for MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT or MEMCACHED_BEHAVIOR_POLL_TIMEOUT and receives 'false' from network operation marks server as DISABLED // note that connection tries counter = 1 as there was previous successfull connection (on this call and next calls with keys mapped to this sever, supposing that server is DISABLED) if ( MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS is set ) { if ( MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT = 1 ) { redistributes key hashes to other servers. Connects to them if needed. returns true, but with error message is "SERVER IS MARKED DEAD". } if ( connection tries counter > MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT ) { marks server as DEAD and wipes key hashes. This server will be not used anymore. If key hashes was redistributed, they will be kept on other servers until expire. returns false. Corresponding error message is "SERVER IS MARKED DEAD". } } if ( elapsed time after previous operation > MEMCACHED_BEHAVIOR_RETRY_TIMEOUT ) { increases connection tries counter tries to connect to the server if ( server is alive again ) { reset DISABLED flag and set connection tries counter to 1 returns true } } return false. Corresponding error message is "SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY". I reach consistent hashing working only in one special case, when it is enabled, MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS is set to true and MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT is set to 1. And to successfully use redistributed keys on live server, I have to set MEMCACHED_BEHAVIOR_RETRY_TIMEOUT to infinity. But then libmemcached will never check died server for alive. And when died server will come alive, libmemcached will be still use redistributed keys on other servers. I cannot name this sutuation as 'automatic failover'. But this behaviour is good for manual reaction on problems.