# 강의 영상
정리
이전 까지 분산 시스템의 "타이밍", "시간 동기화" 관련된 문제 들에 대해서 살펴 보았습니다. 이번 장에서는 그래서 어떤 식으로 분산 시스템에서 발생한 사건을 시간 순서대로 정렬시킬 것인지에 대해서 알아보도록 하겠습니다.
예를 들어서, 3 개의 서버 A, B, C 가 있을 때 아래 그림과 같은 상황이 있다고 해봅시다. 상황은, A 가 m1 의 발화를 하고, 그 답변을 들은 B 가 m2 의 응답을 했다고 할 때, C 에게 전송 되는 순서가 네트워크 문제 등으로 바뀌었다고 할 때 C 는 어떤 것이 먼저 온 것인지 확실히 알 수 있을 까요?

위의 예제는 보다 일상 생활에서 일어날 수 있는 상황이었지만, 컴퓨터 프로세스 안에서 일어날 수 있는 예시로 다시 해석해보면 여기서 m1 은 특정 데이터베이스의 "sample" 테이블을 생성하는 것이고, m2 는 생성된 "sample" 테이블에 데이터를 넣는 것이라고 가정해보겠습니다. 그렇게 되면 순서는 매우 중요한 문제가 되며 네트워크 문제 등에 의해서 순서가 바뀌는 일은 없어야 할 것이라고 생각됩니다.
그러면, 이런 경우 어떻게 순서를 보장 할 수 있을까요? 첫번째 방법은 메시지에 타임스탬프를 포함하여 보내는 방식입니다. 하지만 이 방식도 완전히 정확하다고 할 수 없습니다. 이전 글에서 살펴 보았듯이 각각의 노드가 온전히 동일한 시간을 갖고 있는다고 보장할 수 없기 때문입니다. (NTP 로 동기화 한다고 해도 시간 차이를 온전히 막을 수는 없기 때문)

올바른 순서를 갖도록 보장하기 위해, 다음 방안으로 "happens-before relation" 정의을 사용하게 되었습니다. 이 정의는 각 노드가 싱글 스레드 임을 가정하고, 두 개의 스텝이 나뉘어진 실행의 경우 어떤것이 첫번째로 이루어 져야 하는지에 대한 정렬을 확실하게 해주게 됩니다. 이 표현 정의는 a -> b 로 나타내었을 때, a 는 b 전에 실행 되어야 함을 나타냅니다. 단, a-> b 도 아니고 b -> a 도 아닌 관계는 "concurrent" 하다고 하며, 둘 중 어떤 것도 먼저 실행되어도 상관 없는 것을 의미합니다. (a || b 로 표현)

이러한 "happen-before relaion" 은 분산 시스템의 인과 관계를 추론해 낼 수 있는 하나의 방법입니다. 즉, 우리는 각 노드에서 발생하는 이벤트의 인과 관계를 가지고 어떤 것이 서로 연결이 되어 있는 지를 추론할 수 있는 것입니다.

'아키텍쳐' 카테고리의 다른 글
[강의 정리] Distributed Systems 5: Replication (0) | 2023.03.29 |
---|---|
[강의 정리] Distributed System 4: Broadcast protocols and logical time (0) | 2023.03.22 |
[강의 정리] Distributed System 3.2: Clock synchronisation and monotonic clocks (0) | 2023.03.16 |
[강의 정리] Distributed System 2.4: Fault tolerance and high availability (0) | 2023.03.15 |
[강의 정리] Distributed System 2.3: System models (0) | 2023.03.10 |
댓글