다음을 통해 공유


곡물 디렉토리 구현

개요 및 아키텍처

Orleans 내의 그레인 디렉터리는 키가 그레인 식별자이고 값이 (잠재적으로) 그레인을 호스팅하는 활성 사일로를 가리키는 등록 항목인 키-값 저장소입니다.

Orleans 기본 메모리 내 분산 디렉터리 구현(이 문서에서 설명)을 제공하지만, 그레인 디렉터리 시스템은 플러그형으로 설계되었습니다. 인터페이스를 구현하고 IGrainDirectory 사일로의 서비스 컬렉션에 등록하여 자신만의 디렉터리를 구현할 수 있습니다. 이렇게 하면 다른 스토리지 백 엔드 또는 일관성 모델을 사용하여 특정 애플리케이션 요구 사항에 더 잘 맞는 사용자 지정 디렉터리 구현을 수행할 수 있습니다. 새로운 강력한 일관성 디렉터리가 도입된 이후 외부 디렉터리 구현에 대한 필요성은 적지만 API는 이전 버전과의 호환성과 유연성을 위해 유지됩니다. 곡물 유형별로 곡물 디렉터리를 구성할 수 있습니다.

성능을 Orleans 최적화하기 위해 각 사일로 내에서 로컬로 디렉터리 조회를 캐시합니다. 즉, 로컬 캐시 항목이 없거나 잘못된 경우에만 잠재적으로 원격 디렉터리 읽기가 필요합니다. 이 캐싱 메커니즘은 그레인 위치 조회와 관련된 네트워크 오버헤드와 지연 시간을 줄입니다.

원래 Orleans 분산 해시 테이블로 구조화된 최종적으로 일관된 디렉터리를 구현했습니다. 이는 2단계 Orleans을 기반으로 v9.0에서 매우 일관된 디렉터리로 대체되었습니다. 또한 분산 해시 테이블로 구성되지만 가상 노드를 통한 향상된 부하 분산을 제공합니다. 이 문서에서는 후자의 최신 곡물 디렉터리 구현에 대해 설명합니다.

분산된 곡물 디렉터리

Orleans 분산된 곡물 디렉터리는 강력한 일관성을 제공하며, 부하 분산, 고성능 및 내결함성을 갖추고 있습니다. 구현은 Vertical Paxos유사한 가상 동기화 방법론 기반으로 하는 2단계 디자인을 따릅니다.

디렉터리 파티션에는 두 가지 작업 모드가 있습니다.

  1. 일반 작업: 파티션은 다른 호스트와 조정하지 않고 로컬로 요청을 처리합니다.
  2. 변경 내용 보기: 호스트는 서로 조정하여 디렉터리 범위의 소유권을 이전합니다.

디렉터리는 Orleans의 '강력한 일관성 클러스터 멤버십 시스템'을 활용합니다. 이 시스템에서 "뷰"라고 불리는 구성은 버전 번호가 단조롭게 증가합니다. 사일로가 클러스터에 합류하고 탈퇴할 때, 연속적인 뷰가 생성되어 범위 소유권이 변경됩니다.

모든 디렉터리 작업에는 뷰 조정이 포함됩니다.

  • 요청은 호출자의 뷰 번호를 전달합니다.
  • 응답에는 파티션의 뷰 번호가 포함되었습니다.
  • 번호 불일치가 동기화를 트리거합니다.
  • 요청은 보기 변경 시 자동으로 재시도됩니다.

이렇게 하면 디렉터리 파티션의 올바른 소유자가 모든 요청을 처리합니다.

분할 전략

디렉터리는 클러스터의 활성 사일로에 할당된 범위와 일관된 해시 링을 사용하여 분할됩니다. 곡물 식별자는 해시 처리되어 해당 해시에 맞는 고리의 구역을 소유하는 사일로를 찾습니다.

각 활성 사일로는 미리 구성된 범위 수를 소유하며, 기본값은 사일로당 30개 범위입니다. 이는 Amazon DynamoApache Cassandra에서 사용하는 체계와 유사하며, 각 실제 노드(호스트)에 대해 여러 "가상 노드"(범위)가 만들어집니다.

파티션의 크기는 해당 해시와 다음 파티션의 해시 사이의 거리에 따라 결정됩니다. 뷰 변경 시 범위가 여러 사일로로 분할될 수 있습니다. 이렇게 하면 각 파티션이 잠재적으로 다른 여러 파티션과 조정되어야 하므로 보기 변경 프로시저가 복잡해집니다.

변경 절차 보기

디렉터리 파티션(GrainDirectoryPartition구현)은 버전이 지정된 범위 잠금을 사용하여 보기 변경 중에 범위에 대한 잘못된 액세스를 방지합니다. 범위 잠금은 보기 변경 중에 만들어지고 보기 변경이 완료되면 해제됩니다. 이러한 잠금은 가상 동기화 방법론에 사용되는 '웨지'와 유사합니다.

보기 변경이 발생하면 파티션이 증가하거나 축소할 수 있습니다.

  • 새 사일로가 클러스터에 조인되면 기존 파티션이 축소하여 공간을 확보할 수 있습니다.
  • 사일로가 클러스터에서 나가면 남은 파티션이 고아가 된 범위를 인수할 수 있도록 확장될 수 있습니다.

요청을 처리하려면 먼저 디렉터리 등록을 이전 소유자에서 새 소유자로 이전해야 합니다. 전송 프로세스는 다음 단계를 수행합니다.

  1. 이전 소유자는 범위를 봉인하고 해당 디렉터리 항목의 스냅샷을 만듭니다.
  2. 새 소유자가 스냅샷을 요청하고 적용합니다.
  3. 새 소유자가 범위에 대한 요청을 처리하기 시작합니다.
  4. 이전 소유자에게 알림을 받고 스냅샷을 삭제합니다.

복구 프로세스

호스트가 해당 디렉터리 파티션을 제대로 전달하지 않고 충돌하는 경우 후속 파티션 소유자는 복구를 수행해야 합니다. 여기에는 다음이 포함됩니다.

  1. 클러스터의 모든 활성 사일로에서 그레인 등록을 쿼리합니다.
  2. 영향을 받는 범위에 대한 디렉터리 상태를 다시 빌드합니다.
  3. 중복된 곡물 활성화가 발생하지 않도록 합니다.

클러스터 멤버 자격이 빠르게 변경되는 경우에도 복구가 필요합니다. 클러스터 멤버 자격은 단조성을 보장하지만 사일로가 중간 멤버 자격 보기를 놓칠 수 있습니다. 이러한 경우:

  • 스냅샷 전송은 중단됩니다.
  • 복구는 일반 파티션-파티션 인계 대신 수행됩니다.
  • 시스템은 중간 상태가 누락되었음에도 불구하고 일관성을 유지합니다.

클러스터 멤버 자격의 향후 개선은 모든 사일로가 모든 보기를 볼 수 있도록 함으로써 이러한 상황을 줄이거나 없앨 수 있습니다.