다음을 통해 공유


곡물 디렉토리 구현

개요 및 아키텍처

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

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

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

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

분산된 곡물 디렉터리

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

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

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

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

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

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

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

분할 전략

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

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

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

변경 절차 보기

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

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

  • 새 사일로가 클러스터에 조인된 경우 기존 파티션이 축소되어 공간을 확보할 수 있습니다.
  • 사일로가 클러스터를 떠난 경우, 남은 파티션이 고아가 된 범위를 차지하기 위해 확장될 수 있습니다.

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

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

복구 프로세스

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

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

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

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

향후 클러스터 멤버 자격 개선은 모든 사일로에서 모든 보기를 볼 수 있도록 하여 이러한 시나리오를 줄이거나 제거할 수 있습니다.