Cloud Spanner와 분산 합의, 시간
Cloud Spanner는 분산형 DB 시스템들 중에서도 꽤나 독보적인 포지션을 점유하고 있다.
왜일까?
분산 DB들이 일반적으로 가지고 있는 문제인 일관성에 대해 살짝 다루고, Cloud Spanner가 이를 어떻게 해결하고 있는지 소개해보겠다.
분산 DB?
분산DB는 글로벌 서비스의 요구사항에 따라 등장하고 성장하게 된 시스템이다.
만약 서비스가 유럽, 아시아, 미국에 전부 다 있다면, 각자 서버를 지리적으로 유럽, 아시아, 미국에 두는게 보통이다. 대륙을 건너게 되면 필연적으로 물리적인 속도 지연이 발생하기 때문이다.
그럼 DB는 어떨까? 서버만 분산해두고 DB를 중앙화하면 DB 왔다갔다하는데도 꽤나 오랜 시간이 걸릴 것은 자명하다.
DB를 완전히 격리해서 각자 세팅할 수도 있겠지만, 그렇지 못할 경우도 많다.
이럴 때 분산 DB를 사용해서 전세계의 리전에 DB 노드들을 깔아두고, 서로 동기화되게 하는 것이다.
대표적인 분산 DB로는 GCP의 close 시스템인 Cloud Spanner, 오픈소스인 CockroachDB, YDB 등이 있다.
분산 트랜잭션과 일관성(consistency)
https://blog.naver.com/sssang97/223115732041
분산시스템들에서 항상 머리를 아프게 만드는 것이 일관성 보장이다.
만약 유럽 노드와 아시아 노드에서, 동시에 같은 계좌 데이터에 쓰기를 수행한다면 어떻게 할까?
일단은 각 노드에 쓰기를 할 것이다. 유럽 노드에서는 500원을 인출하고, 아시아 노드에서는 2000원을 인출한다.
그 다음에는 각 노드의 변경사항을 전세계에 동기화해야한다. 그러면 500원 인출이 먼저 진행되어야할지, 2000원 인출이 진행되어야할지 선택해야 한다.
여기가 쟁점이다.
대부분의 오픈소스 시스템은 Raft 기반의 알고리즘을 사용해서 멀티리전을 동기화한다.
그리고 트랜잭션들을 순서대로 직렬화해서 처리를 해줘야 하는데, 여기서 또 걸리는 것이 "시간"이다.
일반적으로 컴퓨터에서 제공되는 시계는 그리 정확하지 않다는게 문제다. cockroach는 시간을 기준으로 직렬화를 하긴 하는데, 각 노드의 시간을 다 믿을 수는 없기 때문에 꽤나 복잡한 방법으로 오차를 줄인다.
이건 시간 정확도의 문제는 어떤 시계를 써도 마찬가지다. 단 한가지를 빼면...
Cloud Spanner의 비결
Cloud Spanner는 놀랍게도 원자시계를 사용한다.
원자시계를 장치에 달고 절대적인 시간을 가져와서 트랜잭션을 직렬화하는데, Cloud Spanner에서는 이를 True Time이라 부른다.

오픈소스 시스템들에서는 사용할 수 없는 방법이다. 구글이라 할수있는거지.
CloudSpanner는 이를 통해 강력한 일관성과 높은 성능을 보장할 수 있다. 대부분의 합의는 1밀리초 정도에 완료된다.
그냥 원자시계의 시간을 신뢰하고 귀찮은 처리들을 다 생략하기 때문이다.
이렇듯 소프트웨어보다는 하드웨어로 해결하는게 방법일 때도 있는 법이다.
참조
https://cloud.google.com/blog/ko/products/databases/get-started-with-spanner
https://www.cockroachlabs.com/blog/spanner-vs-cockroachdb/
https://cloud.google.com/spanner/docs/true-time-external-consistency?hl=ko
https://www.cockroachlabs.com/blog/consistency-model/
https://stackoverflow.com/questions/64451468/cockroachdb-read-transactions