학습 목표
- 분산된 장치들(프로그램) 간의 시간을 어떻게 동기화 하는가?
- 어떻게 분산된 장치들이 서로 일관된 정보를 가지게 할 것인가?
예를들어 유저1이 은행서비스에 계좌를 가지고 있다. 은행은 각각 서울과 부산에 다중 db를 운영하고 있는데 입금은 서울은행, 이자 지급은 부산 은행에서 이루어진다고 가정하자.
이 경우에 유저1이 이자 지급 시점에 서울에 1000원을 입금하게 된다면 어떻게 될까?
- 2024-10-15 15:00:00 서울 유저1 10,000원 보유중
- 2024-10-15 15:00:00 부산 유저1 10,000원 보유중
- 2024-10-15 15:01:00 부산 유저1 1% 이자 지급 결정
- 2024-10-15 15:01:01 서울 유저1 1,000원 입금
위 시나리오 대로라면 11,100원을 가질 것 같지만 서울과 부산의 시계 오차로 인해 정확한 결과값은 알 수 없게 된다.
기댓값은 10,000 + 10,000 * 0.01 + 1,000 이지만 만약 서울 시계가 2초 느리게 흘러간다면 아래처럼 될 것이다.
(10,000 + 1,000) + 10,000 * 1.01
이러한 각 분산 시스템간 시간 문제때문에 발생하는 문제를 해결하기위해 각 시스템들은 시간과 같은 정보들을 동기화해야한다.
기준 시간을 알려주는 서버의 유무에 따라서 2가지 알고리즘이 존재할 수 있다.
- 존재할 경우: 크리스티안 알고리즘
- 존재하지 않을경우: 버클리 알고리즘
또한 네트워크 시간 프로토콜 NTP Network Time Protocol 이라는 별도의 프로토콜도 사용할 수 있다.
크리스티안 알고리즘은 시간을 제어하는 1개의 중앙 서버가 분산된 장치들의 시간을 동기화하는 알고리즘이다.
따라서 아래와 같은 가정을 가지고 있다.
- 시간 동기화가 필요한 장치를 클라이언트라고 한다.
- 시간 동기화를 해줄 중앙 장치를 서버라고 한다.
- 클라이언트가 서버로 요청을 보냈을 때, 두 시간의 차이를 델타 req 라고 부른다.
- 서버가 클라이언트로 부터 응답을 보냈을 때, 두 시간의 차이를 델다 resq라고 부른다.
- (핵심) 델타 req == 델다 resp로 가정한다.
- t4는 서버입장에서 알 수 없으며, 가정 5번에 의해서 아래의 값으로 가정한다.
T4 = T3 + dreq|resp / 2
그러나 크리스티안 알고리즘은 다음와 같은 한계를 가지고 있다.
- 가정 5번인 델타 req resp이 동일하다는 것은 물리적으로 성립하기 어렵다.
- 가정2번에서, 중앙 서버가 마비되면 전체 시스템이 마비되기 때문에 SPoF로 작동한다.
버클리 알고리즘은 별도 서버 없이 분산된 장치들이 가진 내부 시계만으로 동기화 문제를 해결한다.
이 과정에서 중심이 되어줄 마스터 장치를 선택하고 이를 통해 오차를 보장한다.
아래와 같은 과정을 가지게 된다.
- 분산된 장치들은 서로 정확도가 비슷한 시계를 가지게 된다.
- 분산된 장치 중에 1대는 마스터 장치로서 작동한다.
- 마스터 장치가 다른 장치로 요청을 보내서 각자의 장치에 도착한 시간들의 평균 시간을 연산한다.
- 평균 시간에 맞추기 위해 모든 분산 장치에 적용할 조정값을 정한다.
따라서 아래와 같은 한계점이 있다.
- 어떤 장치를 마스터로 선출할 것인지.
- 메시지를 주고 받는 과정에서 네트워크 시간을 알 수 없음
추가적으로 마스터에 장애가 발생했을 때 자동 복구 및 일관성 유지에 대한 복잡한 문제도 추가로 남는 것 같다.
네트워크 시간 프로토콜은 여러 계층 stratum 으로 구성되어 있어 시간 동기화 문제를 크리스티안 알고리즘을 통해서 해결하고 있다.
계층 | 정의 | 예시 |
---|---|---|
Stratum 0 | 가장 정확한 시간, 중앙 서버 역할 | 라디오 방송국, 인공위성 |
Stratum 1 | 기준 시간을 물어보는 클라이언트 역할 | |
Stratum 2 | 기준 시간을 물어보는 클라이언트 역할 | |
당연히 크리스티안 알고리즘이 가진 델타 req == resp 문제와 SPoF 문제를 모두 겪을 수 있다. 그래서 결과적으로는 시간 동기화는 너무 어렵고 이 부분에 집착하지 않는 것이 분산 컴퓨팅의 해답이 될 수 있다. |