이 글은 Martin Kleppmann의 데이터 중심 애플리케이션 설계를 읽고 기억하고자 적는 게시글입니다.
8. 분산시스템의 골칫거리
이 장에서는 기본이 되는 지식보다도 실무에서 겪을 수 있는 분산 시스템의 문제점을 몇가지 알려주고 있기 때문에 간단하게만 정리하겠습니다.
일단 이 장에서는 “모든 노드는 무조건 장애가 일어난다!”를 먼저 짚고 넘어갑니다. 심지어는 편집증과 의심증이 가치가 있다고 할 정도로요.
1. 결함감지
이 장의 첫 번째 알아갈 내용은 “어떻게 장애가 난 걸 알거야?”의 질문의 해결입니다.
저도 이러한 문제에 대해 인지하고 있고 어느정도의 해결 방법은 알고 있습니다. 가장 대표적인 방법으로는 Health check가 있겠네요.
그런데 노드의 상황을 체크하더라도, 얼마나 자주 체크 할 것인가는 또 다른 문제입니다. 이 부분을 신경쓰지 않으면 다음의 두 문제가 발생합니다.
- Health check의 간격이 너무 길면 죽은 노드의 응답을 기다리는 시간이 길어집니다.
- Health check의 간격이 너무 짧으면 죽은게 아니라 지연되고 있을 뿐인 노드도 장애로 판별합니다.
2번의 경우에는 많은 부하를 그대로 남은 노드가 이어받아서 연쇄 장애가 발생 할 수 있기 때문에 치명적이라고도 말합니다.
이러한 이유로 타임아웃의 기준을 제대로 설정하는 것은 분산 시스템에서 매우 중요한 일이지만, 수식이나 정해진 규칙은 별도로 정해지지 않았고 실험적인 결과의 의존해서 설정해야 한다고 합니다. 카산드라와 아카는 이러한 타임아웃을 어느정도 예상해서 동적으로 변경해준다고 합니다.
2. 믿을 수 없는 시계
서버를 구축하고 사용하다보면 가끔씩 시간이 맞지 않는 경우가 존재합니다. 최근에 개발 테스트 용으로 사용하는 airflow 서버의 시간이 맞지 않아 dag_run이 만들어지지 않는 것에 원인을 한참 찾았던 경험이 있기 때문에 이런 문제에 대한 경각심이 있습니다. 뿐만아니라 현재 재직중인 회사에서는 다양한 시간대를 사용하기 때문에 시간이 얽히기도 합니다.
일단 본론으로 넘어가서 어떤 시계를 쓰던 분산환경에서의 각 서버가 가진 시간은 언제든 엇갈릴 수 있다는 점을 알았습니다. 물론 수 밀리(혹은 나노)초 정도의 미세한 차이이지만, 분산환경에서 각 서버가 자신의 타임스탬프를 사용한다면, 오차가 발생 할 가능성도 있습니다.
때문에 저자는 정밀한 소프트웨어를 개발한다면, 모든 장비의 시계를 모니터링해야 한다고 합니다.
분산 환경에서 더 늦게 쓰여지는 데이터가 타임스탬프 기준으로 더 이른 시간을 나타 낼 수 있으며, 최종적으로 마지막에 쓰여지는 데이터가 정확한 데이터라고 가정하기에는 타임스탬프조차 믿을 수 있는지를 의심하라는, 제대로 의심병에 걸립니다.
3. 프로세스 중단
이 부분은 어떤 프로세스가 자원을 점유하는 것에 대한 내용이 메인인 것 같습니다. 분산 환경에서 이러한 점유는 리더 노드로 생각 할 수 있습니다.
리더가 있는 환경에서는 리더를 선정하고, 만약 리더 노드가 장애라면 다른 노드를 리더 노드로 승격시키는 것이 매우 중요합니다. 그러면 이러한 생각을 할 수 있습니다.
리더가 장애가 발생하고 복구 될 때 자신이 리더가 아님을 알까?
이런 상황에서 발생하는 문제가 다음과 같습니다.
위의 상황은 리더 노드가 어느 시간 ( 예 10초 ) 간의 락을 습득하고 GC가 동작하면서 중단되어 다른 노드가 리더 노드가 되어 프로세스를 실행하는 예시입니다.
실제로는 더 이상 리더가 아니면서, 과거의 작업중인 데이터를 입력하는 것은 데이터를 오염시킬 위험성이 존재하는 로직입니다.
이러한 문제를 해결하는 방안은 펜싱 토큰을 사용 할 수 있습니다.
펜싱 토큰
상당히 직관적이고 쉬운 방식입니다. 락을 얻었을 때 토큰을 발급해서 최신의 토큰인지 비교하는 것만으로 비정상적인 동작을 막을 수 있습니다.
주키퍼를 사용하면 이러한 잠금 서비스를 트랜잭션 ID 혹은 노드 버전을 기반으로 사용 할 수 있다고 합니다. 이런 방식으로 동작하는거였네요.
시스템 모델과 현실
분산 환경에서의 두 가지 속성인 안전성과 활동성을 알려줍니다. 여기서 안전성이란 나쁜일은 일어나지 않는다는 의미라고 볼 수 있고, 활동성은 결국에는 좋은 일이 일어난다는 말로 해석한다고 합니다.
이전에 비동기식 분산 환경에서의 데이터 처리는 최종적 일관성을 갖는다고 말했는데, 이 부분이 활동성이라고 합니다.