동기화를위한 벡터 클럭 대신 명시 적 DAG


13

피어 집합 간의 데이터 동기화 방법을 살펴보기 시작했습니다. 피어는 연결이 끊긴 방식으로 작업 한 다음 동기화하여 로컬 변경 사항을 병합 할 수 있어야합니다.

피어는 로컬 업데이트를 "three way merge" 와 병합 할 수 있어야합니다 . 따라서 동기화 피어는 최신 정보를 알아야하지만 엄격한 순서가없는 경우 공통 루트를 기반으로 사실을 병합 할 수 있어야합니다.

독립 피어가 변경하면 "시계"를 사용하여 "타임 스탬프"할 수 있습니다. "시계"와 "타임 스탬프"라는 용어를 사용하지만 벽시계를 의미하지는 않습니다. 인과 관계를 명확하게하는 일종의 부분적인 이벤트 순서를 의미합니다. 그것은 방향성 비순환 그래프 (DAG)를 형성하는 사건들 사이 의 "이전에 일어난" 관계입니다.

이 부분 순서를 만드는 "일반적인"방법은 벡터 시계 를 사용하는 것 같습니다 . 그러나 이것들은 매우 커질 수 있습니다. 인터벌 트리 클럭 과 같은보다 최근의 개발 은 타임 스탬프를보다 컴팩트하게 저장합니다.

내가 분명하지 않은 것은 동기화 프로토콜이 DAG를 명시 적으로 "간단하게"저장하지 않는 이유입니다. (아니요?)

피어는 UUID를 임의로 생성하여 (또는와 같은 다른 방법으로 <peer-name> + <local-monotonically-increasing-counter>) 타임 스탬프를 독립적으로 만들 수 있습니다 . 이 타임 스탬프의 순서는 해당 피어에게 명확합니다.

두 명의 피어가 서로 동기화되면 새 타임 스탬프에 동의 할 수 있습니다. 다시,이 타임 스탬프의 순서는 두 피어에게 분명합니다.

이제 피어간에 DAG 전에 발생해야하는 요구 사항이 있지만 이에 대한 스토리지 및 대역폭 요구 사항은 적습니다. 시점은 그래프 꼭지점입니다. 따라서 1 또는 2 개의 수신 에지가 있습니다 (클라이언트의 이벤트에 대해 1 개, 클라이언트간에 동기화에 대해 2 개). 이는 네트워크의 피어 수에 제한이 없습니다.

개별 시점을 사용하려면이 시점으로 이어지는 시점 그래프가 필요합니다. 그러나, 멀리 볼 수있는, 할 수있는 피어 알고 시점으로는 (그것 자체를 생성하거나 다른 피어로 생성, 또는 그것으로 동기화 할 때 다른 동료가 그에게 말했다되어있다) 한 했다 그 시점까지 이어지는 역사에 대해 알 수있는 기회. 아마 이것에 대한 귀납적 증거가 있다고 생각합니다.

DAG를 저장하고 동기화하는 것이 명시 적으로 간단 해 보입니다. 실제로 사용됩니까? 그렇지 않다면 왜 벡터 클록이 선호됩니까?


노트

피어 투 피어

클라이언트 서버 솔루션보다 P2P 솔루션을 선호합니다.

최종 토폴로지는 그 자체로 복제되는 훨씬 더 작은 서버 그룹에 연결하는 많은 클라이언트가 될 것입니다. 그러나이 특정 토폴로지가 필요한 솔루션이 아니라이 특정 토폴로지를 지원하는 일반 솔루션을 사용하는 것이 좋습니다.


나는 당신이 말하는 것을 오해 할 수도 있지만, 상태로 이어지는 모든 사건의 그래프가 카운터 벡터보다 어떻게 작을 수 있는지는 확실하지 않습니다. 매우 많은 수의 노드와 매우 적은 수의 변경 사항이있는 시스템에 있지 않는 한.
kdgregory 2016 년

감사합니다 @kdgregory – 좋은 지적. 향후 3 방향 병합을 계산하려면 과거를 알고 있어야합니다 (과거 시점의 DAG를 결정할 수 있어야 함). 따라서 과거 시점을 저장하면 DAG를 명시 적으로 저장하는 것이 더 저렴합니다. 당신이 경우 없는 그 과거의 시점을 저장 당신은 어쨌든 데이터의 세 가지 방법 병합을 계산할 수 없습니다. –이 세 가지 요구 사항이 어떤 것인지 궁금합니다. 3 방향을 원하지 않으면 명시 적 DAG보다 벡터 클록이 더 좋을까요?
Benjohn

나는 이것이 @ kdgregory의 중요한 포인트라고 생각하므로 질문에 그것에 대해 조금 추가했습니다. 3 웨이 병합을 수행 할 수 있다고 가정하고 있으며 모든 기록이 알려져 있음을 의미합니다. 모든 역사가 알려진 경우 명시 적 DAG가 더 저렴합니다. 히스토리가 잘 리면 벡터 클럭이 비용이 덜 드는 방법 일 것입니다.
Benjohn

1
예, 벡터 클럭에 대한 이해는 그것들이 단순히 수락 / 거부 결정을위한 것입니다. "노드 C는이 데이터를 업데이트하려고하지만 노드 B의 업데이트를 인식하지 못합니다".
kdgregory 2016 년

답변:


1

내가 알 수있는 한, Git 및 Mercurial과 같은 버전 제어 시스템은 벡터 클록 대신 DAG 방식을 사용합니다.


1
설명이 없으면 다른 사람이 반대 의견을 게시 할 경우이 답변이 쓸모 없게 될 수 있습니다. 예를 들어, 누군가 "Git 및 Mercurial과 같은 Propversion 제어 시스템이 DAG 방식이 아닌 벡터 클록을 사용합니다" 와 같은 클레임을 게시 한 경우이 답변이 독자가 두 가지 반대 의견을 선택하는 데 어떻게 도움이됩니까? 품질 표준에 대한 응답 방법을 충족시키기 위해 더 나은 형태로 편집 하는 것을 고려하십시오 .
gnat

2
내가 그 질문을 이해 한 방식으로 그들은 벡터 클럭이 아닌 DAG가 사용되는 실제 사례가 있는지 묻고 있었다.
bikeman868

1
Git과 Mecurial은 DAG를 사용한 P2P (Peer to Peer) 변경 동기화의 실제 예이며, benjohn이 투표를하더라도 내 답변이 도움이 되길 바랍니다.
bikeman868

안녕하세요 @ bikeman868 net 0 (죄송합니다)에 투표했습니다. 불확실성에 시달 리더라도 대답 도움이됩니다! 참고 문헌이나 권위있는 답변은 항상 훌륭하지만 스택 교환은 그것을 요구하지 않습니다! 귀하의 제안은 질문에 대한 의견을 제시하는 것이 좋습니다. 기록을 저장하고 기록을 병합하려는 경우 DAG가 적합합니다. 히스토리를 저장하지 않고 현재 상태에 대한 동기화 및 합의를 원하는 경우 벡터 클럭이 필요합니다.
Benjohn

1

컨센서스 문제를 살펴보십시오 . 작업 요구 사항 (데이터 보유량, 동기화 노드 수, 빈도 등)에 따라 해당 문제에 대한 기존 솔루션 (예 : "래프트")이 사례에 적합 할 수 있습니다.

이 문제에 대한 또 다른 (접선 형) 접근 방식은 CRDT를 설계하는 입니다.


Braid HTTPHTTP 기능 보강을 통해 CRDT 기반 상태 동기화 프로토콜을 작성하려고합니다. Time DAG와 Space DAG에 대한 훌륭한 시각화와이 두 개념이 어떻게 관련되어 최종 일관성에 도달하는지 보여줍니다.
Duane J

-1

Aleph 프로토콜은 합의에 의해 분산 된 트랜잭션 세트 (또는 이벤트)의 DAG를 구축하는 p2p 리더리스 프로토콜입니다.

https://arxiv.org/pdf/1908.05156


참조 된 프로토콜이 원래 질문에 의해 제기 된 요점을 어떻게 처리하는지 보여 주려면 답을 확장해야합니다. 모든 사람이이 질문에 도움이되므로 답변을 자급 자족하는 것이 중요합니다.
BobDalgleish
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.