{{위키데이터 속성 추적}}
'''결함 감내 시스템'''(Fault tolerant system)은 시스템을 구성하는 부품의 일부에서 결함(fault) 또는 고장(failure)이 발생하여도 정상적 혹은 부분적으로 기능을 수행할 수 있는 [[시스템]]이다.
결함감내 시스템은 부품의 고장이 발생하면 부분적인 기능을 사용할 수 없게되며, 계속적으로 부품의 결함이나 고장이 발생하면 점진적으로 사용할 수 없는 기능이 증가하며, 치명적인 결함이나 고장이 발생하면 시스템이 정지한다. 이런 측면에서 결함감내 시스템은 graceful degradation (단계별 성능저하) 특징이 있다.
장애 허용 개념이 고려되지 않은 일반 시스템에서는 부품에서 사소한 결함이나 고장이 발생해도 시스템의 동작이 정지된다.

== 적용 분야 ==
고장감내 시스템은 고장이 발생하면 인명이나 재산에 피해를 초래하는 사고가 발생하는 안전필수(safety-critical) 및 임무필수(mission-critical) 임베디드 시스템에서 사용된다. 구체적으로는 원자력, 발전, 에너지, 국방, 항공, 우주, 자동차, 철도, 조선, 플랜트, 금융, 의료 등 다양한 분야의 임베디드 시스템에서 활용되고 있다.

== 특성 ==
장애 허용 시스템의 특성은 개별 구성품의 특성만이 아니고, 머신간의 제휴에 대한 규칙의 특성이기도 하다. 예를 들어 [[전송 제어 프로토콜|TCP]]에서의 [[패킷 통신]] [[네트워크]] 내에서 불완전한 링크나 과부하의 링크가 있어도 신뢰성이 높은 쌍방향 통신을 할 수 있도록 설계되고 있다. 이것은 수신측에서 패킷 상실, 패킷 이중화, 순서 변경 등이 있도록 [[통신 프로토콜]]이 설계되어 있기 때문에 결과적으로 통신 성능이 저하되어도 데이터의 정확성이 손상되지 않게 되어 있는 것이다. 데이터 형식도 동일한 생각을 적용시킬 수 있다. 예를 들어 [[HTML]]에서 [[상위 호환]]을 유지하도록 설계되고 있기 때문에 새로운 기능을 사용한 HTML을 오래된 [[웹 브라우저|브라우저]]가 읽어들였을 때 그것을 처리할 수 없는 것으로서 버리는 것이 아니라 이해할 수 있는 범위를 표시하도록 할 수 있다.

각 시스템 안에는 [[발산 성질]](resilience) 상태 예외적인 경우를 고려하여 대처할 수 있도록 시스템을 구축해야 한다. 또한 일반적으로 [[자기 안정성]]을 갖게 하는 것에 의해서 시스템이 오류 없는 상태로 수렴시키는 것으로 [[발산 성질]](resilience)을 줄인다. 그러나 시스템 장애가 중대하기에, 그에 대처하는 데 매우 큰 비용을 들이는 것보다 더 좋은 방법은 이중화를 하는 것이다.

== 장애 복구 방식 ==
장애 허용 시스템에 있어서의 장애 복구는 [[롤포워드 복구]] (roll-forward)와 [[롤백 복구]] (roll-back)으로 나눌 수 있다. 시스템 장애로 인해 오류가 일어났을 때 롤 포워드 복구에서는 그 시점의 시스템 상태로 복구를 실시한다. [[롤백 복구]]에서는 시스템 상태를 약간 이전으로 되돌려(예를 들어 Checkpointing 사용) 거기에서부터 처리를 재개한다. [[롤백 복구]](rollback)에서는 체크 포인트(되돌리는 지점)와 장애 발생 지점과의 사이의 처리는 [[멱등]] (몇 번 실행해도 1회 실행한 것과 같은)이 아니면 안 된다. 몇 개의 시스템은 오류의 종류나 오류 발생 수에 의해서 [[롤포워드 복구]]와 [[롤백 복구]](rollback)를 구현한다.

=== 이중화 시스템 (Fault-tolerance by replication) ===

이중화에 의한 장애 허용 시스템은 특징은 세 가지로 나뉜다.

* [[리플리케이션]](Replication)：동일한 시스템을 복수로 준비하여 병렬로 실행시켜 다수를 만족한 결과를 올바른 결과적으로 적용한다.
* [[다중화]](Redundancy) : 동일한 시스템의 복수로 준비하여 장애가 일어나면 보조 시스템으로 전환한다.
* [[다양화]](Diversity)：같은 사양에 다른 하드웨어 시스템을 복수로 준비하여 복제화와 같이 그것을 운용한다. 이 경우, 각 시스템이 똑같은 장애를 일으키지 않는다.

[[레이드]] ([[RAID]])는 [[다중화]]를 활용한 장애 허용 시스템을 [[기억 장치]]에 적용한 예이다. 레이드의 개념이 발전하면서 [[레이드 0]]과 같은 속도만을 향상시키기 위한 시스템도 레이드에 포함되나 이는 엄밀히 말해 장애 허용 시스템에는 해당하지 않는다.

[[락스텝]] (lockstep) 방식의 장애 허용 시스템 머신은 각 부분을 다중화해 병렬해 동작시킨다. 다중화된 각 부분은 어느 시점에서 봐도 완전히 같은 상태가 아니면 안 된다. 같은 입력을 주었을 경우에 같은 출력을 얻을 수 있는 것을 기대할 수 있다. 다중화 부분의 출력은 다수결 회로에 모아져 비교된다. 각 부품을 이중화한 머신 (dual modular redundant, [[DMR]])으로 불린다. 이 경우 다수결 회로는 결과가 차이가 나는 것밖에 모르기 때문에 복구는 다른 방법으로 실시할 필요가 있다. 각 부품을 삼중화한 머신 (triple modular redundant, [[TMR]])으로 불린다. 이 경우의 다수결 회로는 비교 결과가 2대1이 되었을 때에 오류를 판정하므로 올바른 결과를 출력할 수 있어 오류로 판정된 결과를 버릴 수 있다. 그 뒤, 오류를 일으킨 복제 부품은 고장난 것으로 간주하여 다수결 회로는 [[DMR]] 상태로 전환한다. 이 모델은 더 많은 복제에 대해서도 적용시킬 수 있다. [[락스텝]] 방식의 머신은 간단하게 완전하게 동기시킬 수 있어 각 복제 부품은 같은 클락으로 동기하여 동작한다. 물론 각 복제를 클락에 동기시키지 않는 락스텝 시스템도 구축 가능하다. 다만, 클락 동기 하지 않는 경우, 고장에 의해서 출력을 다수결 회로에 보낼 수 없게 된 부품을 어떻게 취급할지가 문제가 된다.

복제를 동기시키려면 각 내부 상태가 일치해야 한다. 그럼으로써 [[리셋]] 상태 등의 같은 내부 상태로부터 일제히 동작을 개시할 수 있다. 한편, 복제간에 상태를 복사하는 방법도 있다.

[[DMR]] 변형의 일종인 [[pair-and-spare]]가 있다. 두 복제 부품이 락스텝에서 같은 처리를 실시해 다수결 회로가 상이값을 검출하면 오류 신호를 출력한다. 또 하나의 이중화 시스템이 완전히 같은 처리를 하고 있고, 두 이중화 시스템의 출력을 비교해 오류가 되지 않은 것을 적용한다. pair-and-spare는 네개 복제가 필요한데 [[TMR]]이 필요한 세계보다 많지만 상용 시스템으로 채용된 예도 있다.

=== 동작 지속 (No Single Point of Repair) ===

시스템이 고장 나더라도 지속적으로 동작해야 하며, 복구 작업을 하는 동안 성능 간섭이 없어야 한다.

=== 고장 분리 (Fault Isolation to the Failing Component) ===

고장이 발생할 때 시스템은 고장과 분리되어 정상적인 구성 요소에 영향을 주지 말아야 한다. 이것은 고장 감지 메커니즘이 고장과 분리를 목적으로 존재함을 나타낸다.

=== 고장 전염 (Fault Containment) ===

어떤 고장 메커니즘은 시스템을 고장나게 하는 원인이 될 수 있는데 나머지 시스템에게 고장을 전파한다. 예를 들어, "Rogue transmitter"는 정상적인 통신 상태를 문제를 만들어 버리고 모든 시스템을 고장나게 한다. "Rogue transmitter"를 격리하는 메커니즘 또는 구성 요소를 잘못되게 하는 것으로부터 보호하는 시스템이 필요하다.

=== 부가적으로 ===
오차 허용 시스템의 특징은 계획된 서비스 정지 또는 비계획 서비스 정지 개념을 포함한다. 이것은 보통 측정이 되는데 응용 프로그램 수준에서이지 하드웨어 수준은 아니다. 이것의 이점은 [[가용성]](availability)이라고 부르고 [[퍼센트]] 단위로 표현되는데 통계적으로 99.999%([[five nines]]) 가용성을 갖는다.

== 같이 보기 ==
* [[비잔틴 장애 허용]] (Byzantine fault tolerance)
* [[클러스터]] (Cluster)
<!--
* [[Damage tolerant design]]
* [[Intrusion Tolerance]]
* [[Proactive Resilience]]
* [[Defence in depth]]
* [[Data redundancy]]
* [[Object group]]
* [[Process group]]
* [[Progressive Enhancement]]
* [[Transaction processing]]
* [[Elegant degradation]]
* [[Fail-safe]]
* [[Capillary routing]]
-->
== 외부 링크 ==

=== 서적 ===

* {{저널 인용 | 저자 = [[Brian Randell]], P.A. Lee, P. C. Treleaven |제목 =Reliability Issues in Computing System Design | 저널 = [[ACM Computing Surveys]] (CSUR) | 쪽=123–165 | volume =10 | issue = 2 | 연도 =1978 | 작성월 = june |id=ISSN 0360-0300 | url = http://portal.acm.org/citation.cfm?id=356729&coll=&dl=ACM&CFID=15151515&CFTOKEN=6184618 }}
* {{저널 인용 | 저자 = [[P. J. Denning]] |제목 =Fault tolerant operating systems | 저널 = ACM Computing Surveys (CSUR) | 쪽=359–389 | volume =8 | issue = 4 | 연도 =1976| 작성월 = December |id=ISSN 0360-0300 | url = http://portal.acm.org/citation.cfm?id=356680&dl=ACM&coll=&CFID=15151515&CFTOKEN=6184618 }}
* {{저널 인용 | 저자 = Theodore A. Linden |제목 =Operating System Structures to Support Security and Reliable Software | 저널 = ACM Computing Surveys (CSUR) | 쪽=409–445 | volume =8 | issue = 4 | 연도 =1976| 작성월 = December |id=ISSN 0360-0300 | url = http://portal.acm.org/citation.cfm?id=356682&coll=&dl=ACM&CFID=15151515&CFTOKEN=6184618 }}

=== 자료 ===
* [http://www.windowsnetworking.com/articles_tutorials/Implementing-Fault-Tolerance-Windows-Networks.html Implementing Fault Tolerance on Windows Networks] {{웨이백|url=http://www.windowsnetworking.com/articles_tutorials/Implementing-Fault-Tolerance-Windows-Networks.html |date=20070504035524 }} — a high-level survey of the different fault tolerant technologies available for Windows Server 2003
* [http://www.eventhelix.com/RealtimeMantra/FaultHandling/ Fault Handling and Fault Tolerance] {{웨이백|url=http://www.eventhelix.com/RealtimeMantra/FaultHandling/ |date=20070526104138 }} — Articles about software and hardware fault tolerance techniques.
* Article "[http://citeseer.csail.mit.edu/677518.html Practical Considerations in Making CORBA Services Fault-Tolerant]{{깨진 링크|url=http://citeseer.csail.mit.edu/677518.html }}" by [[Priya Narasimhan]]
* Article "[http://doi.ieeecomputersociety.org/10.1109/TC.2004.1275293 Experiences, Strategies and Challenges in Building Fault-Tolerant CORBA Systems]" by [[Pascal Felber]] and [[Priya Narasimhan]]
* Article (an excellent starting point in the subject, read it ''first'' and then read the tutorial below) "[http://rodin.cs.ncl.ac.uk/Publications/avizienis.pdf Dependability And Its Threats: A Taxonomy] {{웨이백|url=http://rodin.cs.ncl.ac.uk/Publications/avizienis.pdf |date=20160823141548 }}" by Algirdas Avizienis, Jean-Claude Laprie, [[Brian Randell|B. Randell]]
* Tutorial (a very good one, read it ''after'' you have read the article above) "[http://hdl.handle.net/2002/12633 Software Fault Tolerance: A Tutorial]{{깨진 링크|url=http://hdl.handle.net/2002/12633 }}" by Wilfredo Torres-Pomales
* EU funded research project [https://web.archive.org/web/20070925040215/http://www.hpc4u.org/ HPC4U] addressing development of fault tolerant technologies for Grid computing environments

[[분류:시스템 공학]]
[[분류:컴퓨터 시스템]]
[[분류:소프트웨어 품질]]
[[분류:RAID]]
[[분류:장애 허용]]