# Tolerancia frente a fallos

En informática, la tolerancia a fallos o conmutación por error (en inglés: failover) se refiere a la capacidad de un sistema de seguir funcionando, aún en caso de producirse algún fallo en el sistema. Observar que los fallos pueden ser no intencionados (por ejemplo, caídas de sistemas, fallos en el cableado, fallo hardware) o intencionados por alguna parte no confiable del sistema (problema de los generales bizantinos)
El nivel de tolerancia a fallos dependerá de las técnicas utilizadas para conseguirlo. No obstante, nunca será absoluta ya que siempre hay algún tipo de fallo masivo que produciría un error irrecuperable. Cada sistema hay que diseñarlo (diseño de tolerancia a fallos) de forma que los esfuerzos realizados para mitigar cierto tipo de fallos compensen los perjuicios que provocaría no tolerar ese tipo de fallo.

## Estrategias

Hay distintas estrategias para conseguir un sistema lo más tolerante de fallos posible. Las más importantes son:

### Redundancia

Una de las formas en la que las redes confiables proporcionan redundancia es mediante la implementación de una red conmutada por paquetes. La conmutación por paquetes divide el tráfico en paquetes que se enrutan a través de una red compartida. Un solo mensaje, como un correo electrónico o una transmisión de vídeo, se divide en múltiples bloques de mensajes, llamados paquetes. Cada paquete tiene la información de dirección necesaria del origen y el destino del mensaje. Los routers dentro de la red conmutan los paquetes según la condición de la red en ese momento. Esto significa que todos los paquetes en un mismo mensaje pueden tomar distintas rutas para llegar a destino.
Ejemplos de uso de esta estrategia son:
* Uso de códigos detectores y correctores de error.
* Tener módulos pasivos que hacen exactamente lo mismo que otros activos de forma que puedan sustituirlo y evitar que sistema se caiga por el fallo de un ese elemento.
* Redundancia modular. Consiste en tener un número normalmente impar (para evitar luego empates) de módulos que hacen la misma función aunque pueden implementarla de forma diferente. Luego hay un módulo (el cual puede tener a su vez redundacia modular) que evalúa las salidas de dichos módulos y toma como resultado global el resultado que devuelve la mayoría de los módulos redundantes.

### Replicación

Para evitar que un fallo produzca la pérdida de la información almacenada un sistema se suele replicar esa información en más de un soporte físico (redundancia), o en un equipo o dispositivo externo a modo de respaldo. De esta forma, si se produce alguna falla que pueda ocasionar pérdida de datos, el sistema debe ser capaz de restablecer toda la información, recuperando los datos necesarios a partir de algún medio de respaldo disponible.
En esto se basa el sistema de almacenamiento en RAID (Redundant Array of Independent Disks). Los sistemas RAID (a excepción de RAID 0) se basan en la técnica mirroring («en espejo»), que permite la escritura simultánea de los datos en más de un disco del array.
En sistemas distribuidos es frecuente replicar la información para conseguir que sean tolerantes a los fallos. Para hacer que dicha información sea consistente en todo el sistema distribuido se implementan protocolos de consenso

### Autocorrección

Esta estrategia es la que hacen los navegadores de internet. Cuando el navegador de internet envía una solicitud HTTP al servidor WEB este responde con el contenido del sitio en formato estandarizado HTML o XHTML, si este código viene con errores (el estándar no se cumple), entonces el navegador es libre de elegir que hacer con él, ya sea no mostrar el contenido con problemas, intentar corregirlo o simplemente mostrarlo en texto plano. Normalmente lo que hacen es intentar corregirlo.