1 minute read

단일 리더 복제에서 리더의 목적은 쓰기의 순서를 복제 로그에서 결정하는 것이다.

직렬화가능한 격리 수준은 트랜잭션이 순차적으로 수행되는 것을 말한다.

분산 시스템에서 타임스탬프나 시계를 사용하는 것은 쓰기 순서를 정하는 것이다.

순서와 인과관계

순서는 인과관계를 유지하는 데 도움이 된다. 인과관계가 중요한 이유는 무엇일까?

  • ‘일관된 접두사 읽기’에서 대화를 관찰하는 사람이 질문에 대한 답을 먼저 본 다음 질문에 대한 답을 볼 수 있다. 당연하게도 질문이 답변보다 먼저 있었어야 한다. 우리는 질문과 답변 사이에 인과적 의존성이 있다고 말할 수 있다.

  • 세 리더 간의 복제에서 네트워크 지연으로 인해 일부 쓰기가 다른 쓰기를 ‘추월’할 수 있다. 복제본 중 하나의 관점에서 보면 존재하지 않는 행에 대한 업데이트가 있는 것처럼 보일 수 있습다. 여기서 인과관계는 행이 업데이트되기 전에 먼저 행이 생성되어야 한다는 것을 의미한다.
  • ‘동시 쓰기 감지’에서 두 개의 작업 A와 B가 있는 경우 A가 B보다 먼저 발생했거나, B가 A보다 먼저 발생했거나, A와 B가 동시에 발생한다는 세 가지 가능성이 있다. 이 발생 전 관계는 인과관계의 또 다른 표현으로, A가 B보다 먼저 발생했다는 것은 B가 A에 대해 알고 있었거나, A를 기반으로 구축했거나, A에 의존했을 수 있음을 의미한다. A와 B가 동시 발생하면 둘 사이에 인과관계가 없으며, 즉 어느 쪽도 상대방에 대해 알지 못한다는 것을 의미한다.
  • 스냅샷 격리 수준에서 트랜잭션은 일관된 스냅샷을 읽는다. 여기서 “일관성”이란 인과 관계와 일치한다는 의미다. 스냅샷에 답변이 포함되어 있는 경우, 답변 중인 쿼리도 포함되어 있어야 한다. 단일 시점에 전체 데이터베이스를 관찰하면 해당 시점 이전에 발생한 모든 작업의 효과는 볼 수 있지만 그 이후에 발생한 작업은 볼 수 없기 때문에 인과관계에 부합한다.
  • 트랜잭션 간 쓰기 왜곡에서도 인과적 종속성을 보여 준다. 트랜잭션의 동작은 현재 다른 트랜잭션에 대한 관찰에 인과적으로 의존한다.
  • 앨리스와 밥이 축구를 시청을 하고 있다. 밥이 앨리스의 감탄사를 들은 후 서버에서 오래된 결과를 얻었다는 사실은 인과성 위반이다. 앨리스의 감탄사는 점수 발표에 인과적으로 의존하므로 밥도 앨리스의 감탄사를 들은 후 점수를 볼 수 있어야 한다.

인과관계는 이벤트에 순서를 부여하는 것이다. 원인이 결과보다 우선하고, 메시지가 수신되기 전에 메시지가 전송되며, 질문이 답변보다 먼저 나와야만 한다. 그리고 실생활에서와 마찬가지로 한 노드가 데이터를 읽고 그 결과로 어떤 것을 쓰고, 다른 노드가 쓴 것을 읽고 다른 것을 쓰는 식으로 한 가지가 다른 것으로 이어진다. 이러한 인과적으로 의존하는 작업의 연쇄는 시스템에서 인과적 순서, 즉 무엇이 먼저 일어났는지를 정의한다.

시스템이 인과관계에 의해 부과된 순서를 따르는 경우, 우리는 이를 인과적으로 일관성이 있다고 말할 수 있다. 예를 들어, 스냅샷 격리는 인과적 일관성을 제공한다. 데이터베이스에서 데이터를 읽을 때 어떤 데이터가 표시되면 인과적으로 그 앞에 있는 데이터도 볼 수 있어야 한디. 단, 그 사이에 삭제되지 않았다는 가정이라면 말이다.