수집량이 많은 워크로드에 대한 인덱서 확장성
인덱서 규모의 최종 목표는 10^{15} 인덱스다. 저장된 데이터의 바이트가 아닌 저장된 인덱서의 숫자다. 인덱스는 콘텐츠 제공자 데이터로의 CID(콘텐츠 식별자) 맵이다. 실제 데이터의 양은 훨씬 크다. 현자 10^{12} 인덱스를 처리하고 있으며 앞으로 몇 단계 후에 최종 목표에 도달할 예정이다.
인덱싱 작업 대부분은 현제 인덱스 데이터 수집이 지배한다. 수신 데이터는 속도와 양 면에서 단일 인덱서가 처리할 수 있는 것보다 많을 수 있으며 빠르게 증가하고 있다. 따라서 확장 목표를 달성하기 위해 가장 시급한 것은 증가하는 수집 부하 처리다.
접근 방식: 인덱스 수집을 처리하기 위한 단순한 전략
데이터 수집
인덱스 데이터 수집은 인덱서가 게시자로부터 새 인덱스 데이터 광고의 사용 가능성을 알리는 '알림' 메시지를 수신하고 이에 대한 응답으로 인덱서가 게시자에서 아직 검색되지 않은 모든 인덱스 데이터를 검색할 때 발생한다. 게시자의 수가 증가함에 따라 어느 시점에서 새로운 데이터가 게시되는 속도를 단일 인덱서 노드가 따라잡을 수 없으며 모든 데이터를 저장하는 충분한 스토리지가 없게 된다.
수집 작업 분배
수집 워크로드를 처리하기 위한 인덱서 확장은 인덱서 풀을 통해 수집을 분산하는 간단한 전략을 기반으로 한다. 스토리지 균형을 재조정하기 위해 데이터를 이동할 필요 없이 추가 용량이 필요할 때 노드를 추가할 수 있다. 이 작업은 각 노드가 수집 작업의 별도 부분을 처리하도록 서로 다른 인덱서 노드에 서로 다른 컨텐츠 게시자를 할당하는 것으로 시작된다. 이 작업은 중요 인덱스 수집 경로에 속하지 않는 별도의 경량 할당자 서비스(Assigner Service)를 사용하여 수행된다.
인덱서가 설정된 스토리지 한계에 도달할 때 새로운 인덱스 데이터 수집을 멈추고 풀 내의 다른 인덱서는 전체 인덱서에 할당된 게시자로부터 데이터 수집을 재개한다. 더 많은 스토리지 용량 및 수집 작업 배분이 필요해지면서 더 많은 인덱서 노드가 풀에 추가된다.
확장성 전략의 세 가지 주요 구성 요소는 다음과 같다.
- 할당자 서비스: 인덱서에 게시자를 할당하는 서비스
- 인덱서 동결 모드: 새로운 콘텐츠가 인덱싱되지 않은 인덱서 운영 모드
- 게시자 배정 핸드오프: 동결된 인덱서가 멈춘 인덱싱을 재개하기 위해 동결된 인덱서에서 활성 인덱서르의 게시자 재할당
이 게시글은 해당 구성 요소를 요약한다. 설계 문서 및 설계 발표 슬라이드에서 더 자세한 정보를 볼 수 있다.
확장 전략의 장점 및 단점
장점:
- 동기화 감소: 모든 인덱서가 모든 게시자와 동기화할 필요 없음
- 다중 인덱서에 메타데이터가 복사되지 않음(키 조각화): 제공자를 처리하는 인덱서에만 메타데이터 존재
- 인덱서간의 데이터 공유 없음. 각각 고유한 게시자 체인 관리.
- 제공자만을 확인하기 위해 광고 읽을 필요 없음(제공자 조각화와 대비)
- 인덱서는 다양한 스토리지 용량을 가질 수 있음
- 컨센서스 필요 없음
- 인덱서 간의 데이터 이전 없이 수집 작업 재분배 가능
단점:
- 균일하지 않은 분배: 몇 게시자는 다른 게시자보다 더 많은 데이터를 인덱싱함
- 확산/수렴 쿼리 필요: 모든 인덱서에게 쿼리 복사, 반응은 클라이언트에게 단일 반응으로 합병
- 게시자를 바꾸는 제공자는 복사 인덱싱을 일으킴(제공자 조각화와는 반대)
- 기존 인덱서가 스토리지 한계에 도달하기 전까지 인덱서 추가는 효과가 없음
이 접근 방식의 전반적인 장점은 섭취 확장성의 한계를 제거하면서 구현이 비교적 간단하다는 점이다.
할당자 서비스
할당자 서비스(AS)는 인덱서의 설정된 풀에서 게시자를 인덱서에게 배정하는 데에 책임이 있다. AS는 할당을 관리하는 인덱서와 동일한 네트워크에서 인덱서 풀의 단일 인스턴스로 실행된다. 인덱서는 하나의 할당자 인덱서 풀의 멤버만 될 수 있다.
AS는 인덱서에 새 게시자를 할당하는 것 외에도 인덱서가 "동결" 모드로 전환된 경우를 감지하고 게시자를 동결된 인덱서에서 비동결 인덱서로 다시 할당하는 역할을 담당한다. 또한 AS는 가십 펍서브를 통해 직접 HTTP 공지사항을 다시 게시하여 풀의 모든 인덱서가 해당 공지사항을 수신할 수 있도록 한다.
AS는 모든 인덱서에 할당할 수 있고 모든 인덱서의 관리 API가 개인 네트워크에 있거나 유사하게 보호된다는 여러 가지 가정으로 인해 단일 개인 배포 내에서 사용된다, 풀에 추가되거나 풀에서 제거되는 노드를 서로 다른 당사자가 관리할 수 있는 확립된 수단이나 프로토콜이 없다.
인덱서에 게시자 할당
AS는 새로운 광고의 가용성을 알리는 가십섭(gossip-sub) 및 직접적인 HTTP 메시지를 듣는다. 각 메시지의 게시자를 읽어들이고 요구된 인덱서에 게시자가 이미 할당되었는지 확인한다. 미할당 상태라면 AS는 가장 적은 배정의 인덱서를 선택하고 해당 인덱서에 게시자를 할당한다. 할당 후에 인덱서는 게시자로부터 알림을 받고 자체적으로 수집을 처리한다.
AS는 인덱서 풀 내에서 과도하게 할당되지 않도록 오프라인 상태의 인덱서를 처리한다. AS는 특정 인덱서에 특정 게시자를 할당하는 것에 대한 환경 설정 옵션도 지원한다.
추가 자료:
- 지속되지 않는 배정 상태는 인덱서가 언제든 시작하고 멈출 수 있다는 것을 의미한다.
- 인덱서 풀은 단일 배포의 인덱서 노드 집합이다.
- 할당 복사는 게시자를 다중 인덱서에게 할당한다.
인덱서 동결 모드
인덱서의 스토리지 사용량이 설정된 한계 [FreezeAtPercent](<https://pkg.go.dev/github.com/ipni/storetheindex/config#Indexer>)에 도달할 때 인덱서는 자동적으로 '동결' 모드에 진입한다. 이 모드는 인덱서가 새로운 데이터를 저장하지 않지만, 인덱스 데이터의 업데이트 및 삭제는 진행하는 운영 모드다. 동결된 인덱서는 새로운 게시자 할당을 수락하지 않는다. 인덱서는 각 광고 체인에서 업데이트 및 제거 광고를 수집하기 위해 읽은 위치를 내부적으로 추적한다. 인덱서는 인덱스 데이터에 대한 쿼리에 계속 응답한다.
인덱서는 또한 관리 API를 사용하여 수동적으로 동결할 수 있다. 이 작업은 인덱서의 저장 용량이 증가할 때까지 또는 AS를 사용할 경우 다른 인덱서 노드에서 계속 인덱싱을 수행할 수 있도록 수집을 중지하기 위해 수행할 수 있다.
추가 자료:
- 디스크 사용량 모니터링은 각 인덱서가 수행한다.
- 동결 기능은 AS에 의존하지 않는다.
- 활성화 기능은 인덱서가 인덱싱을 재개하게 한다.
게시자 핸드오프
AS는 정기적으로 인덱서를 조사하고 인덱서가 동결된 것으로 확인되면 동결된 인덱서에 할당된 각 게시자에 대해 핸드오프를 수행한다. 핸드오프는 게시자가 다른 인덱서에 다시 할당되어 활성 인덱서에서 인덱싱이 계속되는 방식으로 중단된 인덱서에서 인덱싱이 계속되게 한다. 핸드오프 중에 활성 인덱서는 중단된 인덱서에서 공급자 및 확장 공급자 정보도 가져온다.
AS는 새 게시자를 할당할 위치를 결정할 때와 동일한 논리를 사용하여 게시자를 넘겨줄 인덱서에 대한 결정을 내린다. 이 작업은 각 게시자에 대해 개별적으로 수행되므로 고정 인덱서의 할당이 풀의 사용 가능한 인덱서에 재배포된다.
추가 자료:
할당자 서비스를 사용하여 인덱서 풀 설정
여기에서는 인덱서 풀을 할당자 서비스와 함께 배포하는 단계에 대해 설명한다. 다음 단계를 요약한다:
샘플 AS 구성 파일도 제공된다.
더욱 다양한 정보 및 방송 관련 소식은
공식 SNS 채널을 통해 확인 가능합니다.