um balanceador de carga de aplicativos como o haproxy faz isso. por exemplo, se detectar erros 5xx de um servidor da web, ele poderá marcar o servidor como com falha. Além disso, se um servidor falhar no handshake de três vias, ele poderá marcá-lo como com falha, além de tentar outro servidor enquanto o cliente continua aguardando.
usando keepalived e heartbeat, você pode ter um par de servidores haproxy. se um falhar, o outro assume.
Eu uso o haproxy como exemplo aqui, mas praticamente qualquer balanceador de carga de aplicativo (balanceadores de carga de camada 4/7) tem essas características.