최종 일관성에 사용할 머클 트리 설명


79

머클 트리는 여러 분산 복제 된 키 / 값 저장소에서 안티 엔트로피 메커니즘으로 사용됩니다.

안티 엔트로피 메커니즘은 좋은 일입니다. 일시적인 오류는 프로덕션에서 발생합니다. Merkle Trees 가 대중적인 접근 방식 인 이유를 잘 모르겠습니다 .

  • 완전한 Merkle 트리를 피어에게 전송하는 것은 각 키 값의 해시와 함께 해당 피어에 로컬 키 공간을 전송하고 트리의 최하위 레벨에 저장된 것을 포함합니다.

  • 피어에서 보낸 Merkle 트리를 비교하려면 자체 Merkle 트리가 있어야합니다.

두 피어 모두 이미 정렬 된 키 / 값-해시 공간이 있어야하므로 불일치를 감지하기 위해 선형 병합을 수행하지 않는 이유는 무엇입니까?

나는 유지 비용을 고려할 때 트리 구조가 어떤 종류의 절감을 제공한다고 확신하지 못하며 , 트리 잎에 대한 선형 통과는 이미 와이어를 통해 표현을 직렬화하기 위해 수행되고 있습니다.

이를 해결하기 위해 스트로 맨 대안은 노드가 해시 다이제스트 배열을 교환하도록하는 것일 수 있으며, 이는 모듈로 링 위치에 의해 점진적으로 업데이트되고 버킷 화됩니다.

내가 무엇을 놓치고 있습니까?


2
해시 트리 지금은 위키 백과에 자신의 주제를 가지고 : en.wikipedia.org/wiki/Merkle_tree
트 렌턴

답변:


88

머클 트리는 동기화 할 때 전송되는 데이터의 양을 제한합니다. 일반적인 가정은 다음과 같습니다.

  1. 네트워크 I / O는 로컬 I / O + 해시 계산보다 비쌉니다.
  2. 정렬 된 전체 키 공간을 전송하는 것은 여러 단계에 걸쳐 비교를 점진적으로 제한하는 것보다 더 비쌉니다.
  3. 키 공간은 유사점보다 불일치가 적습니다.

머클 트리 교환은 다음과 같습니다.

  1. 트리의 루트 (해시 값 목록)로 시작합니다.
  2. 오리진은 현재 수준의 해시 목록을 보냅니다.
  3. 대상은 해시 목록을 자신과 비교 한 다음 다른 하위 트리를 요청합니다. 차이가 없으면 요청이 종료 될 수 있습니다.
  4. 리프 노드에 도달 할 때까지 2 단계와 3 단계를 반복합니다.
  5. 오리진은 결과 집합의 키 값을 보냅니다.

일반적인 경우 키 공간 동기화의 복잡성은 log (N)입니다. 예, 공통된 키가없는 극단적 인 경우 작업은 전체 정렬 된 해시 목록 O (N)을 보내는 것과 동일합니다. 쓰기가 들어올 때 동적으로 빌드하고 직렬화 된 양식을 디스크에 유지함으로써 Merkle 트리를 빌드하는 비용을 상각 할 수 있습니다.

Dynamo 또는 Cassandra가 Merkle 트리를 사용하는 방법에 대해서는 말할 수 없지만 Riak은 클러스터 내 동기화를 위해 사용을 중단했습니다 (대부분의 경우 핸드 오프 및 읽기 복구만으로 충분 함). 일부 내부 아키텍처 비트가 변경된 후 나중에 다시 추가 할 계획입니다.

Riak에 대한 자세한 내용은 다음 메일 링리스트에 가입하는 것이 좋습니다. http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com


1
아, 앞뒤 교환은 내가 놓친 것입니다. 감사.
Johnny Graettinger 2011

4
Riak 1.3의 AAE 구현에서 다시 도입되었습니다.
Coderoshi 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.