대규모 부하 설계를 위한 Filecoin 인덱서 확장 솔루션

FilecoinNetwork
2023-04-07 18:03:03
수집
현재 확장 과정에서 가장 시급한 목표는 증가하는 유입 부하를 처리하는 것입니다.

출처:Filecoin Network

이 글에서는 대량으로 유입되는 인덱스 부하를 인덱서 노드로 구성된 인덱스 풀에 분산시키는 간단한 전략을 설명합니다. 동시에 이 인덱스 풀은 확장성을 갖추게 됩니다.

인덱서 확장의 최종 목표는 10\^{15}개의 인덱스입니다. 이는 저장 데이터의 바이트 크기가 아니라 저장할 인덱스의 수를 의미합니다. 하나의 인덱스는 실제로 CID 식별자와 콘텐츠 제공자 데이터 간의 관계를 설명하는 매핑 그래프입니다. 실제 데이터 규모는 이보다 훨씬 클 것입니다. 현재 우리는 약 10\^{12}개의 인덱스를 처리할 수 있으며, 시간이 지남에 따라 일련의 단계를 통해 최종 확장 목표로 나아갈 것입니다.

현재 대부분의 인덱스 부하는 유입되는 인덱스 데이터로 구성되어 있습니다. 추가된 데이터는 단일 인덱서가 감당할 수 있는 범위(속도와 수량)를 초과할 수 있으며, 이는 급속히 증가하고 있습니다. 따라서 현재 확장 과정에서 가장 시급한 목표는 증가하는 유입 부하를 처리하는 것입니다.

방안: 인덱스 유입을 처리하는 간단한 전략

데이터 유입

인덱서는 특정 발행자로부터 "announce" 메시지를 수신하여 새로운 인덱스 데이터 광고가 있음을 알리면 데이터 유입이 발생합니다. 이에 대한 응답으로 해당 인덱서는 발행자로부터 아직 검색되지 않은 모든 인덱스 데이터를 검색합니다. 발행자 수가 증가함에 따라, 어느 시점에서는 단일 인덱서 노드가 새로운 인덱스 데이터 발행 속도를 따라잡을 수 없게 되며, 이러한 데이터를 모두 저장할 충분한 저장 공간이 없을 수도 있습니다.

유입 부하 분산

인덱서 확장은 혼잡한 부하를 처리하기 위한 간단한 전략에 기반하고 있습니다. 즉, 유입되는 인덱스 부하를 인덱서 노드로 구성된 인덱스 풀에 분산시켜 용량 요구에 따라 노드를 추가할 수 있으며, 데이터를 이동하여 균형을 재조정할 필요가 없습니다. 먼저 서로 다른 콘텐츠 발행자를 서로 다른 인덱스 노드에 할당하여 각 노드가 유입 부하의 일부를 처리할 수 있도록 합니다. 이는 별도의 경량 서비스인 Assigner Service를 사용하여 구현되며, 이는 주요 인덱스 유입 경로의 일부가 아닙니다.

인덱서가 구성된 저장 한도에 도달하면 새로운 인덱스 데이터의 수용을 중단하고, 인덱스 풀의 다른 인덱서가 완전한 인덱서에 할당된 발행자로부터 데이터를 다시 수용합니다. 저장 용량과 유입 부하 분배 요구가 증가하면 풀에 더 많은 인덱서 노드가 추가됩니다.

이 확장 전략의 세 가지 주요 구성 요소는 다음과 같습니다:

  • 할당 서비스(Assigner Service): 발행자를 인덱서에 할당합니다.

  • 인덱서 동결 모드(Indexer Frozen Mode): 이 인덱서 운영 모드에서는 새로운 콘텐츠가 인덱싱되지 않습니다.

  • 발행자 작업 이관: 동결된 인덱서의 발행자 작업을 활성 인덱서에 재할당하여 동결 인덱서가 중단된 후 인덱스를 복구합니다.

이 글에서는 이러한 구성 요소를 간략하게 설명합니다. 더 많은 정보는 설계 문서설계 발표에서 확인할 수 있습니다.

확장 전략의 장단점

장점:

  • 더 적은 동기화 작업: 모든 인덱서가 모든 발행자와 동기화할 필요가 없습니다.

  • 메타데이터가 여러 인덱서에 중복 전송되지 않습니다(이는 키 샤딩과 유사합니다): 메타데이터는 제공자의 인덱서에서만 존재합니다.

  • 인덱서 간에 데이터가 공유되지 않습니다. 각 인덱서는 자신의 발행자 체인을 관리합니다.

  • 제공자를 확인하기 위해 광고를 읽을 필요가 없습니다(이는 제공자 샤딩과 유사합니다).

  • 인덱서는 서로 다른 저장 용량을 가질 수 있습니다.

  • 합의 메커니즘이 필요하지 않습니다.

  • 유입 부하를 재분배할 수 있으며, 인덱서 간에 데이터를 이동할 필요가 없습니다.

단점:

  • 불균형한 분배: 일부 발행자는 다른 발행자보다 더 많은 데이터를 인덱싱할 수 있습니다.

  • 쿼리 요청은 분산 및 병합이 필요합니다: 쿼리 요청은 모든 인덱서에 반복적으로 전송되며, 응답은 고객에게 전송되는 하나로 병합됩니다.

  • 제공자가 발행자를 변경하면 중복 인덱스가 발생할 수 있습니다(이는 제공자 샤딩과 다릅니다).

  • 인덱서를 추가해도 즉시 효과가 나타나지 않으며, 기존 인덱서가 저장 용량 한도에 도달해야 합니다.

이 방안의 전반적인 이점은 구현이 상대적으로 간단하며 혼잡한 확장의 제약을 제거할 수 있다는 것입니다.

할당 서비스(Assigner Service)

할당 서비스(AS)는 발행자를 구성된 인덱서 풀의 인덱서에 할당하는 역할을 합니다. 인덱서 풀에 대해 단일 인스턴스로 운영되며, 관리하는 인덱서가 있는 동일한 네트워크에서 실행됩니다. 하나의 인덱서는 하나의 할당 서비스의 인덱서 풀의 구성원으로만 작동할 수 있습니다.

새로운 발행자를 인덱서에 할당하는 것 외에도, 할당 서비스는 인덱서 노드가 동결 모드에 들어갔는지 감지하고, 동결된 인덱서에서 발행자를 비동결 인덱서로 재할당하는 역할을 합니다. 인덱스 서비스는 또한 gossip pubsub 채널을 통해 직접 HTTP 공지를 재발행하여 풀 내 모든 인덱서가 이러한 정보를 수신할 수 있도록 합니다.

몇 가지 가정에 기반하여, 할당 서비스는 단일 개인 배포에서 사용됩니다: 작업은 어떤 인덱서에게도 발송될 수 있으며, 모든 인덱서의 관리 API는 개인 네트워크(또는 유사한 보호된 네트워크)에서 실행되며, 서로 다른 참여자가 풀에 추가하거나 제거할 노드를 관리할 수 있는 방법이나 프로토콜이 설정되어 있지 않습니다.

image

발행자를 인덱서에 할당하기

인덱서는 특정 발행자로부터 "announce" 메시지를 수신하여 새로운 인덱스 데이터 광고가 있음을 알리면

할당 서비스는 gossip-sub 및 직접 HTTP 메시지를 수신하여 새로운 광고(advertisements)가 수신 가능하다는 것을 알립니다. 각 메시지에서 발행자 정보를 읽고 발행자가 필요한 인덱서에 할당되었는지 판단합니다. 만약 그렇지 않다면, 할당 서비스는 작업량이 가장 적은 인덱서를 선택하고 해당 발행자를 이 인덱서에 할당합니다. 작업이 할당된 후, 인덱서는 발행자로부터 공지를 수신하고 유입 데이터를 자체적으로 처리합니다.

인덱스 서비스는 오프라인 인덱서를 처리하며, 이를 통해 인덱서 풀에서 과도한 작업 할당을 피할 수 있습니다. 인덱스 서비스는 또한 특정 발행자를 특정 인덱서에 할당하는 구성 옵션을 지원합니다.

추가 읽기 자료:

  • 비영구 할당 상태(No Persisted Assignment State)(https://github.com/ipni/storetheindex/blob/main/doc/scaling-design-for-indest.md#no-persisted-assignment-state)란 인덱서가 언제든지 중단하거나 재시작할 수 있음을 의미합니다.

  • 인덱서 풀(An Indexer Pool)(https://github.com/ipni/storetheindex/blob/main/doc/scaling-design-for-indest.md#indexer-pool)은 특정 배포 내 인덱서 노드의 집합입니다.

  • 작업 복제(Assignment Replication)(https://github.com/ipni/storetheindex/blob/main/doc/scaling-design-for-indest.md#replication)은 발행자를 여러 인덱서에 할당하는 것입니다.

인덱서 동결 모드

인덱서는 구성 `FreezeAtPercent(\<``https://pkg.go.dev/github.com/ipni/storetheindex/config#Indexer`(https://pkg.go.dev/github.com/ipni/storetheindex/config#Indexer "https://pkg.go.dev/github.com/ipni/storetheindex/config#Indexer")`>)`의 제한에 도달하면 자동으로 "동결" 모드에 들어갑니다. 이 운영 모드에서는 인덱서가 새로운 인덱스 데이터를 저장하지 않지만, 인덱스 데이터의 업데이트나 삭제는 처리합니다. 동결된 인덱서는 새로운 발행자 작업을 수용하지 않습니다. 내부적으로 해당 인덱서는 읽은 각 광고 체인을 추적하여 광고(업데이트 및 제거 작업과 관련된)를 수용합니다. 인덱서는 인덱스 데이터에 대한 쿼리에 계속 응답합니다.

인덱서는 관리(admin) API를 통해 수동으로 동결할 수도 있습니다. 이는 인덱서의 저장 용량이 증가할 때까지 데이터를 수용하기 위해 일시적으로 동결하기 위함입니다(또는 할당 서비스를 사용할 수 있습니다). 이렇게 하면 지속적인 인덱스 작업이 다른 인덱서 노드에 의해 대체될 수 있습니다.

추가 읽기 자료:

  • 디스크 사용 모니터링(Disk Usage Monitoring)(https://github.com/ipni/storetheindex/blob/main/doc/scaling-design-for-indest.md#disk-usage-monitoring)은 각 인덱서가 담당합니다.

  • 동결 기능은 할당 서비스에 의존하지 않습니다(Freeze capability does not depend on AS)(https://github.com/ipni/storetheindex/blob/main/doc/scaling-design-for-indest.md#freeze-independent-of-assigner).

  • 동결 해제 기능(https://github.com/ipni/storetheindex/blob/main/doc/scaling-design-for-indest.md#unfreeze)은 인덱서가 인덱스 작업을 복구할 수 있게 합니다.

발행자 이관

할당 서비스는 정기적으로 인덱서를 통계적으로 조사하여, 특정 인덱서가 동결된 경우 해당 동결된 인덱서가 할당한 발행자를 다른 인덱서로 이관합니다. 활성 인덱서는 이전 동결 인덱서에서 수행한 작업을 계속 진행합니다. 이관 과정에서 활성 인덱서는 동결된 인덱서로부터 제공자 및 관련 추가 정보를 수신합니다.

할당 서비스는 어떤 인덱서가 발행자의 이관 작업을 수용할지를 결정합니다. 이는 새로운 발행자를 할당하는 논리와 동일합니다. 각 발행자의 이관 과정은 개별적으로 이 단계를 수행하여 동결된 인덱서의 작업이 풀 내의 사용 가능한 인덱서에 할당됩니다.

추가 읽기 자료:

  • 할당 서비스는 불완전한 이관 작업을 복구할 수 있습니다(https://github.com/ipni/storetheindex/blob/main/doc/scaling-design-for-indest.md#resuming-incomplete-handoff).

  • 발행자 데이터는 동결된 인덱서와 활성 인덱서 간에 분배됩니다.(https://github.com/ipni/storetheindex/blob/main/doc/scaling-design-for-indest.md#publisher-data-spread-across-frozen-and-active-indexers)

할당 서비스가 있는 인덱서 풀 설정

여기(https://github.com/ipni/storetheindex/blob/main/doc/assigner-deployment.md#setting-up-indexer-pool-with-assigner-service)에서는 할당 서비스가 있는 인덱서 풀을 설정하는 과정을 설명합니다. 다음 단계로 요약할 수 있습니다:

  • 인덱서 배포(Deploy Indexers)(https://github.com/ipni/storetheindex/blob/main/doc/assigner-deployment.md#deploy-indexers)

  • 할당 서비스 배포(Deploy Assigner Service)(https://github.com/ipni/storetheindex/blob/main/doc/assigner-deployment.md#deploy-assigner-service)

  • 필요에 따라 추가 인덱서 배포(Deploy additional Indexers as needed)(https://github.com/ipni/storetheindex/blob/main/doc/assigner-deployment.md#example-assigner-service-configuration)

여기에는 할당 서비스 구성 템플릿 파일(https://github.com/ipni/storetheindex/blob/main/doc/assigner-deployment.md#example-assigner-service-configuration)도 제공됩니다.

체인캐처(ChainCatcher)는 독자들에게 블록체인을 이성적으로 바라보고, 리스크 인식을 실제로 향상시키며, 다양한 가상 토큰 발행 및 조작에 경계해야 함을 상기시킵니다. 사이트 내 모든 콘텐츠는 시장 정보나 관련 당사자의 의견일 뿐이며 어떠한 형태의 투자 조언도 제공하지 않습니다. 만약 사이트 내에서 민감한 정보를 발견하면 “신고하기”를 클릭하여 신속하게 처리할 것입니다.
체인캐처 혁신가들과 함께하는 Web3 세상 구축