# Diseño de tolerancia a fallos

La tolerancia a fallos es la propiedad que le permite a un sistema seguir funcionando correctamente en caso de fallo de uno o varios de sus componentes. Si disminuye su calidad de funcionamiento, la disminución es proporcional a la gravedad de la avería, en comparación con un sistema diseñado ingenuamente de forma que hasta un pequeño fallo puede causar el colapso total del sistema. Tolerancia a fallos es particularmente buscado en sistemas de alta disponibilidad.
Un diseño tolerante a fallos es un sistema que está capacitado para continuar su funcionamiento cuando algún componente del sistema falla., posiblemente a un nivel más reducido, lo que es mejor a que el sistema falle completamente. El término es comúnmente usado para describir sistemas basados en computadoras diseñados para continuar en mayor o menor medida las operaciones que realiza con, a lo mejor, una reducción de su rendimiento o un incremento de los tiempos de respuesta en las componentes que fallan. Esto significa que el sistema, dada una falla de software o de hardware no se detiene. Un ejemplo en otra rama es el de un automóvil diseñado para continuar su funcionamiento si uno de sus neumáticos recibe un pinchazo.
Tolerancia a fallos es sólo una propiedad de cada una de las máquinas, sino que también puede caracterizar las reglas según las cuales interactúan. Por ejemplo, el protocolo TCP está diseñado para permitir una comunicación fiable de dos sentidos en una red de conmutación de paquetes, incluso en la presencia de enlaces de comunicaciones que son imperfectos o sobrecargados. Esto es así debido a que en los extremos de la comunicación se puede esperar pérdida de paquetes, la duplicación, la reordenación y la corrupción, a fin de que estas condiciones no dañen la integridad de los datos, y sólo reduzcan la capacidad de una cantidad proporcional.
La recuperación de errores en sistemas tolerantes de fallos puede caracterizarse como avanzar o retroceso. Cuando el sistema detecta que se ha cometido un error, la recuperación "avanzar" toma el estado del sistema en ese momento y lo corrige, para poder avanzar. La recuperación "retroceso" recupera el estado del sistema a algunos de los primeros y la versión correcta, por ejemplo mediante los puntos de recuperación, y se mueve hacia adelante. La recuperación en retroceso requiere que las operaciones entre el puesto de control y los errores detectados pueda ser inalterable. Algunos sistemas hacen uso de ambos tipos de recuperación de errores para diferentes partes de un mismo error.
En el ámbito de un sistema individual, la tolerancia a fallos se puede lograr, anticipando las condiciones excepcionales y creando el sistema para hacer frente a la situación, y, en general, con el fin de auto-estabilizar para que el sistema converge hacia un estado libre de error. Sin embargo, si las consecuencias de una falla en el sistema son catastróficas, o el costo de hacer que sea suficientemente fiable es muy alta, la mejor solución puede ser la de utilizar algún tipo de duplicación. En cualquier caso, si la consecuencia de una falla en el sistema es tan catastrófico, el sistema debe ser capaz de utilizar reversión para volver a un modo seguro. Esto es similar a la recuperación en retroceso, pero puede ser una acción humana si los seres humanos están presentes en el ciclo.

## Componentes

Si cada uno de los componentes, a su vez, puede seguir funcionando cuando uno de sus subcomponentes falla, esto permitirá que el sistema siga funcionando. Utilizando un vehículo de pasajeros como por ejemplo, un coche puede tener neumáticos "llanos", cada uno de los cuales contiene un sólido núcleo de caucho, lo que permite que puedan utilizarse incluso si un neumático se pincha. Un neumático llano pinchado puede ser utilizado por una cantidad tiempo limitado a una velocidad reducida.

## Redundancia

La redundancia es la prestación de funciones que sería innecesaria en un ambiente libre de fallos. Esto puede ser un componente de copia de seguridad que automáticamente es desechado en caso de fallo de algún componente. Por ejemplo, grandes camiones de carga pueden perder un neumático sin mayores consecuencias. Ellos tienen muchos neumáticos, y ninguno de los neumáticos es crítico (con la excepción de los neumáticos delanteros, que se usan para dirigir). La idea de incorporar redundancia con el fin de mejorar la fiabilidad de un sistema fue introducida por John von Neumann en la década de 1950.
Dos tipos posibles de redundancia son: redundancia de espacio y redundancia de tiempo. La redundancia espacial proporciona componentes adicionales, funciones o elementos de datos que no son necesarios para operaciones libres de fallos. La redundancia espacial se clasifica en hardware, software y redundancia de información, según el tipo de recursos redundantes añadidos al sistema. A la hora de replicar, el cálculo o transmisión de datos se repite y el resultado se compara con una copia almacenada del resultado anterior.

## Criterios

Proveer un diseño tolerante de fallos para cada componente no siempre tiene que ser una opción. La redundancia lleva asociada una serie de penalizaciones: aumento de peso, tamaño, consumo de energía, el costo, así como tiempo para diseñar, verificar, y probar. Por lo tanto, un número de opciones tienen que ser examinadas para determinar qué componentes deben ser tolerante de fallos:
* ¿Cuán importante es el componente? En un coche, la radio no es crítico, por lo que este componente tiene menos necesidad de ser tolerante de fallos.
* ¿Cuál es la probabilidad de que esta componente falle? Algunos de los componentes, como el eje de transmisión en un coche, no es probable que falle, por lo que no es necesaria que sea tolerante de fallos.
* ¿Cuál es el coste para hacer el componente tolerante a fallos? Requiere una redundancia del motor del coche, por ejemplo, probablemente sea demasiado costoso tanto económicamente como en términos de peso y espacio para que sea considerado como una opción.
Un ejemplo de un componente que pasa todas las pruebas del coche es un sistema de sujeción de pasajeros. Mientras que, normalmente, no se cree en el principal sistema de sujeción de pasajeros, la gravedad. En caso de que el vehículo se vuelque o que sufra graves fuerzas g, este método principal de retención de pasajeros puede fallar. Retener a los pasajeros durante un accidente de este tipo es absolutamente crítico para su seguridad, de modo que esta componente pasa la primera prueba. Los accidentes que provocan expulsión de los pasajeros eran bastante habituales antes de los cinturones de seguridad, por lo que pasa la segunda prueba también. El costo de un método de inmovilización redundante como cinturones de seguridad es bastante baja, tanto desde el punto de vista económico como en términos de peso y espacio, por lo que pasa la tercera prueba. Por tanto, agregar cinturones de seguridad para todos los vehículos es una excelente idea. Otros "sistemas de sujeción suplementarios", tales como las bolsas de aire, son más caros y pasan las pruebas por un margen menor.

## Requisitos

Las características básicas de la tolerancia a fallos:
* Ningún punto único de fallo - Si un sistema experimenta un fracaso, debe continuar funcionando sin interrumpirse durante el proceso de reparación
* Aislamiento de fallos en el componente que está fallando, cuando se produce un error, el sistema debe ser capaz de aislar la falla a la reincidencia. Esto requiere la adición de mecanismos de detección de fracaso dedicados que existen solamente para el propósito del aislamiento de falla. La recuperación de una condición de falla requiere la clasificación de la avería o falla en el componente. El Instituto Nacional de Estándares y Tecnología (NIST) clasifica los fallos según la localidad, causa, duración y efecto.
* La contención de fallos para evitar su propagación - algunos mecanismos de fallo pueden causar fallos en el sistema mediante la propagación del fallo al resto del sistema. Un ejemplo de este tipo de fallo es el "transmisor no autorizado" que puede colapsar la comunicación legítima en un sistema global y causar fallos en el sistema. Mecanismos que protejan el sistema y que aíslan un transmisor bribón o las componentes que fallan son requeridos.
* Disponibilidad de modos de reversión
Por otra parte, los sistemas tolerantes de fallos se caracterizan en términos de interrupciones del servicio y en interrupciones de servicio no planificadas. Estos generalmente se miden en el nivel de las aplicaciones y no sólo a nivel de hardware. La figura de mérito se denomina disponibilidad y se expresa como un porcentaje. Por ejemplo, un sistema de «cinco nueves» proporcionaría estadísticamente un 99,999 % de disponibilidad.
Los sistemas tolerantes de fallos se basan, generalmente, en el concepto de redundancia.

## Replicación

La tolerancia a fallos se trata, fundamentalmente, mediante las siguientes tres vías:
* Replicación: proporcionar múltiples casos idénticos en el mismo sistema o subsistema, dirigiendo las tareas o las solicitudes de todos ellos en paralelo, y elegir el resultado correcto sobre la base de un quórum;
* Redundancia: proporcionar múltiples casos idénticos en el mismo sistema y la posibilidad de cambiar a uno de los restantes casos en caso de fallo;
* Diversidad: proporcionar múltiples implementaciones distintas de la misma especificación, y utilizarlos como sistemas duplicados para hacer frente a los errores de una aplicación concreta.
Todas las implementaciones de RAID, matriz redundante de discos independientes, excepto RAID 0, son ejemplos de un dispositivo de almacenamiento de dato tolerante de fallos que utiliza redundancia de datos.
Una máquina tolerante de fallos rígida utiliza elementos replicados funcionando en paralelo. En cualquier momento, todas las repeticiones de cada elemento deben estar en el mismo estado. Las mismas entradas son proporcionadas a cada réplica, esperando siempre los mismos resultados esperados. Las salidas de las replicaciones se comparan utilizando un circuito electoral. Una máquina con dos repeticiones de cada elemento se denomina redundancia modular dual (RMD). La votación del circuito sólo puede detectar una discrepancia y la recuperación depende de otros métodos. Una máquina con tres repeticiones de cada elemento se denomina redundancia modular triple (RMT). El resultado de la votación del circuito puede determinar cual replicación está en estado de error cuando se observa una votación dos-a-uno. En este caso, el resultado de la votación del circuito puede dar como resultado el resultado correcto y rechazar la versión errónea. Después de esto, el estado interno de la duplicación errónea se supone que es diferente de la de los otros dos, y el resultado de la votación del circuito puede cambiar a un modo defectuoso. Este modelo se puede aplicar a cualquier mayor número de replicaciones.
Las máquinas tolerantes de fallos rígidas son más fácil de hacer totalmente sincrónicas, con cada una de las puertas de cada una de las replicaciones de la misma transición de estado en el mismo borde del reloj, y los relojes de las réplicas están exactamente en fase. Sin embargo, es posible construir sistemas que prediquen sin este requisito.
La repetición en sincronía requiere hacer sus estados guardados internos el mismo. Que se puede iniciar desde un estado inicial fijo, como el estado reset. Por otra parte, el estado interno de una réplica se puede copiar a otra réplica.
Una variante de RMD es par y de repuesto. Dos elementos replicados funcionan de forma síncrona a la par, con una votación del circuito que detecta la falta de correspondencia entre sus operaciones y emite una señal que indica que hay un error. Otra pareja funciona exactamente de la misma manera. Un circuito final selecciona la salida de la pareja que no se proclame que es un error. Par de repuesto requiere cuatro réplicas en lugar de los tres de RMT, pero se ha utilizado comercialmente.

## Desventajas

Las ventajas de los diseños orientados a fallos son evidentes, mientras que muchos de sus inconvenientes no:
* Interferencia con detección de fallos en la misma componente. Para continuar con el anterior ejemplo del vehículo de pasajeros, puede no ser evidente para el conductor darse cuenta del momento en que un neumático se ha desinflado, con cualquiera de los sistemas tolerantes de fallos. Por lo general, esto se maneja con un "sistema de detección automática de fallos". En el caso del neumático, una presión de aire monitor detecta la pérdida de presión y notifica al conductor. La alternativa es el "sistema de detección de fallos manual", tales como la inspección manual de todos los neumáticos en cada parada.
* Interferencia con detección de fallos en otro componente. Otra variante de este problema es cuando la tolerancia a fallos en una componente impide la detección de fallos en una componente diferente. Por ejemplo, si la componente B realiza algunas operaciones basadas en la producción del componente A, la tolerancia a fallos en B puede ocultar un problema en A. Si el componente B se cambia más adelante (a un diseño menos tolerante de fallos), el sistema puede fallar de repente, dando la impresión que la nueva componente B es el problema. Sólo después de que el sistema ha sido estudiado cuidadosamente dejará claro que el problema es en realidad con la componente A.
* Reducción de la prioridad de corrección de errores. Incluso si el operador se da cuenta del fallo, el hecho de disponer de un sistema tolerante de fallos es probable que reduzca la importancia de la reparación del fallo. Si los fallos no se corrigen, esto llevará en el futuro a fallos del sistema, cuando la tolerancia a fallos o la componente falla por completo cuando todos los componentes redundantes han fallado.
* Dificultad de prueba. Para algunos críticos de los sistemas tolerantes de fallos, como un reactor nuclear, no hay ninguna manera fácil de comprobar que los componentes de la copia de seguridad son funcionales. El más famoso ejemplo de esto es el desastre de Chernóbil, donde los operadores probaron la copia de seguridad de emergencia mediante la desactivación del enfriamiento primario y secundario de refrigeración. La copia de seguridad falló, resultando en una fusión nuclear del reactor y liberación masiva de radiación.
* Costo. Tanto los componentes tolerantes de fallos y las componentes redundantes tienden a aumentar. Este puede ser un simple costo económico o puede incluir otras medidas, como por ejemplo el peso. Las naves espaciales tripuladas, por ejemplo, tienen tantos componentes redundantes y tolerantes de fallos que su peso aumenta de forma dramática en sistemas no tripulados, los cuales no requieren el mismo nivel de seguridad.
* Componentes de calidad inferior. Un diseño tolerante de fallos puede permitir el uso de componentes de calidad inferior, los cuales podrían hacer el sistema inoperable. Si bien esta práctica tiene el potencial para mitigar el aumento de los costos, el uso de múltiples componentes de calidad inferior pueden reducir la fiabilidad del sistema a un nivel igual o incluso peor que un sistema no tolerante de fallos.

## Ejemplos

El hardware con tolerancia a fallos requiere a veces que las piezas rotas pueden ser extraídas y reemplazadas por nuevas piezas mientras el sistema sigue funcionando (en informática conocido como sustitución en caliente). Un sistema de este tipo con una sola copia de seguridad se conoce como único punto tolerante y representa la gran mayoría de sistemas tolerantes de fallos. En este tipo de sistemas el tiempo medio entre fallos debe ser lo suficientemente largo como para que los operadores puedan arreglar los dispositivos rotos (tiempo medio de reparación) antes de que la copia de seguridad también falle. Se recomienda que el tiempo entre fallos sea lo más largo posible, pero no es estrictamente necesario en un sistema tolerante de fallos.
La tolerancia a fallos funciona muy bien en las aplicaciones informáticas. La primera computadora con tolerancia a fallos fue SAPO en la República Checa. La empresa Tandem Computers ha basado todo su negocio en este tipo de equipos, que utilizan un único punto de tolerancia para crear sus sistemas NonStop, cuyos periodos de funcionamiento pueden medirse en años.
Los programas informáticos también pueden utilizar arquitecturas libres de fallos, por ejemplo en la replicación de procesos.
Los formatos de datos también pueden ser diseñados para degradarse correctamente. El lenguaje HTML por ejemplo, está diseñado para ser compatible, lo cual permite a los navegadores web ignorar las nuevas entidades HTML que no entienden sin provocar que el documento sea inutilizable.

## Términos relacionados

Hay una diferencia entre tolerancia a fallos y sistemas que rara vez tienen problemas. Por ejemplo, los sistemas Western Electric crossbar tenían tasas de fallos de dos horas por cuarenta años y, por lo tanto, eran altamente resistente a fallos. Pero cuando el fallo se produjo, los sistemas dejaron de funcionar por completo, y por lo tanto, no eran tolerantes de fallos.