같은 명령과 다른 순서
값을 0으로 시작해 5를 더한 뒤 두 배로 만들면 10이다. 두 배로 만든 뒤 5를 더하면 5다. 따라서 같은 명령 집합을 전달했다는 사실만으로는 같은 상태를 얻지 못한다. 복제본들이 명령을 적용하는 순서까지 맞춰야 한다.
결정적인 실행
같은 상태와 명령에서 같은 다음 상태와 출력을 얻어야 한다. 각 복제본이 별도로 읽은 현재 시각이나 난수, 외부 응답이 계산에 영향을 주면 결과가 갈릴 수 있다. 필요한 외부 정보를 공통 입력에 포함하는 등 결과가 일치하도록 실행 방식을 설계한다.
명령 순서의 합의
복제본들이 적용할 명령열을 정하는 일에 합의 프로토콜을 사용할 수 있다. 합의로 정한 명령을 상태에 실제 적용하는 단계는 구분된다. 로그를 가진 것만으로 애플리케이션 상태가 자동으로 같아지는 것은 아니며 적용 순서와 중복 처리도 함께 맞아야 한다.
장애 가정과 복구
일부 복제본이 멈췄을 때도 나머지로 서비스를 이어 가는 데 활용할 수 있다. 어떤 장애까지 견디는지는 사용하는 통신과 합의 방식에 달려 있다. 재가입하는 복제본에는 기준 상태와 이후의 명령을 전달하여 따라잡게 할 수 있다. 단순한 파일 복사와 달리 실행 의미까지 일치시키는 접근이다.
관련 문서
분산 시스템 / 유한 상태 기계 / Raft / Paxos / 알고리즘 / 프로세스 / 네트워크 / 데이터베이스